76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
package webui
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"cmroubao/backend-api/internal/usecase"
|
|
)
|
|
|
|
type AuthUsecaseAdapter struct {
|
|
service *usecase.AuthService
|
|
}
|
|
|
|
func NewAuthUsecaseAdapter(
|
|
service *usecase.AuthService,
|
|
) (*AuthUsecaseAdapter, error) {
|
|
if service == nil {
|
|
return nil, errors.New("admin auth use case is required")
|
|
}
|
|
return &AuthUsecaseAdapter{service: service}, nil
|
|
}
|
|
|
|
func (adapter *AuthUsecaseAdapter) LoginAdmin(
|
|
ctx context.Context,
|
|
input AdminLoginInput,
|
|
) (AdminLoginResult, error) {
|
|
result, err := adapter.service.LoginAdmin(
|
|
ctx,
|
|
usecase.LoginAdminCommand{
|
|
Username: input.Username,
|
|
Password: input.Password,
|
|
},
|
|
)
|
|
if err != nil {
|
|
return AdminLoginResult{}, mapAuthUsecaseError(err)
|
|
}
|
|
return AdminLoginResult{
|
|
Token: result.Token,
|
|
ExpiresAt: result.ExpiresAt,
|
|
}, nil
|
|
}
|
|
|
|
func (adapter *AuthUsecaseAdapter) LogoutAdmin(
|
|
ctx context.Context,
|
|
token string,
|
|
) error {
|
|
if err := adapter.service.LogoutAdmin(ctx, token); err != nil {
|
|
return mapAuthUsecaseError(err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func mapAuthUsecaseError(err error) error {
|
|
var typed *usecase.Error
|
|
if !errors.As(err, &typed) {
|
|
return err
|
|
}
|
|
var public error
|
|
switch typed.Kind {
|
|
case usecase.ErrorKindUnauthorized,
|
|
usecase.ErrorKindForbidden,
|
|
usecase.ErrorKindInvalid:
|
|
public = ErrInvalidCredentials
|
|
case usecase.ErrorKindUnavailable:
|
|
public = ErrUnavailable
|
|
default:
|
|
return err
|
|
}
|
|
return &adapterError{
|
|
public: public,
|
|
cause: err,
|
|
}
|
|
}
|
|
|
|
var _ AdminSessionService = (*AuthUsecaseAdapter)(nil)
|