Skip to content

Commit 53617be

Browse files
committed
feat(controllers/reward.SetComment): init
1 parent fdf8fb7 commit 53617be

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

internal/controllers/reward.go

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ import (
99
func RewardRoutes(r fiber.Router) {
1010
route := r.Group("/reward")
1111
route.Get("/ranklist", reward.Ranklist)
12+
route.Post("/set/:id", reward.SetComment)
1213
}
+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package reward
2+
3+
import (
4+
"coursebench-backend/internal/middlewares/session"
5+
"coursebench-backend/pkg/database"
6+
"coursebench-backend/pkg/errors"
7+
"coursebench-backend/pkg/models"
8+
"coursebench-backend/pkg/queries"
9+
"strconv"
10+
11+
"github.com/gofiber/fiber/v2"
12+
"gorm.io/gorm"
13+
)
14+
15+
type SetCommentRequest struct {
16+
Reward int `json:"reward"`
17+
}
18+
19+
func SetComment(c *fiber.Ctx) error {
20+
c.Accepts("application/json")
21+
var request SetCommentRequest
22+
if err := c.BodyParser(&request); err != nil {
23+
return errors.Wrap(err, errors.InvalidArgument)
24+
}
25+
26+
idRaw := c.Params("id", "GG")
27+
id, err := strconv.Atoi(idRaw)
28+
if err != nil {
29+
return errors.New(errors.InvalidArgument)
30+
}
31+
32+
uid, err := session.GetUserID(c)
33+
if err != nil {
34+
uid = 0
35+
}
36+
37+
db := database.GetDB()
38+
user, err := queries.GetUserByID(db, uid)
39+
if err != nil {
40+
return errors.Wrap(err, errors.DatabaseError)
41+
}
42+
if !(user.IsCommunityAdmin || user.IsAdmin) {
43+
return errors.New(errors.PermissionDenied)
44+
}
45+
46+
comment := &models.Comment{}
47+
result := db.First(&comment, id)
48+
if result.Error != nil {
49+
return errors.Wrap(result.Error, errors.DatabaseError)
50+
}
51+
52+
comment.User.Reward -= comment.Reward
53+
comment.Reward = request.Reward
54+
comment.User.Reward += comment.Reward
55+
56+
if err := db.Transaction(func(tx *gorm.DB) error {
57+
if err := tx.Save(comment).Error; err != nil {
58+
return err
59+
}
60+
if err := tx.Save(user).Error; err != nil {
61+
return err
62+
}
63+
return nil
64+
}); err != nil {
65+
return errors.Wrap(err, errors.DatabaseError)
66+
}
67+
68+
return c.Status(fiber.StatusOK).JSON(models.OKResponse{
69+
Error: false,
70+
})
71+
}

0 commit comments

Comments
 (0)