diff --git a/backend/app/schemas/users.py b/backend/app/schemas/users.py old mode 100644 new mode 100755 index d4b4b92..3f2c265 --- a/backend/app/schemas/users.py +++ b/backend/app/schemas/users.py @@ -86,6 +86,8 @@ class Token(BaseModel): access_token: str refresh_token: Optional[str] = None token_type: str = "bearer" + user: "UserResponse" # Forward reference since UserResponse is defined above + expires_in: Optional[int] = None # Token expiration in seconds class TokenPayload(BaseModel): diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py index cc3a46b..816d6bf 100755 --- a/backend/app/services/auth_service.py +++ b/backend/app/services/auth_service.py @@ -15,7 +15,7 @@ from app.core.auth import ( TokenInvalidError ) from app.models.user import User -from app.schemas.users import Token, UserCreate +from app.schemas.users import Token, UserCreate, UserResponse logger = logging.getLogger(__name__) @@ -118,7 +118,7 @@ class AuthService: user: User to create tokens for Returns: - Token object with access and refresh tokens + Token object with access and refresh tokens and user info """ # Generate claims claims = { @@ -137,9 +137,14 @@ class AuthService: subject=str(user.id) ) + # Convert User model to UserResponse schema + user_response = UserResponse.model_validate(user) + return Token( access_token=access_token, - refresh_token=refresh_token + refresh_token=refresh_token, + user=user_response, + expires_in=86400 # 24 hours in seconds (matching ACCESS_TOKEN_EXPIRE_MINUTES) ) @staticmethod diff --git a/frontend/src/lib/api/generated/.eslintrc.json b/frontend/src/lib/api/generated/.eslintrc.json deleted file mode 100644 index 7d1119e..0000000 --- a/frontend/src/lib/api/generated/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "root": true, - "ignorePatterns": ["*"], - "rules": {} -} diff --git a/frontend/src/lib/api/generated/client.gen.ts b/frontend/src/lib/api/generated/client.gen.ts index cab3c70..e9cc13e 100644 --- a/frontend/src/lib/api/generated/client.gen.ts +++ b/frontend/src/lib/api/generated/client.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ import { type ClientOptions, type Config, createClient, createConfig } from './client'; import type { ClientOptions as ClientOptions2 } from './types.gen'; diff --git a/frontend/src/lib/api/generated/client/index.ts b/frontend/src/lib/api/generated/client/index.ts index cff1d39..b708e11 100644 --- a/frontend/src/lib/api/generated/client/index.ts +++ b/frontend/src/lib/api/generated/client/index.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ export type { Auth } from '../core/auth.gen'; export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; diff --git a/frontend/src/lib/api/generated/core/auth.gen.ts b/frontend/src/lib/api/generated/core/auth.gen.ts index f8a7326..27f20d0 100644 --- a/frontend/src/lib/api/generated/core/auth.gen.ts +++ b/frontend/src/lib/api/generated/core/auth.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ export type AuthToken = string | undefined; diff --git a/frontend/src/lib/api/generated/core/params.gen.ts b/frontend/src/lib/api/generated/core/params.gen.ts index 71c88e8..2e0c4ef 100644 --- a/frontend/src/lib/api/generated/core/params.gen.ts +++ b/frontend/src/lib/api/generated/core/params.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ type Slot = 'body' | 'headers' | 'path' | 'query'; diff --git a/frontend/src/lib/api/generated/core/pathSerializer.gen.ts b/frontend/src/lib/api/generated/core/pathSerializer.gen.ts index 8d99931..d926987 100644 --- a/frontend/src/lib/api/generated/core/pathSerializer.gen.ts +++ b/frontend/src/lib/api/generated/core/pathSerializer.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ interface SerializeOptions extends SerializePrimitiveOptions, diff --git a/frontend/src/lib/api/generated/core/queryKeySerializer.gen.ts b/frontend/src/lib/api/generated/core/queryKeySerializer.gen.ts index d3bb683..af7914f 100644 --- a/frontend/src/lib/api/generated/core/queryKeySerializer.gen.ts +++ b/frontend/src/lib/api/generated/core/queryKeySerializer.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ /** * JSON-friendly union that mirrors what Pinia Colada can hash. diff --git a/frontend/src/lib/api/generated/core/types.gen.ts b/frontend/src/lib/api/generated/core/types.gen.ts index 643c070..cfc36cc 100644 --- a/frontend/src/lib/api/generated/core/types.gen.ts +++ b/frontend/src/lib/api/generated/core/types.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ import type { Auth, AuthToken } from './auth.gen'; import type { diff --git a/frontend/src/lib/api/generated/core/utils.gen.ts b/frontend/src/lib/api/generated/core/utils.gen.ts index 0b5389d..3bf3fcf 100644 --- a/frontend/src/lib/api/generated/core/utils.gen.ts +++ b/frontend/src/lib/api/generated/core/utils.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; import { diff --git a/frontend/src/lib/api/generated/index.ts b/frontend/src/lib/api/generated/index.ts index c352c10..62ab531 100644 --- a/frontend/src/lib/api/generated/index.ts +++ b/frontend/src/lib/api/generated/index.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ export type * from './types.gen'; export * from './sdk.gen'; diff --git a/frontend/src/lib/api/generated/sdk.gen.ts b/frontend/src/lib/api/generated/sdk.gen.ts index c97d746..ce0e472 100644 --- a/frontend/src/lib/api/generated/sdk.gen.ts +++ b/frontend/src/lib/api/generated/sdk.gen.ts @@ -1,8 +1,9 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ import { type Client, type Options as Options2, type TDataShape, urlSearchParamsBodySerializer } from './client'; import { client } from './client.gen'; -import type { AdminActivateUserData, AdminActivateUserErrors, AdminActivateUserResponses, AdminAddOrganizationMemberData, AdminAddOrganizationMemberErrors, AdminAddOrganizationMemberResponses, AdminBulkUserActionData, AdminBulkUserActionErrors, AdminBulkUserActionResponses, AdminCreateOrganizationData, AdminCreateOrganizationErrors, AdminCreateOrganizationResponses, AdminCreateUserData, AdminCreateUserErrors, AdminCreateUserResponses, AdminDeactivateUserData, AdminDeactivateUserErrors, AdminDeactivateUserResponses, AdminDeleteOrganizationData, AdminDeleteOrganizationErrors, AdminDeleteOrganizationResponses, AdminDeleteUserData, AdminDeleteUserErrors, AdminDeleteUserResponses, AdminGetOrganizationData, AdminGetOrganizationErrors, AdminGetOrganizationResponses, AdminGetUserData, AdminGetUserErrors, AdminGetUserResponses, AdminListOrganizationMembersData, AdminListOrganizationMembersErrors, AdminListOrganizationMembersResponses, AdminListOrganizationsData, AdminListOrganizationsErrors, AdminListOrganizationsResponses, AdminListUsersData, AdminListUsersErrors, AdminListUsersResponses, AdminRemoveOrganizationMemberData, AdminRemoveOrganizationMemberErrors, AdminRemoveOrganizationMemberResponses, AdminUpdateOrganizationData, AdminUpdateOrganizationErrors, AdminUpdateOrganizationResponses, AdminUpdateUserData, AdminUpdateUserErrors, AdminUpdateUserResponses, ChangeCurrentUserPasswordData, ChangeCurrentUserPasswordErrors, ChangeCurrentUserPasswordResponses, CleanupExpiredSessionsData, CleanupExpiredSessionsResponses, ConfirmPasswordResetData, ConfirmPasswordResetErrors, ConfirmPasswordResetResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, GetCurrentUserInfoData, GetCurrentUserInfoResponses, GetCurrentUserProfileData, GetCurrentUserProfileResponses, GetMyOrganizationsData, GetMyOrganizationsErrors, GetMyOrganizationsResponses, GetOrganizationData, GetOrganizationErrors, GetOrganizationMembersData, GetOrganizationMembersErrors, GetOrganizationMembersResponses, GetOrganizationResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, HealthCheckData, HealthCheckResponses, ListMySessionsData, ListMySessionsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, LoginData, LoginErrors, LoginOauthData, LoginOauthErrors, LoginOauthResponses, LoginResponses, LogoutAllData, LogoutAllResponses, LogoutData, LogoutErrors, LogoutResponses, RefreshTokenData, RefreshTokenErrors, RefreshTokenResponses, RegisterData, RegisterErrors, RegisterResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, RevokeSessionData, RevokeSessionErrors, RevokeSessionResponses, RootGetData, RootGetResponses, UpdateCurrentUserData, UpdateCurrentUserErrors, UpdateCurrentUserResponses, UpdateOrganizationData, UpdateOrganizationErrors, UpdateOrganizationResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses } from './types.gen'; +import type { AdminActivateUserData, AdminActivateUserErrors, AdminActivateUserResponses, AdminAddOrganizationMemberData, AdminAddOrganizationMemberErrors, AdminAddOrganizationMemberResponses, AdminBulkUserActionData, AdminBulkUserActionErrors, AdminBulkUserActionResponses, AdminCreateOrganizationData, AdminCreateOrganizationErrors, AdminCreateOrganizationResponses, AdminCreateUserData, AdminCreateUserErrors, AdminCreateUserResponses, AdminDeactivateUserData, AdminDeactivateUserErrors, AdminDeactivateUserResponses, AdminDeleteOrganizationData, AdminDeleteOrganizationErrors, AdminDeleteOrganizationResponses, AdminDeleteUserData, AdminDeleteUserErrors, AdminDeleteUserResponses, AdminGetOrganizationData, AdminGetOrganizationErrors, AdminGetOrganizationResponses, AdminGetUserData, AdminGetUserErrors, AdminGetUserResponses, AdminListOrganizationMembersData, AdminListOrganizationMembersErrors, AdminListOrganizationMembersResponses, AdminListOrganizationsData, AdminListOrganizationsErrors, AdminListOrganizationsResponses, AdminListUsersData, AdminListUsersErrors, AdminListUsersResponses, AdminRemoveOrganizationMemberData, AdminRemoveOrganizationMemberErrors, AdminRemoveOrganizationMemberResponses, AdminUpdateOrganizationData, AdminUpdateOrganizationErrors, AdminUpdateOrganizationResponses, AdminUpdateUserData, AdminUpdateUserErrors, AdminUpdateUserResponses, ChangeCurrentUserPasswordData, ChangeCurrentUserPasswordErrors, ChangeCurrentUserPasswordResponses, CleanupExpiredSessionsData, CleanupExpiredSessionsResponses, ConfirmPasswordResetData, ConfirmPasswordResetErrors, ConfirmPasswordResetResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, GetCurrentUserProfileData, GetCurrentUserProfileResponses, GetMyOrganizationsData, GetMyOrganizationsErrors, GetMyOrganizationsResponses, GetOrganizationData, GetOrganizationErrors, GetOrganizationMembersData, GetOrganizationMembersErrors, GetOrganizationMembersResponses, GetOrganizationResponses, GetUserByIdData, GetUserByIdErrors, GetUserByIdResponses, HealthCheckData, HealthCheckResponses, ListMySessionsData, ListMySessionsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, LoginData, LoginErrors, LoginOauthData, LoginOauthErrors, LoginOauthResponses, LoginResponses, LogoutAllData, LogoutAllResponses, LogoutData, LogoutErrors, LogoutResponses, RefreshTokenData, RefreshTokenErrors, RefreshTokenResponses, RegisterData, RegisterErrors, RegisterResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, RevokeSessionData, RevokeSessionErrors, RevokeSessionResponses, RootGetData, RootGetResponses, UpdateCurrentUserData, UpdateCurrentUserErrors, UpdateCurrentUserResponses, UpdateOrganizationData, UpdateOrganizationErrors, UpdateOrganizationResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses } from './types.gen'; export type Options = Options2 & { /** @@ -129,27 +130,6 @@ export const refreshToken = (options: Opti }); }; -/** - * Get Current User Info - * - * Get current user information. - * - * Requires authentication. - */ -export const getCurrentUserInfo = (options?: Options) => { - return (options?.client ?? client).get({ - responseType: 'json', - security: [ - { - scheme: 'bearer', - type: 'http' - } - ], - url: '/api/v1/auth/me', - ...options - }); -}; - /** * Request Password Reset * diff --git a/frontend/src/lib/api/generated/types.gen.ts b/frontend/src/lib/api/generated/types.gen.ts index 800c0e1..3a2bc46 100644 --- a/frontend/src/lib/api/generated/types.gen.ts +++ b/frontend/src/lib/api/generated/types.gen.ts @@ -1,4 +1,5 @@ // This file is auto-generated by @hey-api/openapi-ts +/* eslint-disable */ export type ClientOptions = { baseURL: `${string}://${string}` | (string & {}); @@ -560,6 +561,11 @@ export type Token = { * Token Type */ token_type?: string; + user: UserResponse; + /** + * Expires In + */ + expires_in?: number | null; }; /** @@ -650,6 +656,10 @@ export type UserUpdate = { * Phone Number */ phone_number?: string | null; + /** + * Password + */ + password?: string | null; /** * Preferences */ @@ -660,6 +670,10 @@ export type UserUpdate = { * Is Active */ is_active?: boolean | null; + /** + * Is Superuser + */ + is_superuser?: boolean | null; }; /** @@ -810,22 +824,6 @@ export type RefreshTokenResponses = { export type RefreshTokenResponse = RefreshTokenResponses[keyof RefreshTokenResponses]; -export type GetCurrentUserInfoData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/auth/me'; -}; - -export type GetCurrentUserInfoResponses = { - /** - * Successful Response - */ - 200: UserResponse; -}; - -export type GetCurrentUserInfoResponse = GetCurrentUserInfoResponses[keyof GetCurrentUserInfoResponses]; - export type RequestPasswordResetData = { body: PasswordResetRequest; path?: never; diff --git a/frontend/src/lib/api/hooks/useAuth.ts b/frontend/src/lib/api/hooks/useAuth.ts old mode 100644 new mode 100755 index 6b0879d..d1a4ae4 --- a/frontend/src/lib/api/hooks/useAuth.ts +++ b/frontend/src/lib/api/hooks/useAuth.ts @@ -15,7 +15,7 @@ import { register, logout, logoutAll, - getCurrentUserInfo, + getCurrentUserProfile, requestPasswordReset, confirmPasswordReset, changeCurrentUserPassword, @@ -55,7 +55,7 @@ export function useMe() { const query = useQuery({ queryKey: authKeys.me, queryFn: async (): Promise => { - const response = await getCurrentUserInfo({ + const response = await getCurrentUserProfile({ throwOnError: true, }); return response.data as User;