package service import ( "context" "service.xpcool.com/internal/model/dto" ) type IUserAuth interface { Login(context.Context, dto.UserLoginInput) (*dto.TokenPair, uint64, error) Refresh(context.Context, string) (*dto.TokenPair, uint64, error) } type IAdminAuth interface { Login(context.Context, dto.AdminLoginInput) (*dto.TokenPair, uint64, error) HasPermission(context.Context, uint64, string) (bool, error) Info(context.Context, uint64) (*dto.AdminInfo, error) Codes(context.Context, uint64) ([]string, error) // PermissionForPath resolves the permission code required by an endpoint // from admin_menu (type=2 rows) by matching " ". PermissionForPath(context.Context, string, string) (string, error) } type AuditEvent struct { AdminID uint64 Permission, Method, Path, IP, Param string DurationMS, StatusCode int } type IAdminAudit interface { Record(context.Context, AuditEvent) } var ( localUserAuth IUserAuth localAdminAuth IAdminAuth localAdminAudit IAdminAudit ) func UserAuth() IUserAuth { if localUserAuth == nil { panic("UserAuth implementation not registered") } return localUserAuth } func RegisterUserAuth(i IUserAuth) { localUserAuth = i } func AdminAuth() IAdminAuth { if localAdminAuth == nil { panic("AdminAuth implementation not registered") } return localAdminAuth } func RegisterAdminAuth(i IAdminAuth) { localAdminAuth = i } func AdminAudit() IAdminAudit { if localAdminAudit == nil { panic("AdminAudit implementation not registered") } return localAdminAudit } func RegisterAdminAudit(i IAdminAudit) { localAdminAudit = i }