init push

This commit is contained in:
2026-07-16 22:16:45 +07:00
commit 8b068bdb10
1021 changed files with 332816 additions and 0 deletions

View 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"`
}