package problem import ( "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/model" "git.0x7f.app/WOJ/woj-server/internal/service/problem" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/gin-gonic/gin" "github.com/jackc/pgtype" ) type updateRequest struct { Pid uint `form:"pid" json:"pid"` Title string `form:"title" json:"title"` Statement string `form:"statement" json:"statement"` Tags []string `form:"tags" json:"tags"` IsEnabled bool `form:"is_enabled" json:"is_enabled"` } // Update // @Summary [admin] create or update a problem // @Description Create or update a problem. // @Tags problem,admin // @Accept application/x-www-form-urlencoded // @Produce json // @Param pid formData int false "problem id, 0 for create" // @Param title formData string false "title" // @Param statement formData string false "statement" // @Param tags formData []string false "tags" // @Param is_enabled formData bool false "is enabled" // @Response 200 {object} e.Response[model.Problem] "problem info without provider information" // @Security Authentication // @Router /v1/problem/update [post] func (h *handler) Update(c *gin.Context) { claim, exist := c.Get("claim") if !exist { e.Pong[any](c, e.UserUnauthenticated, nil) return } uid := claim.(*model.Claim).UID role := claim.(*model.Claim).Role // only admin can modify problem if role < model.RoleAdmin { e.Pong[any](c, e.UserUnauthorized, nil) return } req := new(updateRequest) if err := c.ShouldBind(req); err != nil { e.Pong(c, e.InvalidParameter, err.Error()) return } if req.Pid == 0 { // create problem // Title and Statement are required if req.Title == "" || req.Statement == "" { e.Pong[any](c, e.InvalidParameter, nil) return } createData := &problem.CreateData{ Title: req.Title, Statement: req.Statement, Tags: req.Tags, ProviderID: uid, IsEnabled: false, } p, status := h.problemService.Create(createData) e.Pong(c, status, p) return } else { // update problem // check if problem exists p, status := h.problemService.Query(&problem.QueryData{ID: req.Pid, Associations: true, ShouldEnable: false}) if status != e.Success { e.Pong[any](c, status, nil) return } // check if user is the provider of the problem if p.ProviderID != uid { e.Pong[any](c, e.UserUnauthorized, nil) return } // if IsEnabled is set to true, check if the problem has a latest version if req.IsEnabled { _, status := h.problemService.QueryLatestVersion(p.ID) if status != e.Success { e.Pong[any](c, status, nil) return } p.IsEnabled = true } // update problem p.Title = utils.If(req.Title != "", req.Title, p.Title) p.Statement = utils.If(req.Statement != "", req.Statement, p.Statement) if len(req.Tags) != 0 { tags := pgtype.TextArray{} _ = tags.Set(req.Tags) p.Tags = tags } p, status = h.problemService.Update(p) e.Pong(c, status, p) return } }