feat: add authorization

This commit is contained in:
2026-08-13 15:03:59 +03:00
parent 1e13adabd3
commit 3448fea140
28 changed files with 4504 additions and 3707 deletions
+4 -1
View File
@@ -3,4 +3,7 @@ import createClient from "openapi-fetch";
import { apiBaseUrl } from "./config";
import type { paths } from "./generated/schema";
export const apiClient = createClient<paths>({ baseUrl: apiBaseUrl });
export const apiClient = createClient<paths>({
baseUrl: apiBaseUrl,
credentials: "include",
});
+157 -14
View File
@@ -4,14 +4,78 @@
*/
export interface paths {
"/api/v1": {
"/api/v1/auth/register": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["AppController_getHello"];
get?: never;
put?: never;
post: operations["AuthController_register"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/auth/login": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["AuthController_login"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/auth/refresh": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["AuthController_refresh"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/auth/logout": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["AuthController_logout"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/auth/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["AuthController_me"];
put?: never;
post?: never;
delete?: never;
@@ -24,13 +88,19 @@ export interface paths {
export type webhooks = Record<string, never>;
export interface components {
schemas: {
SafeErrorResponseDto: {
/** @example 500 */
statusCode: number;
/** @example Internal server error */
message: string;
/** @example /api/v1 */
path: string;
CredentialsDto: {
/** @example user@example.com */
email: string;
/** @example a secure password */
password: string;
};
UserDto: {
id: string;
email: string;
};
AuthenticationDto: {
accessToken: string;
user: components["schemas"]["UserDto"];
};
};
responses: never;
@@ -41,7 +111,53 @@ export interface components {
}
export type $defs = Record<string, never>;
export interface operations {
AppController_getHello: {
AuthController_register: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CredentialsDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AuthenticationDto"];
};
};
};
};
AuthController_login: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CredentialsDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AuthenticationDto"];
};
};
};
};
AuthController_refresh: {
parameters: {
query?: never;
header?: never;
@@ -55,16 +171,43 @@ export interface operations {
[name: string]: unknown;
};
content: {
"application/json": string;
"application/json": components["schemas"]["AuthenticationDto"];
};
};
/** @description Internal server error */
500: {
};
};
AuthController_logout: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_me: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SafeErrorResponseDto"];
"application/json": components["schemas"]["UserDto"];
};
};
};
+1
View File
@@ -10,4 +10,5 @@ void i18n.use(initReactI18next).init({
interpolation: { escapeValue: false },
});
export { validationMessage } from "./zod";
export { i18n };
+16 -1
View File
@@ -2,7 +2,22 @@ export const ru = {
translation: {
appName: "WealthLedger",
navigation: { accounts: "Счета", settings: "Настройки" },
auth: { login: "Вход", register: "Регистрация" },
auth: {
login: "Вход",
register: "Регистрация",
email: "Email",
password: "Пароль",
passwordConfirmation: "Подтвердите пароль",
noAccount: "Нет аккаунта? Зарегистрироваться",
haveAccount: "Уже есть аккаунт? Войти",
requestError: "Не удалось выполнить запрос. Попробуйте ещё раз.",
logout: "Выйти",
validation: {
invalidEmail: "Некорректный email",
invalidPasswordLength: "Пароль должен содержать от 12 до 72 байт",
passwordsDoNotMatch: "Пароли не совпадают",
},
},
accounts: { title: "Счета" },
account: { title: "Счет" },
settings: { title: "Настройки" },
+9
View File
@@ -0,0 +1,9 @@
import type { ParseKeys } from "i18next";
import { i18n } from ".";
export function validationMessage(
key: ParseKeys,
): (_value: unknown) => { message: string } {
return () => ({ message: i18n.t(key) });
}