Files
cmroubao/backend-api/internal/transport/webui/auth_adapter.go
T

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)