2026-05-20 23:51:22 +00:00
|
|
|
package usecase
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
|
|
member "gateway/internal/model/member/domain"
|
|
|
|
|
domrepo "gateway/internal/model/member/domain/repository"
|
|
|
|
|
domusecase "gateway/internal/model/member/domain/usecase"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type profileUseCase struct {
|
|
|
|
|
members domrepo.MemberRepository
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProfileUseCaseParam wires ProfileUseCase.
|
|
|
|
|
type ProfileUseCaseParam struct {
|
|
|
|
|
Members domrepo.MemberRepository
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MustProfileUseCase constructs ProfileUseCase.
|
|
|
|
|
func MustProfileUseCase(param ProfileUseCaseParam) domusecase.ProfileUseCase {
|
|
|
|
|
if param.Members == nil {
|
|
|
|
|
panic("member: member repository is required")
|
|
|
|
|
}
|
|
|
|
|
return &profileUseCase{members: param.Members}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) GetByUID(ctx context.Context, req *domusecase.GetMemberRequest) (*domusecase.MemberDTO, error) {
|
|
|
|
|
if req == nil || req.TenantID == "" || req.UID == "" {
|
|
|
|
|
return nil, errb.InputMissingRequired("tenant_id and uid are required")
|
|
|
|
|
}
|
|
|
|
|
rec, err := uc.members.GetByUID(ctx, req.TenantID, req.UID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if errors.Is(err, member.ErrNotFound) {
|
|
|
|
|
return nil, errb.ResNotFound("member", req.UID).WithCause(err)
|
|
|
|
|
}
|
2026-05-21 06:45:35 +00:00
|
|
|
return nil, wrapRepoErr(err, "read member failed")
|
|
|
|
|
}
|
|
|
|
|
return memberToDTO(rec), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) GetByZitadelUserID(ctx context.Context, tenantID, zitadelUserID string) (*domusecase.MemberDTO, error) {
|
|
|
|
|
if tenantID == "" || zitadelUserID == "" {
|
|
|
|
|
return nil, errb.InputMissingRequired("tenant_id and zitadel_user_id are required")
|
|
|
|
|
}
|
|
|
|
|
rec, err := uc.members.GetByZitadelUserID(ctx, tenantID, zitadelUserID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if errors.Is(err, member.ErrNotFound) {
|
|
|
|
|
return nil, errb.ResNotFound("member", zitadelUserID).WithCause(err)
|
|
|
|
|
}
|
|
|
|
|
return nil, wrapRepoErr(err, "read member failed")
|
2026-05-20 23:51:22 +00:00
|
|
|
}
|
|
|
|
|
return memberToDTO(rec), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) Update(ctx context.Context, req *domusecase.UpdateMemberRequest) (*domusecase.MemberDTO, error) {
|
|
|
|
|
if req == nil || req.TenantID == "" || req.UID == "" {
|
|
|
|
|
return nil, errb.InputMissingRequired("tenant_id and uid are required")
|
|
|
|
|
}
|
|
|
|
|
rec, err := uc.members.UpdateProfile(ctx, req.TenantID, req.UID, &domrepo.MemberUpdate{
|
|
|
|
|
DisplayName: req.DisplayName,
|
|
|
|
|
Avatar: req.Avatar,
|
|
|
|
|
Language: req.Language,
|
|
|
|
|
Currency: req.Currency,
|
|
|
|
|
Phone: req.Phone,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
if errors.Is(err, member.ErrNotFound) {
|
|
|
|
|
return nil, errb.ResNotFound("member", req.UID).WithCause(err)
|
|
|
|
|
}
|
2026-05-21 06:45:35 +00:00
|
|
|
return nil, wrapRepoErr(err, "update member failed")
|
2026-05-20 23:51:22 +00:00
|
|
|
}
|
|
|
|
|
return memberToDTO(rec), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) List(ctx context.Context, req *domusecase.ListMembersRequest) (*domusecase.ListMembersResponse, error) {
|
|
|
|
|
if req == nil || req.TenantID == "" {
|
|
|
|
|
return nil, errb.InputMissingRequired("tenant_id is required")
|
|
|
|
|
}
|
|
|
|
|
items, total, err := uc.members.List(ctx, domrepo.ListMembersFilter{
|
|
|
|
|
TenantID: req.TenantID,
|
|
|
|
|
Status: req.Status,
|
|
|
|
|
Offset: req.Offset,
|
|
|
|
|
Limit: req.Limit,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
2026-05-21 06:45:35 +00:00
|
|
|
return nil, wrapRepoErr(err, "list members failed")
|
2026-05-20 23:51:22 +00:00
|
|
|
}
|
|
|
|
|
out := make([]*domusecase.MemberDTO, 0, len(items))
|
|
|
|
|
for _, item := range items {
|
|
|
|
|
out = append(out, memberToDTO(item))
|
|
|
|
|
}
|
|
|
|
|
return &domusecase.ListMembersResponse{
|
|
|
|
|
Items: out,
|
|
|
|
|
Total: total,
|
|
|
|
|
Offset: req.Offset,
|
|
|
|
|
Limit: req.Limit,
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) SetBusinessEmailVerified(ctx context.Context, tenantID, uid, email string) error {
|
|
|
|
|
if tenantID == "" || uid == "" || email == "" {
|
|
|
|
|
return errb.InputMissingRequired("tenant_id, uid and email are required")
|
|
|
|
|
}
|
|
|
|
|
if err := uc.members.SetBusinessEmailVerified(ctx, tenantID, uid, email); err != nil {
|
|
|
|
|
if errors.Is(err, member.ErrNotFound) {
|
|
|
|
|
return errb.ResNotFound("member", uid).WithCause(err)
|
|
|
|
|
}
|
2026-05-21 06:45:35 +00:00
|
|
|
return wrapRepoErr(err, "set business email verified failed")
|
2026-05-20 23:51:22 +00:00
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uc *profileUseCase) SetBusinessPhoneVerified(ctx context.Context, tenantID, uid, phone string) error {
|
|
|
|
|
if tenantID == "" || uid == "" || phone == "" {
|
|
|
|
|
return errb.InputMissingRequired("tenant_id, uid and phone are required")
|
|
|
|
|
}
|
|
|
|
|
if err := uc.members.SetBusinessPhoneVerified(ctx, tenantID, uid, phone); err != nil {
|
|
|
|
|
if errors.Is(err, member.ErrNotFound) {
|
|
|
|
|
return errb.ResNotFound("member", uid).WithCause(err)
|
|
|
|
|
}
|
2026-05-21 06:45:35 +00:00
|
|
|
return wrapRepoErr(err, "set business phone verified failed")
|
2026-05-20 23:51:22 +00:00
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|