62 lines
1.9 KiB
Go
62 lines
1.9 KiB
Go
// Package user 提供用户数据访问。所有查询强制按 mini_id 过滤,
|
|
// 从数据层保证各小程序用户体系相互独立。
|
|
package user
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"portal-mini-go/internal/model"
|
|
"portal-mini-go/internal/pkg/errors"
|
|
)
|
|
|
|
type Repository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func New(db *gorm.DB) *Repository { return &Repository{db: db} }
|
|
|
|
// UpsertByOpenID 按 mini_id + openid 创建或返回已有用户。
|
|
func (r *Repository) UpsertByOpenID(ctx context.Context, miniID uint64, openID, unionID, nickname, avatar string) (*model.User, error) {
|
|
var u model.User
|
|
err := r.db.WithContext(ctx).
|
|
Where("mini_id = ? AND openid = ?", miniID, openID).
|
|
Attrs(model.User{MiniID: miniID, OpenID: openID, UnionID: unionID, Nickname: nickname, Avatar: avatar}).
|
|
FirstOrCreate(&u).Error
|
|
if err != nil {
|
|
return nil, errors.Wrap(50000, "upsert user", err)
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// GetByID 按 mini_id + id 查询用户,跨小程序查询直接返回未找到。
|
|
func (r *Repository) GetByID(ctx context.Context, miniID uint64, id uint64) (*model.User, error) {
|
|
var u model.User
|
|
err := r.db.WithContext(ctx).
|
|
Where("mini_id = ? AND id = ?", miniID, id).
|
|
First(&u).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.ErrNotFound
|
|
}
|
|
return nil, errors.Wrap(50000, "query user", err)
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// UpdateProfile 更新用户资料,限定在 mini_id 范围内。
|
|
func (r *Repository) UpdateProfile(ctx context.Context, miniID uint64, id uint64, nickname, avatar string) error {
|
|
res := r.db.WithContext(ctx).
|
|
Model(&model.User{}).
|
|
Where("mini_id = ? AND id = ?", miniID, id).
|
|
Updates(map[string]interface{}{"nickname": nickname, "avatar": avatar})
|
|
if res.Error != nil {
|
|
return errors.Wrap(50000, "update user", res.Error)
|
|
}
|
|
if res.RowsAffected == 0 {
|
|
return errors.ErrNotFound
|
|
}
|
|
return nil
|
|
}
|