spark-server/internal/module/friend/model/friend_remark.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

90 lines
2.4 KiB
Go

package model
import (
"context"
"errors"
"time"
"gorm.io/gorm"
"spark-server/internal/module/friend/entity"
"spark-server/internal/pkg/errs"
)
// FriendRemark maps table friend_remarks.
type FriendRemark struct {
UserID int64 `gorm:"column:user_id;primaryKey;comment:备注所属用户"`
FriendID int64 `gorm:"column:friend_id;primaryKey;comment:被备注的用户"`
Remark string `gorm:"column:remark;comment:备注名,仅对备注者可见"`
UpdatedAt time.Time `gorm:"column:updated_at;comment:更新时间"`
}
func (FriendRemark) TableName() string { return "friend_remarks" }
func (m *Repo) GetRemark(ctx context.Context, userID, friendID int64) (string, error) {
db, err := m.session(ctx)
if err != nil {
return "", err
}
var row FriendRemark
if err := db.Where("user_id = ? AND friend_id = ?", userID, friendID).Take(&row).Error; err != nil {
mapped := mapDBErr(err)
if errors.Is(mapped, errs.ErrNotFound) {
return "", nil
}
return "", mapped
}
return row.Remark, nil
}
func (m *Repo) ListRemarks(ctx context.Context, userID int64, friendIDs []int64) (map[int64]string, error) {
out := make(map[int64]string, len(friendIDs))
if len(friendIDs) == 0 {
return out, nil
}
db, err := m.session(ctx)
if err != nil {
return nil, err
}
var rows []FriendRemark
if err := db.Where("user_id = ? AND friend_id IN ?", userID, friendIDs).Find(&rows).Error; err != nil {
return nil, mapDBErr(err)
}
for i := range rows {
out[rows[i].FriendID] = rows[i].Remark
}
return out, nil
}
func (m *Repo) SetRemark(ctx context.Context, userID, friendID int64, remark string) error {
if userID <= 0 || friendID <= 0 {
return errs.ErrInvalidArgument
}
db, err := m.session(ctx)
if err != nil {
return err
}
row := FriendRemark{UserID: userID, FriendID: friendID, Remark: remark, UpdatedAt: time.Now()}
return mapDBErr(db.Save(&row).Error)
}
func upsertRemarks(tx *gorm.DB, remarks []entity.Remark) error {
for i := range remarks {
r := remarks[i]
if r.UserID <= 0 || r.FriendID <= 0 || r.Text == "" {
continue
}
row := FriendRemark{UserID: r.UserID, FriendID: r.FriendID, Remark: r.Text, UpdatedAt: r.UpdatedAt}
if err := tx.Save(&row).Error; err != nil {
return mapDBErr(err)
}
}
return nil
}
func deleteRemarksBetween(tx *gorm.DB, a, b int64) error {
err := tx.Where("(user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?)", a, b, b, a).
Delete(&FriendRemark{}).Error
return mapDBErr(err)
}