128 lines
2.9 KiB
Go
128 lines
2.9 KiB
Go
package data
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/go-kratos/aip-go/ents"
|
|
"kra/internal/biz"
|
|
"kra/internal/data/ent"
|
|
"kra/internal/data/ent/admin"
|
|
)
|
|
|
|
func convertAdmin(po *ent.Admin) *biz.Admin {
|
|
return &biz.Admin{
|
|
ID: po.ID,
|
|
Name: po.Name,
|
|
Email: po.Email,
|
|
Avatar: po.Avatar,
|
|
Access: po.Access,
|
|
Password: po.Password,
|
|
CreateTime: po.CreateTime,
|
|
UpdateTime: po.UpdateTime,
|
|
}
|
|
}
|
|
|
|
type adminRepo struct {
|
|
data *Data
|
|
}
|
|
|
|
// NewAdminRepo creates a new AdminRepo instance.
|
|
func NewAdminRepo(data *Data) biz.AdminRepo {
|
|
return &adminRepo{
|
|
data: data,
|
|
}
|
|
}
|
|
|
|
func (r *adminRepo) FindByID(ctx context.Context, id int64) (*biz.Admin, error) {
|
|
po, err := r.data.db.Admin.Get(ctx, id)
|
|
if err != nil {
|
|
if ent.IsNotFound(err) {
|
|
return nil, biz.ErrAdminNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return convertAdmin(po), nil
|
|
}
|
|
|
|
func (r *adminRepo) FindByName(ctx context.Context, name string) (*biz.Admin, error) {
|
|
po, err := r.data.db.Admin.Query().Where(admin.NameEQ(name)).Only(ctx)
|
|
if err != nil {
|
|
if ent.IsNotFound(err) {
|
|
return nil, biz.ErrAdminNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return convertAdmin(po), nil
|
|
}
|
|
|
|
func (r *adminRepo) FindByEmail(ctx context.Context, email string) (*biz.Admin, error) {
|
|
po, err := r.data.db.Admin.Query().Where(admin.EmailEQ(email)).Only(ctx)
|
|
if err != nil {
|
|
if ent.IsNotFound(err) {
|
|
return nil, biz.ErrAdminNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return convertAdmin(po), nil
|
|
}
|
|
|
|
func (r *adminRepo) ListAdmins(ctx context.Context, opts ...biz.ListOption) ([]*biz.Admin, error) {
|
|
o := biz.ListOptions{Limit: 20}
|
|
for _, opt := range opts {
|
|
opt(&o)
|
|
}
|
|
pos, err := r.data.db.Admin.Query().
|
|
Where(ents.ApplyFilter(o.Filter)).
|
|
Order(ents.ApplyOrderBy(o.OrderBy)).
|
|
Offset(o.Offset).
|
|
Limit(o.Limit).
|
|
All(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var admins []*biz.Admin
|
|
for _, po := range pos {
|
|
admins = append(admins, convertAdmin(po))
|
|
}
|
|
return admins, nil
|
|
}
|
|
|
|
func (r *adminRepo) CreateAdmin(ctx context.Context, admin *biz.Admin) (*biz.Admin, error) {
|
|
po, err := r.data.db.Admin.Create().
|
|
SetName(admin.Name).
|
|
SetEmail(admin.Email).
|
|
SetAvatar(admin.Avatar).
|
|
SetAccess(admin.Access).
|
|
SetPassword(admin.Password).
|
|
SetCreateTime(time.Now()).
|
|
SetUpdateTime(time.Now()).
|
|
Save(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return convertAdmin(po), nil
|
|
}
|
|
|
|
func (r *adminRepo) UpdateAdmin(ctx context.Context, admin *biz.Admin) (*biz.Admin, error) {
|
|
update := r.data.db.Admin.UpdateOneID(admin.ID).
|
|
SetName(admin.Name).
|
|
SetEmail(admin.Email).
|
|
SetAccess(admin.Access).
|
|
SetAvatar(admin.Avatar).
|
|
SetUpdateTime(time.Now())
|
|
// Only update the password if it's not empty
|
|
if admin.Password != "" {
|
|
update.SetPassword(admin.Password)
|
|
}
|
|
po, err := update.Save(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return convertAdmin(po), nil
|
|
}
|
|
|
|
func (r *adminRepo) DeleteAdmin(ctx context.Context, id int64) error {
|
|
return r.data.db.Admin.DeleteOneID(id).Exec(ctx)
|
|
}
|