Skip to content

Commit eeb5f94

Browse files
committed
fix(answer): fix incorrect notification triggers when accept the answer
1 parent 9337f69 commit eeb5f94

6 files changed

Lines changed: 57 additions & 62 deletions

File tree

internal/controller/answer_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,11 @@ func (ac *AnswerController) AnswerList(ctx *gin.Context) {
319319
// @Accept json
320320
// @Produce json
321321
// @Security ApiKeyAuth
322-
// @Param data body schema.AnswerAcceptedReq true "AnswerAcceptedReq"
322+
// @Param data body schema.AcceptAnswerReq true "AcceptAnswerReq"
323323
// @Success 200 {string} string ""
324324
// @Router /answer/api/v1/answer/acceptance [post]
325325
func (ac *AnswerController) Accepted(ctx *gin.Context) {
326-
req := &schema.AnswerAcceptedReq{}
326+
req := &schema.AcceptAnswerReq{}
327327
if handler.BindAndCheck(ctx, req) {
328328
return
329329
}
@@ -341,7 +341,7 @@ func (ac *AnswerController) Accepted(ctx *gin.Context) {
341341
return
342342
}
343343

344-
err = ac.answerService.UpdateAccepted(ctx, req)
344+
err = ac.answerService.AcceptAnswer(ctx, req)
345345
handler.HandleResponse(ctx, err, nil)
346346
}
347347

internal/repo/activity/answer_repo.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ func (ar *AnswerActivityRepo) SaveAcceptAnswerActivity(ctx context.Context, op *
5555
return nil
5656
}
5757

58-
ar.data.DB.ShowSQL(true)
5958
// save activity
6059
_, err = ar.data.DB.Transaction(func(session *xorm.Session) (result any, err error) {
6160
session = session.Context(ctx)
@@ -331,7 +330,7 @@ func (ar *AnswerActivityRepo) sendAcceptAnswerNotification(
331330
ObjectID: op.AnswerObjectID,
332331
}
333332
if act.ActivityUserID != op.QuestionUserID {
334-
msg.TriggerUserID = op.QuestionUserID
333+
msg.TriggerUserID = op.TriggerUserID
335334
msg.ObjectType = constant.AnswerObjectType
336335
msg.NotificationAction = constant.NotificationAcceptAnswer
337336
ar.notificationQueueService.Send(ctx, msg)

internal/repo/answer/answer_repo.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -166,30 +166,29 @@ func (ar *answerRepo) GetAnswerPage(ctx context.Context, page, pageSize int, ans
166166
return
167167
}
168168

169-
// UpdateAccepted
170-
// If no answer is selected, the answer id can be 0
171-
func (ar *answerRepo) UpdateAccepted(ctx context.Context, id string, questionID string) error {
172-
if questionID == "" {
173-
return nil
174-
}
175-
id = uid.DeShortID(id)
169+
// UpdateAcceptedStatus update all accepted status of this question's answers
170+
func (ar *answerRepo) UpdateAcceptedStatus(ctx context.Context, acceptedAnswerID string, questionID string) error {
171+
acceptedAnswerID = uid.DeShortID(acceptedAnswerID)
176172
questionID = uid.DeShortID(questionID)
177-
var data entity.Answer
178-
data.ID = id
179173

180-
data.Accepted = schema.AnswerAcceptedFailed
181-
_, err := ar.data.DB.Context(ctx).Where("question_id =?", questionID).Cols("adopted").Update(&data)
174+
// update all this question's answer accepted status to false
175+
_, err := ar.data.DB.Context(ctx).Where("question_id = ?", questionID).Cols("adopted").Update(&entity.Answer{
176+
Accepted: schema.AnswerAcceptedFailed,
177+
})
182178
if err != nil {
183-
return err
179+
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
184180
}
185-
if id != "0" {
186-
data.Accepted = schema.AnswerAcceptedEnable
187-
_, err = ar.data.DB.Context(ctx).Where("id = ?", id).Cols("adopted").Update(&data)
181+
182+
// if acceptedAnswerID is not empty, update accepted status to true
183+
if len(acceptedAnswerID) > 0 && acceptedAnswerID != "0" {
184+
_, err = ar.data.DB.Context(ctx).Where("id = ?", acceptedAnswerID).Cols("adopted").Update(&entity.Answer{
185+
Accepted: schema.AnswerAcceptedEnable,
186+
})
188187
if err != nil {
189188
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
190189
}
191190
}
192-
_ = ar.updateSearch(ctx, id)
191+
_ = ar.updateSearch(ctx, acceptedAnswerID)
193192
return nil
194193
}
195194

internal/schema/answer_schema.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,19 @@ type AdminAnswerInfo struct {
108108
} `json:"question_info"`
109109
}
110110

111-
type AnswerAcceptedReq struct {
112-
QuestionID string `json:"question_id"`
113-
AnswerID string `json:"answer_id"`
111+
type AcceptAnswerReq struct {
112+
QuestionID string `validate:"required,gt=0,lte=30" json:"question_id"`
113+
AnswerID string `validate:"omitempty" json:"answer_id"`
114114
UserID string `json:"-"`
115115
}
116116

117+
func (req *AcceptAnswerReq) Check() (errFields []*validator.FormErrorField, err error) {
118+
if len(req.AnswerID) == 0 {
119+
req.AnswerID = "0"
120+
}
121+
return nil, nil
122+
}
123+
117124
type AdminSetAnswerStatusRequest struct {
118125
StatusStr string `json:"status"`
119126
AnswerID string `json:"answer_id"`

internal/service/answer_common/answer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type AnswerRepo interface {
1717
GetAnswer(ctx context.Context, id string) (answer *entity.Answer, exist bool, err error)
1818
GetAnswerList(ctx context.Context, answer *entity.Answer) (answerList []*entity.Answer, err error)
1919
GetAnswerPage(ctx context.Context, page, pageSize int, answer *entity.Answer) (answerList []*entity.Answer, total int64, err error)
20-
UpdateAccepted(ctx context.Context, id string, questionID string) error
20+
UpdateAcceptedStatus(ctx context.Context, acceptedAnswerID string, questionID string) error
2121
GetByID(ctx context.Context, id string) (*entity.Answer, bool, error)
2222
GetCountByQuestionID(ctx context.Context, questionID string) (int64, error)
2323
GetCountByUserID(ctx context.Context, userID string) (int64, error)

internal/service/answer_service.go

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -325,65 +325,55 @@ func (as *AnswerService) Update(ctx context.Context, req *schema.AnswerUpdateReq
325325
return insertData.ID, nil
326326
}
327327

328-
// UpdateAccepted
329-
func (as *AnswerService) UpdateAccepted(ctx context.Context, req *schema.AnswerAcceptedReq) error {
330-
if req.AnswerID == "" {
331-
req.AnswerID = "0"
332-
}
333-
if req.UserID == "" {
334-
return nil
335-
}
336-
337-
newAnswerInfo := &entity.Answer{}
338-
newAnswerInfoexist := false
339-
var err error
340-
341-
if req.AnswerID != "0" {
342-
newAnswerInfo, newAnswerInfoexist, err = as.answerRepo.GetByID(ctx, req.AnswerID)
343-
if err != nil {
344-
return err
345-
}
346-
newAnswerInfo.ID = uid.DeShortID(newAnswerInfo.ID)
347-
if !newAnswerInfoexist {
348-
return errors.BadRequest(reason.AnswerNotFound)
349-
}
350-
}
351-
328+
// AcceptAnswer accept answer
329+
func (as *AnswerService) AcceptAnswer(ctx context.Context, req *schema.AcceptAnswerReq) (err error) {
330+
// find question
352331
questionInfo, exist, err := as.questionRepo.GetQuestion(ctx, req.QuestionID)
353332
if err != nil {
354333
return err
355334
}
356-
questionInfo.ID = uid.DeShortID(questionInfo.ID)
357335
if !exist {
358336
return errors.BadRequest(reason.QuestionNotFound)
359337
}
360-
// if questionInfo.UserID != req.UserID {
361-
// return fmt.Errorf("no permission to set answer")
362-
// }
338+
questionInfo.ID = uid.DeShortID(questionInfo.ID)
363339
if questionInfo.AcceptedAnswerID == req.AnswerID {
364340
return nil
365341
}
366342

367-
var oldAnswerInfo *entity.Answer
368-
if len(questionInfo.AcceptedAnswerID) > 0 && questionInfo.AcceptedAnswerID != "0" {
369-
oldAnswerInfo, _, err = as.answerRepo.GetByID(ctx, questionInfo.AcceptedAnswerID)
343+
// find answer
344+
var acceptedAnswerInfo *entity.Answer
345+
if len(req.AnswerID) > 1 {
346+
acceptedAnswerInfo, exist, err = as.answerRepo.GetByID(ctx, req.AnswerID)
370347
if err != nil {
371348
return err
372349
}
373-
oldAnswerInfo.ID = uid.DeShortID(oldAnswerInfo.ID)
350+
if !exist {
351+
return errors.BadRequest(reason.AnswerNotFound)
352+
}
353+
acceptedAnswerInfo.ID = uid.DeShortID(acceptedAnswerInfo.ID)
374354
}
375355

376-
err = as.answerRepo.UpdateAccepted(ctx, req.AnswerID, req.QuestionID)
377-
if err != nil {
356+
// update answers status
357+
if err = as.answerRepo.UpdateAcceptedStatus(ctx, req.AnswerID, req.QuestionID); err != nil {
378358
return err
379359
}
380360

361+
// update question status
381362
err = as.questionCommon.UpdateAccepted(ctx, req.QuestionID, req.AnswerID)
382363
if err != nil {
383364
log.Error("UpdateLastAnswer error", err.Error())
384365
}
385366

386-
as.updateAnswerRank(ctx, req.UserID, questionInfo, newAnswerInfo, oldAnswerInfo)
367+
var oldAnswerInfo *entity.Answer
368+
if len(questionInfo.AcceptedAnswerID) > 1 {
369+
oldAnswerInfo, _, err = as.answerRepo.GetByID(ctx, questionInfo.AcceptedAnswerID)
370+
if err != nil {
371+
return err
372+
}
373+
oldAnswerInfo.ID = uid.DeShortID(oldAnswerInfo.ID)
374+
}
375+
376+
as.updateAnswerRank(ctx, req.UserID, questionInfo, acceptedAnswerInfo, oldAnswerInfo)
387377
return nil
388378
}
389379

@@ -398,9 +388,9 @@ func (as *AnswerService) updateAnswerRank(ctx context.Context, userID string,
398388
log.Error(err)
399389
}
400390
}
401-
if newAnswerInfo.ID != "" {
391+
if newAnswerInfo != nil {
402392
err := as.answerActivityService.AcceptAnswer(ctx, userID, newAnswerInfo.ID,
403-
questionInfo.ID, questionInfo.UserID, newAnswerInfo.UserID, newAnswerInfo.UserID == userID)
393+
questionInfo.ID, questionInfo.UserID, newAnswerInfo.UserID, newAnswerInfo.UserID == questionInfo.UserID)
404394
if err != nil {
405395
log.Error(err)
406396
}

0 commit comments

Comments
 (0)