122 lines
3.8 KiB
Go
122 lines
3.8 KiB
Go
package business
|
|
|
|
import (
|
|
"context"
|
|
"kra/internal/biz/business"
|
|
"kra/internal/service/dto"
|
|
"strings"
|
|
"time"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type BindingUsecase interface {
|
|
List(context.Context, business.BindingFilter, ...business.ListOption) ([]*business.Binding, int64, error)
|
|
ForUser(context.Context, uint) ([]*business.Binding, error)
|
|
Bind(context.Context, string, string, string) error
|
|
Unbind(context.Context, business.PlatformKey) error
|
|
}
|
|
type BindingService struct{ uc BindingUsecase }
|
|
|
|
func NewBindingService(uc *business.BindingUsecase) *BindingService { return &BindingService{uc: uc} }
|
|
|
|
func localTime(t *time.Time) *string {
|
|
if t == nil || t.IsZero() {
|
|
return nil
|
|
}
|
|
s := t.Format("2006-01-02 15:04:05")
|
|
return &s
|
|
}
|
|
func bindingResponse(b *business.Binding) *dto.BusinessBindingResponse {
|
|
return &dto.BusinessBindingResponse{UserID: b.UserID, SourceDB: b.SourceDB, PlatformName: business.PlatformName(b.SourceDB), PlatformBusierID: b.BusierID,
|
|
Account: b.Account, UserName: b.UserName, PromoteCount: b.PromoteCount, Status: b.Status, RejectReason: b.RejectReason, CreateTime: localTime(&b.CreatedAt), ReviewTime: localTime(b.ReviewTime), ReviewAccount: b.ReviewAccount}
|
|
}
|
|
|
|
func normalizePlatforms(values []string) ([]string, error) {
|
|
result := []string{}
|
|
seen := map[string]bool{}
|
|
for _, raw := range values {
|
|
for _, value := range strings.Split(raw, ",") {
|
|
if strings.TrimSpace(value) == "" {
|
|
continue
|
|
}
|
|
value, err := business.NormalizePlatform(value)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !seen[value] {
|
|
seen[value] = true
|
|
result = append(result, value)
|
|
}
|
|
}
|
|
}
|
|
return result, nil
|
|
}
|
|
func (s *BindingService) List(ctx context.Context, req *dto.BusinessBindingQuery) (*dto.BusinessBindingPage, error) {
|
|
if req == nil {
|
|
return nil, business.ErrAccountInput
|
|
}
|
|
sources, err := normalizePlatforms(req.SourceDB)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if req.Status != "" && req.Status != "0" && req.Status != "2" && req.Status != "3" {
|
|
return nil, business.ErrAccountInput
|
|
}
|
|
page, size := req.Page, req.PageSize
|
|
if page < 1 {
|
|
page = 1
|
|
}
|
|
if size < 1 {
|
|
size = 10
|
|
}
|
|
if size > 500 {
|
|
size = 500
|
|
}
|
|
if page > int(^uint(0)>>1)/size {
|
|
return nil, business.ErrAccountInput
|
|
}
|
|
rows, total, err := s.uc.List(ctx, business.BindingFilter{SourceDBs: sources, Account: req.Account, Status: req.Status}, business.ListOffset((page-1)*size), business.ListLimit(size))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out := &dto.BusinessBindingPage{Rows: make([]*dto.BusinessBindingResponse, 0, len(rows)), Total: total}
|
|
for _, b := range rows {
|
|
out.Rows = append(out.Rows, bindingResponse(b))
|
|
}
|
|
return out, nil
|
|
}
|
|
func (s *BindingService) ForUser(ctx context.Context, id uint) ([]*dto.BusinessBindingResponse, error) {
|
|
if id == 0 {
|
|
return nil, business.ErrAccountInput
|
|
}
|
|
rows, err := s.uc.ForUser(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out := make([]*dto.BusinessBindingResponse, 0, len(rows))
|
|
for _, b := range rows {
|
|
out = append(out, bindingResponse(b))
|
|
}
|
|
return out, nil
|
|
}
|
|
func (s *BindingService) Bind(ctx context.Context, req *dto.BusinessBindingRequest) error {
|
|
if req == nil || strings.TrimSpace(req.Account) == "" || utf8.RuneCountInString(req.Account) > 30 || strings.TrimSpace(req.Password) == "" || utf8.RuneCountInString(req.Password) > 100 {
|
|
return business.ErrAccountInput
|
|
}
|
|
source, err := business.NormalizePlatform(req.SourceDB)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.uc.Bind(ctx, source, req.Account, req.Password)
|
|
}
|
|
func (s *BindingService) Unbind(ctx context.Context, req *dto.BusinessBindingRequest) error {
|
|
if req == nil || req.PlatformBusierID == 0 {
|
|
return business.ErrAccountInput
|
|
}
|
|
source, err := business.NormalizePlatform(req.SourceDB)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.uc.Unbind(ctx, business.PlatformKey{SourceDB: source, BusierID: req.PlatformBusierID})
|
|
}
|