package auth import ( "encoding/json" "io" "net/http" "gitea.konchin.com/ytshih/inp2025/middlewares" "gitea.konchin.com/ytshih/inp2025/models" "gitea.konchin.com/ytshih/inp2025/utils" "github.com/uptrace/bunrouter" ) type PostRegisterInput struct { Username string `json:"username"` Password string `json:"password"` } func (self *Handlers) PostRegister( w http.ResponseWriter, req bunrouter.Request, ) error { ctx := req.Context() b, err := io.ReadAll(req.Body) if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "failed to read body payload", OriginError: err, } } var input PostRegisterInput if err := json.Unmarshal(b, &input); err != nil { return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "failed to unmarshal json", OriginError: err, } } user := models.User{ Username: input.Username, Password: input.Password, LoginCount: 0, } res, err := self.db.NewInsert(). Model(&user). On("CONFLICT (username) DO NOTHING"). Exec(ctx) if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusInternalServerError, Message: "failed to insert user", OriginError: err, } } if cnt, err := res.RowsAffected(); err != nil || cnt == 0 { if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusInternalServerError, Message: "failed to get affected row count", OriginError: err, } } if cnt == 0 { return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "username already exist", } } } return utils.Success(w) }