From dd4b706ab4c1148a6d77c5baf012c00cd7246ee3 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Fri, 25 Aug 2023 17:26:14 +0800 Subject: [PATCH 1/3] fix(init): add user notification config when init #493 --- internal/migrations/init_data.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/migrations/init_data.go b/internal/migrations/init_data.go index 6add46297..12481d1a0 100644 --- a/internal/migrations/init_data.go +++ b/internal/migrations/init_data.go @@ -47,6 +47,7 @@ var ( &entity.UserRoleRel{}, &entity.PluginConfig{}, &entity.UserExternalLogin{}, + &entity.UserNotificationConfig{}, } roles = []*entity.Role{ From e75142a55546e01d8904f59db228422561f51666 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 29 Aug 2023 11:39:51 +0800 Subject: [PATCH 2/3] fix(answer): fix incorrect notification's triggerUserID when cancel accepted answer --- internal/base/middleware/auth.go | 2 +- internal/repo/activity/answer_repo.go | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/internal/base/middleware/auth.go b/internal/base/middleware/auth.go index 5532a479c..a51b44de6 100644 --- a/internal/base/middleware/auth.go +++ b/internal/base/middleware/auth.go @@ -126,7 +126,7 @@ func (am *AuthUserMiddleware) AdminAuth() gin.HandlerFunc { return } userInfo, err := am.authService.GetAdminUserCacheInfo(ctx, token) - if err != nil { + if err != nil || userInfo == nil { handler.HandleResponse(ctx, errors.Forbidden(reason.UnauthorizedError), nil) ctx.Abort() return diff --git a/internal/repo/activity/answer_repo.go b/internal/repo/activity/answer_repo.go index fa4aacd0b..02ae66f04 100644 --- a/internal/repo/activity/answer_repo.go +++ b/internal/repo/activity/answer_repo.go @@ -55,7 +55,6 @@ func (ar *AnswerActivityRepo) SaveAcceptAnswerActivity(ctx context.Context, op * return nil } - ar.data.DB.ShowSQL(true) // save activity _, err = ar.data.DB.Transaction(func(session *xorm.Session) (result any, err error) { session = session.Context(ctx) @@ -311,12 +310,11 @@ func (ar *AnswerActivityRepo) sendAcceptAnswerNotification( Type: schema.NotificationTypeAchievement, ObjectID: op.AnswerObjectID, ReceiverUserID: act.ActivityUserID, + TriggerUserID: act.TriggerUserID, } if act.ActivityUserID == op.QuestionUserID { - msg.TriggerUserID = op.AnswerUserID msg.ObjectType = constant.AnswerObjectType } else { - msg.TriggerUserID = op.QuestionUserID msg.ObjectType = constant.AnswerObjectType } if msg.TriggerUserID != msg.ReceiverUserID { @@ -329,9 +327,9 @@ func (ar *AnswerActivityRepo) sendAcceptAnswerNotification( ReceiverUserID: act.ActivityUserID, Type: schema.NotificationTypeInbox, ObjectID: op.AnswerObjectID, + TriggerUserID: op.TriggerUserID, } if act.ActivityUserID != op.QuestionUserID { - msg.TriggerUserID = op.QuestionUserID msg.ObjectType = constant.AnswerObjectType msg.NotificationAction = constant.NotificationAcceptAnswer ar.notificationQueueService.Send(ctx, msg) @@ -343,15 +341,14 @@ func (ar *AnswerActivityRepo) sendCancelAcceptAnswerNotification( ctx context.Context, op *schema.AcceptAnswerOperationInfo) { for _, act := range op.Activities { msg := &schema.NotificationMsg{ + TriggerUserID: act.TriggerUserID, ReceiverUserID: act.ActivityUserID, Type: schema.NotificationTypeAchievement, ObjectID: op.AnswerObjectID, } if act.ActivityUserID == op.QuestionObjectID { - msg.TriggerUserID = op.AnswerObjectID msg.ObjectType = constant.QuestionObjectType } else { - msg.TriggerUserID = op.QuestionObjectID msg.ObjectType = constant.AnswerObjectType } if msg.TriggerUserID != msg.ReceiverUserID { From a6b6545089b568d0a8325e9255c49fa7d4d3aa63 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 29 Aug 2023 15:22:35 +0800 Subject: [PATCH 3/3] fix(answer): fix incorrect cancel answer activity --- internal/repo/activity/answer_repo.go | 35 +++---------------- .../activity/answer_activity_service.go | 3 ++ 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/internal/repo/activity/answer_repo.go b/internal/repo/activity/answer_repo.go index 80335f73a..5542ee2e9 100644 --- a/internal/repo/activity/answer_repo.go +++ b/internal/repo/activity/answer_repo.go @@ -46,15 +46,6 @@ func NewAnswerActivityRepo( func (ar *AnswerActivityRepo) SaveAcceptAnswerActivity(ctx context.Context, op *schema.AcceptAnswerOperationInfo) ( err error) { - // pre check - noNeedToDo, err := ar.activityPreCheck(ctx, op) - if err != nil { - return err - } - if noNeedToDo { - return nil - } - // save activity _, err = ar.data.DB.Transaction(func(session *xorm.Session) (result any, err error) { session = session.Context(ctx) @@ -131,21 +122,6 @@ func (ar *AnswerActivityRepo) SaveCancelAcceptAnswerActivity(ctx context.Context return nil } -func (ar *AnswerActivityRepo) activityPreCheck(ctx context.Context, op *schema.AcceptAnswerOperationInfo) ( - noNeedToDo bool, err error) { - activities, err := ar.getExistActivity(ctx, op) - if err != nil { - return false, err - } - done := 0 - for _, act := range activities { - if act.Cancelled == entity.ActivityAvailable { - done++ - } - } - return done == len(op.Activities), nil -} - func (ar *AnswerActivityRepo) acquireUserInfo(session *xorm.Session, userIDs []string) (map[string]*entity.User, error) { us := make([]*entity.User, 0) err := session.In("id", userIDs).ForUpdate().Find(&us) @@ -286,18 +262,17 @@ func (ar *AnswerActivityRepo) rollbackUserRank(ctx context.Context, session *xor func (ar *AnswerActivityRepo) getExistActivity(ctx context.Context, op *schema.AcceptAnswerOperationInfo) ([]*entity.Activity, error) { var activities []*entity.Activity for _, action := range op.Activities { - t := &entity.Activity{} - exist, err := ar.data.DB.Context(ctx). + var t []*entity.Activity + err := ar.data.DB.Context(ctx). Where(builder.Eq{"user_id": action.ActivityUserID}). - And(builder.Eq{"trigger_user_id": action.TriggerUserID}). And(builder.Eq{"activity_type": action.ActivityType}). And(builder.Eq{"object_id": op.AnswerObjectID}). - Get(t) + Find(&t) if err != nil { return nil, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() } - if exist { - activities = append(activities, t) + if len(t) > 0 { + activities = append(activities, t...) } } return activities, nil diff --git a/internal/service/activity/answer_activity_service.go b/internal/service/activity/answer_activity_service.go index daab2bf73..9785061a4 100644 --- a/internal/service/activity/answer_activity_service.go +++ b/internal/service/activity/answer_activity_service.go @@ -34,6 +34,9 @@ func NewAnswerActivityService( // AcceptAnswer accept answer change activity func (as *AnswerActivityService) AcceptAnswer(ctx context.Context, loginUserID, answerObjID, questionObjID, questionUserID, answerUserID string, isSelf bool) (err error) { + log.Debugf("user %s want to accept answer %s[%s] for question %s[%s]", loginUserID, + answerObjID, answerUserID, + questionObjID, questionUserID) operationInfo := as.createAcceptAnswerOperationInfo(ctx, loginUserID, answerObjID, questionObjID, questionUserID, answerUserID, isSelf) return as.answerActivityRepo.SaveAcceptAnswerActivity(ctx, operationInfo)