package model import ( "context" "time" friendentity "spark-server/internal/module/friend/entity" "spark-server/internal/pkg/errs" ) func (m *Repo) ListComplaints(ctx context.Context, limit int) ([]ComplaintRow, error) { db, err := m.session(ctx) if err != nil { return nil, err } type scanRow struct { ID int64 `gorm:"column:id"` UserID int64 `gorm:"column:user_id"` TargetID int64 `gorm:"column:target_id"` Reason int `gorm:"column:reason"` Detail string `gorm:"column:detail"` CreatedAt time.Time `gorm:"column:created_at"` Email string `gorm:"column:email"` TargetMail string `gorm:"column:target_email"` } var rows []scanRow err = db.Raw(` SELECT r.id, r.user_id, r.target_id, r.reason, r.detail, r.created_at, COALESCE(e.email,'') AS email, COALESCE(te.email,'') AS target_email FROM friend_reports r LEFT JOIN user_emails e ON e.user_id = r.user_id LEFT JOIN user_emails te ON te.user_id = r.target_id ORDER BY r.id DESC LIMIT ?`, limit).Scan(&rows).Error if err != nil { return nil, mapDBErr(err) } out := make([]ComplaintRow, 0, len(rows)) for _, r := range rows { out = append(out, ComplaintRow{ ID: r.ID, UserID: r.UserID, TargetID: r.TargetID, Reason: r.Reason, Detail: r.Detail, CreatedAt: r.CreatedAt, Email: r.Email, TargetMail: r.TargetMail, }) } return out, nil } func (m *Repo) InsertComplaint(ctx context.Context, r *friendentity.Report) error { if r == nil || r.UserID <= 0 || r.TargetID <= 0 { return errs.ErrInvalidArgument } db, err := m.session(ctx) if err != nil { return err } return mapDBErr(db.Exec(`INSERT INTO friend_reports (id, user_id, target_id, reason, detail, created_at) VALUES (?,?,?,?,?,?)`, r.ID, r.UserID, r.TargetID, int(r.Reason), r.Detail, r.CreatedAt).Error) }