in internal/service/notification_common/notification.go [109:216]
func (ns *NotificationCommon) AddNotification(ctx context.Context, msg *schema.NotificationMsg) (err error) {
if msg.Type == schema.NotificationTypeAchievement && plugin.RankAgentEnabled() {
return nil
}
req := &schema.NotificationContent{
TriggerUserID: msg.TriggerUserID,
ReceiverUserID: msg.ReceiverUserID,
ObjectInfo: schema.ObjectInfo{
Title: msg.Title,
ObjectID: uid.DeShortID(msg.ObjectID),
ObjectType: msg.ObjectType,
},
NotificationAction: msg.NotificationAction,
Type: msg.Type,
}
var questionID string // just for notify all followers
var objInfo *schema.SimpleObjectInfo
if msg.ObjectType == constant.BadgeAwardObjectType {
req.ObjectInfo.Title = msg.Title
objectMap := make(map[string]string)
objectMap["badge_id"] = msg.ExtraInfo["badge_id"]
req.ObjectInfo.ObjectMap = objectMap
} else {
objInfo, err = ns.objectInfoService.GetInfo(ctx, req.ObjectInfo.ObjectID)
if err != nil {
log.Error(err)
} else {
req.ObjectInfo.Title = objInfo.Title
questionID = objInfo.QuestionID
objectMap := make(map[string]string)
objectMap["question"] = uid.DeShortID(objInfo.QuestionID)
objectMap["answer"] = uid.DeShortID(objInfo.AnswerID)
objectMap["comment"] = objInfo.CommentID
req.ObjectInfo.ObjectMap = objectMap
}
}
if msg.Type == schema.NotificationTypeAchievement {
notificationInfo, exist, err := ns.notificationRepo.GetByUserIdObjectIdTypeId(ctx, req.ReceiverUserID, req.ObjectInfo.ObjectID, req.Type)
if err != nil {
return fmt.Errorf("get by user id object id type id error: %w", err)
}
rank, err := ns.activityRepo.GetUserIDObjectIDActivitySum(ctx, req.ReceiverUserID, req.ObjectInfo.ObjectID)
if err != nil {
return fmt.Errorf("get user id object id activity sum error: %w", err)
}
req.Rank = rank
if exist {
//modify notification
updateContent := &schema.NotificationContent{}
err := json.Unmarshal([]byte(notificationInfo.Content), updateContent)
if err != nil {
return fmt.Errorf("unmarshal notification content error: %w", err)
}
updateContent.Rank = rank
content, _ := json.Marshal(updateContent)
notificationInfo.Content = string(content)
err = ns.notificationRepo.UpdateNotificationContent(ctx, notificationInfo)
if err != nil {
return fmt.Errorf("update notification content error: %w", err)
}
return nil
}
}
info := &entity.Notification{}
now := time.Now()
info.UserID = req.ReceiverUserID
info.Type = req.Type
info.IsRead = schema.NotificationNotRead
info.Status = schema.NotificationStatusNormal
info.CreatedAt = now
info.UpdatedAt = now
info.ObjectID = req.ObjectInfo.ObjectID
userBasicInfo, exist, err := ns.userCommon.GetUserBasicInfoByID(ctx, req.TriggerUserID)
if err != nil {
return fmt.Errorf("get user basic info error: %w", err)
}
if !exist {
return fmt.Errorf("user not exist: %s", req.TriggerUserID)
}
req.UserInfo = userBasicInfo
content, _ := json.Marshal(req)
_, ok := constant.NotificationMsgTypeMapping[req.NotificationAction]
if ok {
info.MsgType = constant.NotificationMsgTypeMapping[req.NotificationAction]
}
info.Content = string(content)
err = ns.notificationRepo.AddNotification(ctx, info)
if err != nil {
return fmt.Errorf("add notification error: %w", err)
}
err = ns.addRedDot(ctx, info.UserID, msg.Type)
if err != nil {
log.Error("addRedDot Error", err.Error())
}
if req.ObjectInfo.ObjectType == constant.BadgeAwardObjectType {
err = ns.AddBadgeAwardAlertCache(ctx, info.UserID, info.ID, req.ObjectInfo.ObjectMap["badge_id"])
}
go ns.SendNotificationToAllFollower(ctx, msg, questionID)
if msg.Type == schema.NotificationTypeInbox {
ns.syncNotificationToPlugin(ctx, objInfo, msg)
}
return nil
}