init push
This commit is contained in:
813
internal/transport/http/dto/auth_dto.go
Normal file
813
internal/transport/http/dto/auth_dto.go
Normal file
@@ -0,0 +1,813 @@
|
||||
package dto
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// JSON:API Request/Response DTOs for Auth
|
||||
|
||||
// Register
|
||||
type RegisterAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
Username string `json:"username" validate:"required,min=3,max=100" example:"john.doe"`
|
||||
Password string `json:"password" validate:"required,min=8" example:"StrongP@ssw0rd"`
|
||||
FirstName string `json:"first_name" validate:"required" example:"John"`
|
||||
LastName string `json:"last_name" validate:"required" example:"Doe"`
|
||||
MobilePhone string `json:"mobile_phone,omitempty" example:"+628123456789"`
|
||||
}
|
||||
|
||||
type RegisterData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_register" example:"auth_register"`
|
||||
Attributes RegisterAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type RegisterRequest struct {
|
||||
Data RegisterData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Invite user
|
||||
type InviteAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
Username string `json:"username" validate:"required,min=3,max=100" example:"john.doe"`
|
||||
FirstName string `json:"first_name" validate:"required" example:"John"`
|
||||
LastName string `json:"last_name" validate:"required" example:"Doe"`
|
||||
MobilePhone string `json:"mobile_phone,omitempty" example:"+628123456789"`
|
||||
RoleID string `json:"role_id" validate:"required" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
RoleIDs []string `json:"role_ids,omitempty" example:"[\"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d\",\"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9e\"]"`
|
||||
}
|
||||
|
||||
type InviteData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_invite" example:"auth_invite"`
|
||||
Attributes InviteAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type InviteRequest struct {
|
||||
Data InviteData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Set password from invite token
|
||||
type SetPasswordAttributes struct {
|
||||
Token string `json:"token" validate:"required" example:"kP8k2..."`
|
||||
Password string `json:"password" validate:"required,min=8" example:"StrongP@ssw0rd"`
|
||||
}
|
||||
|
||||
type SetPasswordData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_set_password" example:"auth_set_password"`
|
||||
Attributes SetPasswordAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SetPasswordRequest struct {
|
||||
Data SetPasswordData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Resend set-password invite
|
||||
type ResendSetPasswordInviteAttributes struct {
|
||||
UserID string `json:"user_id" validate:"required" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
}
|
||||
|
||||
type ResendSetPasswordInviteData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_resend_set_password" example:"auth_resend_set_password"`
|
||||
Attributes ResendSetPasswordInviteAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ResendSetPasswordInviteRequest struct {
|
||||
Data ResendSetPasswordInviteData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Forgot password
|
||||
type ForgotPasswordAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
}
|
||||
|
||||
type ForgotPasswordData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_forgot_password" example:"auth_forgot_password"`
|
||||
Attributes ForgotPasswordAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ForgotPasswordRequest struct {
|
||||
Data ForgotPasswordData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Reset password
|
||||
type ResetPasswordAttributes struct {
|
||||
Token string `json:"token" validate:"required" example:"kP8k2..."`
|
||||
NewPassword string `json:"new_password" validate:"required,min=8" example:"StrongP@ssw0rd!LongPassphrase"`
|
||||
ConfirmPassword string `json:"confirm_password" validate:"required,min=8" example:"StrongP@ssw0rd!LongPassphrase"`
|
||||
}
|
||||
|
||||
type ResetPasswordData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_reset_password" example:"auth_reset_password"`
|
||||
Attributes ResetPasswordAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ResetPasswordRequest struct {
|
||||
Data ResetPasswordData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Setup security PIN
|
||||
type SecurityPINSetupAttributes struct {
|
||||
PIN string `json:"pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
ConfirmPIN string `json:"confirm_pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
}
|
||||
|
||||
type SecurityPINSetupData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_pin_setup" example:"auth_pin_setup"`
|
||||
Attributes SecurityPINSetupAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SecurityPINSetupRequest struct {
|
||||
Data SecurityPINSetupData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type SecurityPINSetupResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_pin_setup"`
|
||||
Attributes struct {
|
||||
Configured bool `json:"configured" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Verify security PIN
|
||||
type SecurityPINVerifyAttributes struct {
|
||||
PIN string `json:"pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
Action string `json:"action" validate:"required,uuid4" example:"a546de2f-f1e6-4c2c-ab03-9b4bf39f4d74"`
|
||||
}
|
||||
|
||||
type SecurityPINVerifyData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_pin_verify" example:"auth_pin_verify"`
|
||||
Attributes SecurityPINVerifyAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SecurityPINVerifyRequest struct {
|
||||
Data SecurityPINVerifyData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type SecurityPINVerifyResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_pin_verify"`
|
||||
Attributes struct {
|
||||
Verified bool `json:"verified" example:"true"`
|
||||
ActionToken string `json:"action_token" example:"pinv_1234567890abcdef"`
|
||||
ActionTokenTTLMS int64 `json:"action_token_ttl_ms" example:"900000"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Change security PIN
|
||||
type SecurityPINChangeAttributes struct {
|
||||
CurrentPIN string `json:"current_pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
NewPIN string `json:"new_pin" validate:"required,len=6,numeric" example:"654321"`
|
||||
ConfirmPIN string `json:"confirm_pin" validate:"required,len=6,numeric" example:"654321"`
|
||||
}
|
||||
|
||||
type SecurityPINChangeData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_pin_change" example:"auth_pin_change"`
|
||||
Attributes SecurityPINChangeAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SecurityPINChangeRequest struct {
|
||||
Data SecurityPINChangeData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Forgot security PIN
|
||||
type ForgotSecurityPINAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
}
|
||||
|
||||
type ForgotSecurityPINData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_forgot_pin" example:"auth_forgot_pin"`
|
||||
Attributes ForgotSecurityPINAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ForgotSecurityPINRequest struct {
|
||||
Data ForgotSecurityPINData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Request security PIN reset
|
||||
type RequestSecurityPINAttributes struct {
|
||||
Method string `json:"method,omitempty" example:"password"`
|
||||
Password string `json:"password,omitempty" example:"StrongP@ssw0rd"`
|
||||
ReauthToken string `json:"reauth_token,omitempty" example:"sso_reauth_1234567890abcdef"`
|
||||
}
|
||||
|
||||
type RequestSecurityPINData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_pin_request_reset" example:"auth_pin_request_reset"`
|
||||
Attributes RequestSecurityPINAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type RequestSecurityPINRequest struct {
|
||||
Data RequestSecurityPINData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type RequestSecurityPINResetResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_pin_request_reset"`
|
||||
Attributes struct {
|
||||
Message string `json:"message" example:"If allowed, a security PIN reset link has been sent to your email."`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Reset security PIN
|
||||
type ResetSecurityPINAttributes struct {
|
||||
Token string `json:"token,omitempty" example:"kP8k2..."`
|
||||
Method string `json:"method,omitempty" example:"password"`
|
||||
Password string `json:"password,omitempty" example:"StrongP@ssw0rd"`
|
||||
ReauthToken string `json:"reauth_token,omitempty" example:"sso_reauth_1234567890abcdef"`
|
||||
NewPIN string `json:"new_pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
ConfirmPIN string `json:"confirm_pin" validate:"required,len=6,numeric" example:"123456"`
|
||||
}
|
||||
|
||||
type ResetSecurityPINData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_reset_pin" example:"auth_reset_pin"`
|
||||
Attributes ResetSecurityPINAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ResetSecurityPINRequest struct {
|
||||
Data ResetSecurityPINData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Login
|
||||
type LoginAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
Password string `json:"password" validate:"required" example:"StrongP@ssw0rd"`
|
||||
}
|
||||
|
||||
type LoginData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_login" example:"auth_login"`
|
||||
Attributes LoginAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type LoginRequest struct {
|
||||
Data LoginData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Exchange frontend Microsoft token result into backend session tokens
|
||||
type ExchangeIDTokenClaims struct {
|
||||
Aud string `json:"aud,omitempty" example:"12345678-1234-1234-1234-123456789012"`
|
||||
Iss string `json:"iss,omitempty" example:"https://login.microsoftonline.com/abc-tenant-id/v2.0"`
|
||||
Iat int64 `json:"iat,omitempty" example:"1715600000"`
|
||||
Nbf int64 `json:"nbf,omitempty" example:"1715600000"`
|
||||
Exp int64 `json:"exp,omitempty" example:"1715603600"`
|
||||
Name string `json:"name,omitempty" example:"Andrio Effendi"`
|
||||
PreferredUsername string `json:"preferred_username,omitempty" example:"andrio@mybit-innovation.com"`
|
||||
Email string `json:"email,omitempty" example:"andrio@mybit-innovation.com"`
|
||||
OID string `json:"oid,omitempty" example:"00000000-0000-0000-1234-567890abcdef"`
|
||||
Sub string `json:"sub,omitempty" example:"AbCdEfGhIjKlMnOpQrStUvWxYz"`
|
||||
TID string `json:"tid,omitempty" example:"abc-tenant-id"`
|
||||
Ver string `json:"ver,omitempty" example:"2.0"`
|
||||
}
|
||||
|
||||
type ExchangeAttributes struct {
|
||||
AccessToken string `json:"access_token" validate:"required" example:"eyJ0eXAiOiJKV1Qi..."`
|
||||
IDToken string `json:"id_token" validate:"required" example:"eyJ0eXAiOiJKV1Qi..."`
|
||||
IDTokenClaims ExchangeIDTokenClaims `json:"id_token_claims"`
|
||||
}
|
||||
|
||||
type ExchangeData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_exchange" example:"auth_exchange"`
|
||||
Attributes ExchangeAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type ExchangeRequest struct {
|
||||
Data ExchangeData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
func (c ExchangeIDTokenClaims) ToMap() map[string]any {
|
||||
out := map[string]any{}
|
||||
if c.Aud != "" {
|
||||
out["aud"] = c.Aud
|
||||
}
|
||||
if c.Iss != "" {
|
||||
out["iss"] = c.Iss
|
||||
}
|
||||
if c.Iat > 0 {
|
||||
out["iat"] = c.Iat
|
||||
}
|
||||
if c.Nbf > 0 {
|
||||
out["nbf"] = c.Nbf
|
||||
}
|
||||
if c.Exp > 0 {
|
||||
out["exp"] = c.Exp
|
||||
}
|
||||
if c.Name != "" {
|
||||
out["name"] = c.Name
|
||||
}
|
||||
if c.PreferredUsername != "" {
|
||||
out["preferred_username"] = c.PreferredUsername
|
||||
}
|
||||
if c.Email != "" {
|
||||
out["email"] = c.Email
|
||||
}
|
||||
if c.OID != "" {
|
||||
out["oid"] = c.OID
|
||||
}
|
||||
if c.Sub != "" {
|
||||
out["sub"] = c.Sub
|
||||
}
|
||||
if c.TID != "" {
|
||||
out["tid"] = c.TID
|
||||
}
|
||||
if c.Ver != "" {
|
||||
out["ver"] = c.Ver
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// WebAuthn register begin
|
||||
type WebAuthnRegisterBeginData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_webauthn_register_begin" example:"auth_webauthn_register_begin"`
|
||||
}
|
||||
|
||||
type WebAuthnRegisterBeginRequest struct {
|
||||
Data WebAuthnRegisterBeginData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// WebAuthn register finish
|
||||
type WebAuthnRegisterFinishAttributes struct {
|
||||
ChallengeToken string `json:"challenge_token" validate:"required" example:"kP8k2..."`
|
||||
Credential json.RawMessage `json:"credential" validate:"required"`
|
||||
Name string `json:"name,omitempty" validate:"omitempty,max=100" example:"MacBook Touch ID"`
|
||||
}
|
||||
|
||||
type WebAuthnRegisterFinishData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_webauthn_register_finish" example:"auth_webauthn_register_finish"`
|
||||
Attributes WebAuthnRegisterFinishAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnRegisterFinishRequest struct {
|
||||
Data WebAuthnRegisterFinishData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// WebAuthn login begin
|
||||
type WebAuthnLoginBeginAttributes struct {
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
}
|
||||
|
||||
type WebAuthnLoginBeginData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_webauthn_login_begin" example:"auth_webauthn_login_begin"`
|
||||
Attributes WebAuthnLoginBeginAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnLoginBeginRequest struct {
|
||||
Data WebAuthnLoginBeginData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// WebAuthn login finish
|
||||
type WebAuthnLoginFinishAttributes struct {
|
||||
ChallengeToken string `json:"challenge_token" validate:"required" example:"kP8k2..."`
|
||||
Credential json.RawMessage `json:"credential" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnLoginFinishData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_webauthn_login_finish" example:"auth_webauthn_login_finish"`
|
||||
Attributes WebAuthnLoginFinishAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnLoginFinishRequest struct {
|
||||
Data WebAuthnLoginFinishData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Sensitive-action re-auth attributes
|
||||
type ReauthAttributes struct {
|
||||
Method string `json:"method" validate:"required,oneof=pin password" example:"pin"`
|
||||
Password string `json:"password,omitempty" validate:"omitempty,min=1" example:"StrongP@ssw0rd"`
|
||||
}
|
||||
|
||||
// WebAuthn reset setup
|
||||
type WebAuthnResetSetupData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_webauthn_reset_setup" example:"auth_webauthn_reset_setup"`
|
||||
Attributes ReauthAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnResetSetupRequest struct {
|
||||
Data WebAuthnResetSetupData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type WebAuthnResetSetupResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_webauthn_reset_setup"`
|
||||
Attributes struct {
|
||||
Reset bool `json:"reset" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Login response when TOTP required
|
||||
type LoginTOTPRequiredResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_totp_required"`
|
||||
Attributes struct {
|
||||
RequiresTOTP bool `json:"requires_totp" example:"true"`
|
||||
ChallengeToken string `json:"challenge_token" example:"kP8k2..."`
|
||||
TOTPEnabled bool `json:"totp_enabled" example:"true"`
|
||||
EmailOTPEnabled bool `json:"email_otp_enabled" example:"false"`
|
||||
EmailOTPChallengeToken string `json:"email_otp_challenge_token,omitempty" example:"qA9j1..."`
|
||||
EmailOTPResendCooldownSec int `json:"email_otp_resend_cooldown_seconds,omitempty" example:"60"`
|
||||
EmailOTPMaxResendPerHour int `json:"email_otp_max_resend_per_hour,omitempty" example:"5"`
|
||||
WebAuthnConfigured bool `json:"webauthn_configured" example:"false"`
|
||||
LinkedSSO bool `json:"linked_sso" example:"false"`
|
||||
PINConfigured bool `json:"pin_configured" example:"false"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type LoginEmailOTPRequiredResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_email_otp_required"`
|
||||
Attributes struct {
|
||||
RequiresEmailOTP bool `json:"requires_email_otp" example:"true"`
|
||||
ChallengeToken string `json:"challenge_token" example:"kP8k2..."`
|
||||
ResendCooldownSeconds int `json:"resend_cooldown_seconds" example:"60"`
|
||||
MaxResendPerHour int `json:"max_resend_per_hour" example:"5"`
|
||||
RequiresTOTPSetup bool `json:"requires_totp_setup" example:"true"`
|
||||
WebAuthnConfigured bool `json:"webauthn_configured" example:"false"`
|
||||
LinkedSSO bool `json:"linked_sso" example:"false"`
|
||||
PINConfigured bool `json:"pin_configured" example:"false"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type EmailOTPSendAttributes struct {
|
||||
ChallengeToken string `json:"challenge_token" validate:"required" example:"kP8k2..."`
|
||||
}
|
||||
|
||||
type EmailOTPSendData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_email_otp_send" example:"auth_email_otp_send"`
|
||||
Attributes EmailOTPSendAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type EmailOTPSendRequest struct {
|
||||
Data EmailOTPSendData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type EmailOTPVerifyAttributes struct {
|
||||
ChallengeToken string `json:"challenge_token" validate:"required" example:"kP8k2..."`
|
||||
Code string `json:"code" validate:"required,len=6,numeric" example:"123456"`
|
||||
}
|
||||
|
||||
type EmailOTPVerifyData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_email_otp_verify" example:"auth_email_otp_verify"`
|
||||
Attributes EmailOTPVerifyAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type EmailOTPVerifyRequest struct {
|
||||
Data EmailOTPVerifyData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type EmailOTPSendResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_email_otp_send"`
|
||||
Attributes struct {
|
||||
Sent bool `json:"sent" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type EmailOTPVerifyResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_email_otp_verify"`
|
||||
Attributes struct {
|
||||
Verified bool `json:"verified" example:"true"`
|
||||
RequiresTOTPSetup bool `json:"requires_totp_setup" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Email verify response
|
||||
type VerifyEmailResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_verify_email"`
|
||||
Attributes struct {
|
||||
Verified bool `json:"verified" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Microsoft login
|
||||
type MicrosoftLoginResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_microsoft_url"`
|
||||
Attributes struct {
|
||||
URL string `json:"url" example:"https://login.microsoftonline.com/..."`
|
||||
RedirectURL string `json:"redirect_url" example:"https://login.microsoftonline.com/..."`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Microsoft callback
|
||||
type MicrosoftCallbackResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_identity"`
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Attributes struct {
|
||||
Provider string `json:"provider" example:"microsoft"`
|
||||
ProviderSubject string `json:"provider_subject" example:"00000000-0000-0000-0000-000000000000"`
|
||||
Email string `json:"email" example:"user@example.com"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type SSOLinkAttributes struct {
|
||||
Provider string `json:"provider" validate:"required,eq=microsoft" example:"microsoft"`
|
||||
Code string `json:"code" validate:"required" example:"0.AXkA..."`
|
||||
}
|
||||
|
||||
type SSOLinkData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_sso_link" example:"auth_sso_link"`
|
||||
Attributes SSOLinkAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SSOLinkRequest struct {
|
||||
Data SSOLinkData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type SSOLinkResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_sso_link"`
|
||||
Attributes struct {
|
||||
Provider string `json:"provider" example:"microsoft"`
|
||||
ProviderSubject string `json:"provider_subject" example:"00000000-0000-0000-0000-000000000000"`
|
||||
Email string `json:"email" example:"user@example.com"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type SSOUnlinkAttributes struct {
|
||||
Provider string `json:"provider" validate:"required,eq=microsoft" example:"microsoft"`
|
||||
}
|
||||
|
||||
type SSOUnlinkData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_sso_unlink" example:"auth_sso_unlink"`
|
||||
Attributes SSOUnlinkAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type SSOUnlinkRequest struct {
|
||||
Data SSOUnlinkData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type SSOUnlinkResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_sso_unlink"`
|
||||
Attributes struct {
|
||||
Provider string `json:"provider" example:"microsoft"`
|
||||
Unlinked bool `json:"unlinked" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// WebAuthn begin response
|
||||
type WebAuthnBeginResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_webauthn_register_options"`
|
||||
Attributes struct {
|
||||
ChallengeToken string `json:"challenge_token" example:"kP8k2..."`
|
||||
ChallengeTTLMS int64 `json:"challenge_ttl_ms" example:"300000"`
|
||||
PublicKey map[string]interface{} `json:"public_key"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// TOTP setup
|
||||
type TOTPSetupAttributes struct {
|
||||
UserID string `json:"user_id" validate:"required" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Email string `json:"email" validate:"required,email" example:"user@example.com"`
|
||||
}
|
||||
|
||||
type TOTPSetupData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_totp_setup" example:"auth_totp_setup"`
|
||||
Attributes TOTPSetupAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPSetupRequest struct {
|
||||
Data TOTPSetupData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPSetupResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_totp_setup"`
|
||||
Attributes struct {
|
||||
Secret string `json:"secret" example:"JBSWY3DPEHPK3PXP"`
|
||||
OtpauthURL string `json:"otpauth_url" example:"otpauth://totp/Wucher:user@example.com?..."`
|
||||
Issuer string `json:"issuer" example:"Wucher"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// TOTP verify
|
||||
type TOTPVerifyAttributes struct {
|
||||
ChallengeToken string `json:"challenge_token" validate:"required" example:"kP8k2..."`
|
||||
Code string `json:"code" validate:"required,len=6" example:"123456"`
|
||||
}
|
||||
|
||||
type TOTPVerifyData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_totp_verify" example:"auth_totp_verify"`
|
||||
Attributes TOTPVerifyAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPVerifyRequest struct {
|
||||
Data TOTPVerifyData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// TOTP confirm (enable)
|
||||
type TOTPConfirmAttributes struct {
|
||||
UserID string `json:"user_id" validate:"required" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Code string `json:"code" validate:"required,len=6" example:"123456"`
|
||||
}
|
||||
|
||||
type TOTPConfirmData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_totp_confirm" example:"auth_totp_confirm"`
|
||||
Attributes TOTPConfirmAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPConfirmRequest struct {
|
||||
Data TOTPConfirmData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Disable TOTP
|
||||
type TOTPDisableAttributes struct {
|
||||
UserID string `json:"user_id" validate:"required" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
}
|
||||
|
||||
type TOTPDisableData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_totp_disable" example:"auth_totp_disable"`
|
||||
Attributes TOTPDisableAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPDisableRequest struct {
|
||||
Data TOTPDisableData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// TOTP reset setup
|
||||
type TOTPResetSetupData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_totp_reset_setup" example:"auth_totp_reset_setup"`
|
||||
Attributes ReauthAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPResetSetupRequest struct {
|
||||
Data TOTPResetSetupData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
type TOTPResetSetupResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_totp_reset_setup"`
|
||||
Attributes struct {
|
||||
Reset bool `json:"reset" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type AuthSessionItem struct {
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
DeviceName string `json:"device_name" example:"Chrome on macOS"`
|
||||
UserAgent string `json:"user_agent,omitempty" example:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ..."`
|
||||
IPAddress string `json:"ip_address,omitempty" example:"127.0.0.1"`
|
||||
CreatedAt string `json:"created_at" example:"2026-03-13T12:00:00Z"`
|
||||
LastActiveAt string `json:"last_active_at" example:"2026-03-13T12:10:00Z"`
|
||||
ActiveNow bool `json:"active_now" example:"true"`
|
||||
}
|
||||
|
||||
type AuthSessionsResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_sessions"`
|
||||
Attributes struct {
|
||||
Sessions []AuthSessionItem `json:"sessions"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type AuthSessionDeleteResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_session_delete"`
|
||||
Attributes struct {
|
||||
Deleted bool `json:"deleted" example:"true"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Update timezone
|
||||
type TimezoneUpdateAttributes struct {
|
||||
Timezone string `json:"timezone" validate:"required" example:"Asia/Jakarta"`
|
||||
}
|
||||
|
||||
type TimezoneUpdateData struct {
|
||||
Type string `json:"type" validate:"required,eq=auth_timezone_update" example:"auth_timezone_update"`
|
||||
Attributes TimezoneUpdateAttributes `json:"attributes" validate:"required"`
|
||||
}
|
||||
|
||||
type TimezoneUpdateRequest struct {
|
||||
Data TimezoneUpdateData `json:"data" validate:"required"`
|
||||
}
|
||||
|
||||
// Token response
|
||||
type TokenResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"auth_tokens"`
|
||||
Attributes struct {
|
||||
AccessTokenExpiresIn int64 `json:"access_expires_in" example:"900"`
|
||||
RefreshTokenExpiresIn int64 `json:"refresh_expires_in" example:"2592000"`
|
||||
} `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// User response
|
||||
type UserAttributes struct {
|
||||
Email string `json:"email" example:"user@example.com"`
|
||||
Username string `json:"username,omitempty" example:"john.doe"`
|
||||
FirstName string `json:"first_name" example:"John"`
|
||||
LastName string `json:"last_name" example:"Doe"`
|
||||
MobilePhone string `json:"mobile_phone,omitempty" example:"+628123456789"`
|
||||
Timezone string `json:"timezone" example:"Asia/Jakarta"`
|
||||
ProfilePicture *UserImage `json:"profile_picture,omitempty"`
|
||||
RoleID string `json:"role_id,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
RoleIDs []string `json:"role_ids,omitempty" example:"[\"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d\",\"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9e\"]"`
|
||||
CreatedBy string `json:"created_by,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
EmailVerifiedAt string `json:"email_verified_at,omitempty" example:"2026-02-05T10:00:00Z"`
|
||||
TOTPEnabled bool `json:"totp_enabled" example:"false"`
|
||||
IsPreviouslyConfigured bool `json:"is_previously_configured" example:"false"`
|
||||
WebAuthnConfigured bool `json:"webauthn_configured" example:"false"`
|
||||
LinkedSSO bool `json:"linked_sso" example:"false"`
|
||||
PINConfigured bool `json:"pin_configured" example:"false"`
|
||||
Role RoleMini `json:"role,omitempty"`
|
||||
Roles []RoleMini `json:"roles,omitempty"`
|
||||
}
|
||||
|
||||
type UserImage struct {
|
||||
UUID string `json:"uuid,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9f"`
|
||||
DownloadURL string `json:"download_url,omitempty" example:"https://example.com/presigned-url"`
|
||||
ThumbnailDownloadURL string `json:"thumbnail_download_url,omitempty" example:"https://example.com/presigned-thumb-url"`
|
||||
OriginalSizeBytes *int64 `json:"original_size_bytes,omitempty" example:"1024000"`
|
||||
}
|
||||
|
||||
type UserFoto struct {
|
||||
UUID string `json:"uuid,omitempty" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9f"`
|
||||
DownloadURL string `json:"download_url,omitempty" example:"https://storage.example.com/base/lude.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Signature=abc123"`
|
||||
ThumbnailDownloadURL string `json:"thumbnail_download_url,omitempty" example:"https://storage.example.com/base/lude.thumb.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Signature=abc123"`
|
||||
OriginalSizeBytes *int64 `json:"original_size_bytes,omitempty" example:"1024000"`
|
||||
}
|
||||
|
||||
type RoleMini struct {
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Name string `json:"name" example:"admin"`
|
||||
Description string `json:"description,omitempty" example:"Full access to all resources."`
|
||||
}
|
||||
|
||||
type PermissionMini struct {
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9a"`
|
||||
Name string `json:"name" example:"View Users"`
|
||||
Key string `json:"key" example:"users.read"`
|
||||
Description string `json:"description,omitempty" example:"Permission to view users."`
|
||||
RequiresPIN bool `json:"requires_pin" example:"false"`
|
||||
}
|
||||
|
||||
// Auth current-user payload used by /auth/login and /auth/me endpoints.
|
||||
type AuthCurrentUserAttributes struct {
|
||||
Email string `json:"email" example:"user@example.com"`
|
||||
EmailSSO string `json:"email_sso,omitempty" example:"user.sso@example.com"`
|
||||
FirstName string `json:"first_name" example:"John"`
|
||||
LastName string `json:"last_name" example:"Doe"`
|
||||
MobilePhone string `json:"mobile_phone,omitempty" example:"+628123456789"`
|
||||
Timezone string `json:"timezone" example:"Asia/Jakarta"`
|
||||
Foto *UserFoto `json:"foto,omitempty"`
|
||||
EmailVerifiedAt string `json:"email_verified_at,omitempty" example:"2026-02-05T10:00:00Z"`
|
||||
Roles []RoleMini `json:"roles,omitempty"`
|
||||
Permissions []PermissionMini `json:"permissions,omitempty"`
|
||||
PermissionModules []PermissionGroupResource `json:"permission_modules,omitempty"`
|
||||
TOTPEnabled bool `json:"totp_enabled" example:"false"`
|
||||
IsPreviouslyConfigured bool `json:"is_previously_configured" example:"false"`
|
||||
WebAuthnConfigured bool `json:"webauthn_configured" example:"false"`
|
||||
LinkedSSO bool `json:"linked_sso" example:"false"`
|
||||
PINConfigured bool `json:"pin_configured" example:"false"`
|
||||
PINBlocked bool `json:"pin_blocked" example:"false"`
|
||||
LoginMethod string `json:"login_method,omitempty" example:"email"`
|
||||
AuthProvider string `json:"auth_provider,omitempty" example:"email"`
|
||||
MicrosoftScope string `json:"microsoft_scope,omitempty" example:"openid profile email offline_access User.Read"`
|
||||
DULBases []DULBase `json:"dul_bases,omitempty"`
|
||||
}
|
||||
|
||||
type AuthCurrentUserResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"user"`
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Attributes AuthCurrentUserAttributes `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type UserResponse struct {
|
||||
Data struct {
|
||||
Type string `json:"type" example:"user"`
|
||||
ID string `json:"id" example:"018f3a5c-7a6f-7c2a-8d4a-4b5b1f6c8e9d"`
|
||||
Attributes UserAttributes `json:"attributes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
// Error response for Swagger
|
||||
type ErrorResponse struct {
|
||||
Errors []struct {
|
||||
Status string `json:"status" example:"422"`
|
||||
Title string `json:"title" example:"Validation error"`
|
||||
Detail string `json:"detail" example:"email is required"`
|
||||
Source struct {
|
||||
Pointer string `json:"pointer" example:"/data/attributes/email"`
|
||||
} `json:"source"`
|
||||
} `json:"errors"`
|
||||
}
|
||||
Reference in New Issue
Block a user