From db558c87d1b6941c42c118f61045dcab38af5ce0 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Mon, 20 Jul 2026 22:49:45 +0700 Subject: [PATCH] format --- src/App.vue | 2 - src/api/auth_client.ts | 50 +- .../crabs/evening_detective_server/client.ts | 78 +- .../crabs/evening_detective_server/index.ts | 1072 +++++++++-------- src/assets/main.css | 4 +- src/components/GamesPage.vue | 6 +- src/components/HeaderMenu.vue | 206 ++-- src/components/LoginPage.vue | 78 +- src/components/OfficePage.vue | 34 +- src/components/PlaceBlock.vue | 223 ++-- src/components/ScenariosEditorPage.vue | 454 +++---- src/components/ScenariosPage.vue | 183 +-- src/components/UsersPage.vue | 6 +- src/router/index.ts | 2 +- src/stores/auth.ts | 394 +++--- src/views/GamesView.vue | 2 +- src/views/HomeView.vue | 14 +- src/views/LoginView.vue | 2 +- src/views/OfficeView.vue | 2 +- src/views/PrivacyPolicyView.vue | 4 +- src/views/ScenariosEditorView.vue | 2 +- src/views/ScenariosView.vue | 2 +- src/views/UserAgreementView.vue | 4 +- src/views/UsersView.vue | 2 +- 24 files changed, 1464 insertions(+), 1362 deletions(-) diff --git a/src/App.vue b/src/App.vue index b9b95fd..1202918 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,11 +6,9 @@ import { RouterView } from 'vue-router' diff --git a/src/api/auth_client.ts b/src/api/auth_client.ts index 2dbcdfe..7e9b7ae 100644 --- a/src/api/auth_client.ts +++ b/src/api/auth_client.ts @@ -1,39 +1,35 @@ -import { useAuthStore } from "@/stores/auth"; +import { useAuthStore } from '@/stores/auth' -import { createEveningDetectiveServerClient, type EveningDetectiveServer } from "./generated/crabs/evening_detective_server"; -import { createHttpHandler } from "./generated/crabs/evening_detective_server/client"; +import { + createEveningDetectiveServerClient, + type EveningDetectiveServer, +} from './generated/crabs/evening_detective_server' +import { createHttpHandler } from './generated/crabs/evening_detective_server/client' export function getAuthClient() { - const authStore = useAuthStore(); - return buildAuthClient(authStore.refreshTokenAction, authStore.getToken) + const authStore = useAuthStore() + return buildAuthClient(authStore.refreshTokenAction, authStore.getToken) } function buildAuthClient( - refreshTokens: () => Promise, - getToken: () => string | null, + refreshTokens: () => Promise, + getToken: () => string | null, ): EveningDetectiveServer { - return createEveningDetectiveServerClient( - createAuthHttpHandler( - refreshTokens, - createHttpHandler( - getToken, - ) - ) - ) + return createEveningDetectiveServerClient( + createAuthHttpHandler(refreshTokens, createHttpHandler(getToken)), + ) } function createAuthHttpHandler( - refreshTokens: () => Promise, - handler: (request: { path: string, method: string, body: string | null }) => Promise -): (request: { path: string, method: string, body: string | null }) => Promise { - return async ( - request: { path: string, method: string, body: string | null }, - ) => { - try { - return await handler(request) - } catch { - await refreshTokens() - return await handler(request) - } + refreshTokens: () => Promise, + handler: (request: { path: string; method: string; body: string | null }) => Promise, +): (request: { path: string; method: string; body: string | null }) => Promise { + return async (request: { path: string; method: string; body: string | null }) => { + try { + return await handler(request) + } catch { + await refreshTokens() + return await handler(request) } + } } diff --git a/src/api/generated/crabs/evening_detective_server/client.ts b/src/api/generated/crabs/evening_detective_server/client.ts index efd978a..0eb5e71 100644 --- a/src/api/generated/crabs/evening_detective_server/client.ts +++ b/src/api/generated/crabs/evening_detective_server/client.ts @@ -1,58 +1,50 @@ -import { createEveningDetectiveServerClient, type EveningDetectiveServer } from "."; +import { createEveningDetectiveServerClient, type EveningDetectiveServer } from '.' -export function buildClient( - getToken?: () => string | null, -): EveningDetectiveServer { - return createEveningDetectiveServerClient( - createHttpHandler( - getToken, - ) - ) +export function buildClient(getToken?: () => string | null): EveningDetectiveServer { + return createEveningDetectiveServerClient(createHttpHandler(getToken)) } export function createHttpHandler( - getToken?: () => string | null, -): (request: { path: string, method: string, body: string | null }) => Promise { - return async ( - request: { path: string, method: string, body: string | null }, - ) => { - const baseURL = getURL() + getToken?: () => string | null, +): (request: { path: string; method: string; body: string | null }) => Promise { + return async (request: { path: string; method: string; body: string | null }) => { + const baseURL = getURL() - // Формируем полный URL - const url = `${baseURL}/${request.path}`; + // Формируем полный URL + const url = `${baseURL}/${request.path}` - // Подготавливаем заголовки - const headers: Record = { - 'Content-Type': 'application/json', - }; + // Подготавливаем заголовки + const headers: Record = { + 'Content-Type': 'application/json', + } - // Добавляем токен, если он есть - const token = getToken?.(); - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } + // Добавляем токен, если он есть + const token = getToken?.() + if (token) { + headers['Authorization'] = `Bearer ${token}` + } - // Делаем запрос - const response = await fetch(url, { - method: request.method, - headers, - body: request.body, // body уже JSON-строка из генератора - }); + // Делаем запрос + const response = await fetch(url, { + method: request.method, + headers, + body: request.body, // body уже JSON-строка из генератора + }) - if (response.status == 401) { - throw new Error("unauthorized"); - } + if (response.status == 401) { + throw new Error('unauthorized') + } - // Парсим ответ - const data = await response.json(); + // Парсим ответ + const data = await response.json() - // Возвращаем в формате, который ожидает генератор - return data; - }; + // Возвращаем в формате, который ожидает генератор + return data + } } export function getURL(): string { - const url = import.meta.env.VITE_API_URL || "http://localhost:8090" - // console.log(url) - return url + const url = import.meta.env.VITE_API_URL || 'http://localhost:8090' + // console.log(url) + return url } diff --git a/src/api/generated/crabs/evening_detective_server/index.ts b/src/api/generated/crabs/evening_detective_server/index.ts index 20f140c..2df8771 100644 --- a/src/api/generated/crabs/evening_detective_server/index.ts +++ b/src/api/generated/crabs/evening_detective_server/index.ts @@ -1,704 +1,767 @@ // Code generated by protoc-gen-typescript-http. DO NOT EDIT. - + // @ts-nocheck -export type PingReq = { -}; +export type PingReq = {} -export type PingRsp = { -}; +export type PingRsp = {} export type EchoReq = { - text: string | undefined; -}; + text: string | undefined +} export type EchoRsp = { - text: string | undefined; -}; + text: string | undefined +} export type SignupReq = { - username: string | undefined; - email: string | undefined; -}; + username: string | undefined + email: string | undefined +} export type SignupRsp = { - error: string | undefined; -}; + error: string | undefined +} export type RefreshPasswordReq = { - email: string | undefined; -}; + email: string | undefined +} export type RefreshPasswordRsp = { - error: string | undefined; -}; + error: string | undefined +} export type LoginReq = { - email: string | undefined; - password: string | undefined; -}; + email: string | undefined + password: string | undefined +} export type LoginRsp = { - error: string | undefined; - accessToken: string | undefined; - refreshToken: string | undefined; -}; + error: string | undefined + accessToken: string | undefined + refreshToken: string | undefined +} export type RefreshReq = { - refreshToken: string | undefined; -}; + refreshToken: string | undefined +} export type RefreshRsp = { - error: string | undefined; - accessToken: string | undefined; - refreshToken: string | undefined; -}; + error: string | undefined + accessToken: string | undefined + refreshToken: string | undefined +} -export type GetUsersReq = { -}; +export type GetUsersReq = {} export type GetUsersRsp = { - error: string | undefined; - users: User[] | undefined; -}; + error: string | undefined + users: User[] | undefined +} export type User = { - id: number | undefined; - username: string | undefined; - email: string | undefined; - roles: string[] | undefined; - isActive: boolean | undefined; - createdAt: wellKnownTimestamp | undefined; -}; + id: number | undefined + username: string | undefined + email: string | undefined + roles: string[] | undefined + isActive: boolean | undefined + createdAt: wellKnownTimestamp | undefined +} // Encoded using RFC 3339, where generated output will always be Z-normalized // and uses 0, 3, 6 or 9 fractional digits. // Offsets other than "Z" are also accepted. -type wellKnownTimestamp = string; +type wellKnownTimestamp = string export type GetUserByIdReq = { - id: number | undefined; -}; + id: number | undefined +} export type GetUserByIdRsp = { - error: string | undefined; - user: User | undefined; -}; + error: string | undefined + user: User | undefined +} -export type GetMeReq = { -}; +export type GetMeReq = {} export type GetMeRsp = { - error: string | undefined; - user: User | undefined; -}; + error: string | undefined + user: User | undefined +} export type AddUserRoleReq = { - id: number | undefined; - role: string | undefined; -}; + id: number | undefined + role: string | undefined +} export type AddUserRoleRsp = { - error: string | undefined; -}; + error: string | undefined +} export type DeleteUserRoleReq = { - id: number | undefined; - role: string | undefined; -}; + id: number | undefined + role: string | undefined +} export type DeleteUserRoleRsp = { - error: string | undefined; -}; + error: string | undefined +} -export type GetPermissionsReq = { -}; +export type GetPermissionsReq = {} export type GetPermissionsRsp = { - error: string | undefined; - permissions: string[] | undefined; -}; + error: string | undefined + permissions: string[] | undefined +} export type UploadFileReq = { - filename: string | undefined; - data: string | undefined; -}; + filename: string | undefined + data: string | undefined +} export type UploadFileRsp = { - error: string | undefined; - filename: string | undefined; -}; + error: string | undefined + filename: string | undefined +} export type DownloadFileReq = { - filename: string | undefined; -}; + filename: string | undefined +} export type AddScenarioReq = { - name: string | undefined; -}; + name: string | undefined +} export type AddScenarioRsp = { - error: string | undefined; - id: number | undefined; -}; + error: string | undefined + id: number | undefined +} -export type GetMyScenariosReq = { -}; +export type GetMyScenariosReq = {} export type GetMyScenariosRsp = { - error: string | undefined; - scenarios: Scenario[] | undefined; -}; + error: string | undefined + scenarios: Scenario[] | undefined +} export type Scenario = { - id: number | undefined; - name: string | undefined; - description?: string; - image?: string; - story: Story | undefined; - author: User | undefined; - updatedAt: wellKnownTimestamp | undefined; - createdAt: wellKnownTimestamp | undefined; - publishedAt: wellKnownTimestamp | undefined; -}; + id: number | undefined + name: string | undefined + description?: string + image?: string + story: Story | undefined + author: User | undefined + updatedAt: wellKnownTimestamp | undefined + createdAt: wellKnownTimestamp | undefined + publishedAt: wellKnownTimestamp | undefined +} export type Story = { - places: Place[] | undefined; -}; + places: Place[] | undefined +} export type Place = { - code: string | undefined; - name: string | undefined; - text: string | undefined; - image: string | undefined; - hidden: boolean | undefined; - applications: Application[] | undefined; - doors: Door[] | undefined; - keys: Key[] | undefined; -}; + code: string | undefined + name: string | undefined + text: string | undefined + image: string | undefined + hidden: boolean | undefined + applications: Application[] | undefined + doors: Door[] | undefined + keys: Key[] | undefined +} export type Application = { - name: string | undefined; - image: string | undefined; -}; + name: string | undefined + image: string | undefined +} export type Door = { - code: string | undefined; - name: string | undefined; - keys: Key[] | undefined; -}; + code: string | undefined + name: string | undefined + keys: Key[] | undefined +} export type Key = { - name: string | undefined; -}; + name: string | undefined +} export type GetScenarioReq = { - id: number | undefined; -}; + id: number | undefined +} export type GetScenarioRsp = { - error: string | undefined; - scenario: Scenario | undefined; -}; + error: string | undefined + scenario: Scenario | undefined +} export type UpdateScenarioReq = { - id: number | undefined; - name: string | undefined; - description: string | undefined; - image: string | undefined; -}; + id: number | undefined + name: string | undefined + description: string | undefined + image: string | undefined +} export type UpdateScenarioRsp = { - error: string | undefined; -}; + error: string | undefined +} export type DeleteScenarioReq = { - id: number | undefined; -}; + id: number | undefined +} export type DeleteScenarioRsp = { - error: string | undefined; -}; + error: string | undefined +} export type AddScenarioPlaceReq = { - id: number | undefined; - place: Place | undefined; -}; + id: number | undefined + place: Place | undefined +} export type AddScenarioPlaceRsp = { - error: string | undefined; -}; + error: string | undefined +} export type UpdateScenarioPlaceReq = { - id: number | undefined; - code: string | undefined; - place: Place | undefined; -}; + id: number | undefined + code: string | undefined + place: Place | undefined +} export type UpdateScenarioPlaceRsp = { - error: string | undefined; -}; + error: string | undefined +} export type DeleteScenarioPlaceReq = { - id: number | undefined; - code: string | undefined; -}; + id: number | undefined + code: string | undefined +} export type DeleteScenarioPlaceRsp = { - error: string | undefined; -}; + error: string | undefined +} export interface EveningDetectiveServer { - Ping(request: PingReq): Promise; - Echo(request: EchoReq): Promise; - Signup(request: SignupReq): Promise; - RefreshPassword(request: RefreshPasswordReq): Promise; - Login(request: LoginReq): Promise; - Refresh(request: RefreshReq): Promise; - GetUsers(request: GetUsersReq): Promise; - GetUserById(request: GetUserByIdReq): Promise; - GetMe(request: GetMeReq): Promise; - AddUserRole(request: AddUserRoleReq): Promise; - DeleteUserRole(request: DeleteUserRoleReq): Promise; - GetPermissions(request: GetPermissionsReq): Promise; - UploadFile(request: UploadFileReq): Promise; - DownloadFile(request: DownloadFileReq): Promise; - AddScenario(request: AddScenarioReq): Promise; - GetMyScenarios(request: GetMyScenariosReq): Promise; - GetScenario(request: GetScenarioReq): Promise; - UpdateScenario(request: UpdateScenarioReq): Promise; - DeleteScenario(request: DeleteScenarioReq): Promise; - AddScenarioPlace(request: AddScenarioPlaceReq): Promise; - UpdateScenarioPlace(request: UpdateScenarioPlaceReq): Promise; - DeleteScenarioPlace(request: DeleteScenarioPlaceReq): Promise; + Ping(request: PingReq): Promise + Echo(request: EchoReq): Promise + Signup(request: SignupReq): Promise + RefreshPassword(request: RefreshPasswordReq): Promise + Login(request: LoginReq): Promise + Refresh(request: RefreshReq): Promise + GetUsers(request: GetUsersReq): Promise + GetUserById(request: GetUserByIdReq): Promise + GetMe(request: GetMeReq): Promise + AddUserRole(request: AddUserRoleReq): Promise + DeleteUserRole(request: DeleteUserRoleReq): Promise + GetPermissions(request: GetPermissionsReq): Promise + UploadFile(request: UploadFileReq): Promise + DownloadFile(request: DownloadFileReq): Promise + AddScenario(request: AddScenarioReq): Promise + GetMyScenarios(request: GetMyScenariosReq): Promise + GetScenario(request: GetScenarioReq): Promise + UpdateScenario(request: UpdateScenarioReq): Promise + DeleteScenario(request: DeleteScenarioReq): Promise + AddScenarioPlace(request: AddScenarioPlaceReq): Promise + UpdateScenarioPlace(request: UpdateScenarioPlaceReq): Promise + DeleteScenarioPlace(request: DeleteScenarioPlaceReq): Promise } type RequestType = { - path: string; - method: string; - body: string | null; -}; + path: string + method: string + body: string | null +} -type RequestHandler = (request: RequestType, meta: { service: string, method: string }) => Promise; +type RequestHandler = ( + request: RequestType, + meta: { service: string; method: string }, +) => Promise export function createEveningDetectiveServerClient( - handler: RequestHandler + handler: RequestHandler, ): EveningDetectiveServer { return { - Ping(request) { - const path = `api/test/ping`; - const body = null; - const queryParams: string[] = []; - let uri = path; + Ping(request) { + const path = `api/test/ping` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "Ping", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'Ping', + }, + ) as Promise }, - Echo(request) { - const path = `api/test/echo`; - const body = null; - const queryParams: string[] = []; + Echo(request) { + const path = `api/test/echo` + const body = null + const queryParams: string[] = [] if (request.text) { queryParams.push(`text=${encodeURIComponent(request.text.toString())}`) } - let uri = path; + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "Echo", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'Echo', + }, + ) as Promise }, - Signup(request) { - const path = `api/auth/signup`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + Signup(request) { + const path = `api/auth/signup` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "Signup", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'Signup', + }, + ) as Promise }, - RefreshPassword(request) { - const path = `api/auth/refresh-password`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + RefreshPassword(request) { + const path = `api/auth/refresh-password` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "RefreshPassword", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'RefreshPassword', + }, + ) as Promise }, - Login(request) { - const path = `api/auth/login`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + Login(request) { + const path = `api/auth/login` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "Login", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'Login', + }, + ) as Promise }, - Refresh(request) { - const path = `api/auth/refresh`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + Refresh(request) { + const path = `api/auth/refresh` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "Refresh", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'Refresh', + }, + ) as Promise }, - GetUsers(request) { - const path = `api/users`; - const body = null; - const queryParams: string[] = []; - let uri = path; + GetUsers(request) { + const path = `api/users` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetUsers", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetUsers', + }, + ) as Promise }, - GetUserById(request) { + GetUserById(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/users/${request.id}`; - const body = null; - const queryParams: string[] = []; - let uri = path; + const path = `api/users/${request.id}` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetUserById", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetUserById', + }, + ) as Promise }, - GetMe(request) { - const path = `api/users/me`; - const body = null; - const queryParams: string[] = []; - let uri = path; + GetMe(request) { + const path = `api/users/me` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetMe", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetMe', + }, + ) as Promise }, - AddUserRole(request) { + AddUserRole(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/users/${request.id}/role/add`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + const path = `api/users/${request.id}/role/add` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "AddUserRole", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'AddUserRole', + }, + ) as Promise }, - DeleteUserRole(request) { + DeleteUserRole(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/users/${request.id}/role/delete`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + const path = `api/users/${request.id}/role/delete` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "DeleteUserRole", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'DeleteUserRole', + }, + ) as Promise }, - GetPermissions(request) { - const path = `api/ui/permissions`; - const body = null; - const queryParams: string[] = []; - let uri = path; + GetPermissions(request) { + const path = `api/ui/permissions` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetPermissions", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetPermissions', + }, + ) as Promise }, - UploadFile(request) { - const path = `api/files/upload`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + UploadFile(request) { + const path = `api/files/upload` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "UploadFile", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'UploadFile', + }, + ) as Promise }, - DownloadFile(request) { + DownloadFile(request) { if (!request.filename) { - throw new Error("missing required field request.filename"); + throw new Error('missing required field request.filename') } - const path = `api/files/${request.filename}`; - const body = null; - const queryParams: string[] = []; - let uri = path; + const path = `api/files/${request.filename}` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "DownloadFile", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'DownloadFile', + }, + ) as Promise }, - AddScenario(request) { - const path = `api/scenario`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + AddScenario(request) { + const path = `api/scenario` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "AddScenario", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'AddScenario', + }, + ) as Promise }, - GetMyScenarios(request) { - const path = `api/my-scenarios`; - const body = null; - const queryParams: string[] = []; - let uri = path; + GetMyScenarios(request) { + const path = `api/my-scenarios` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetMyScenarios", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetMyScenarios', + }, + ) as Promise }, - GetScenario(request) { + GetScenario(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/scenarios/${request.id}`; - const body = null; - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "GET", - body, - }, { - service: "EveningDetectiveServer", - method: "GetScenario", - }) as Promise; + return handler( + { + path: uri, + method: 'GET', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'GetScenario', + }, + ) as Promise }, - UpdateScenario(request) { + UpdateScenario(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/scenarios/${request.id}`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "PUT", - body, - }, { - service: "EveningDetectiveServer", - method: "UpdateScenario", - }) as Promise; + return handler( + { + path: uri, + method: 'PUT', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'UpdateScenario', + }, + ) as Promise }, - DeleteScenario(request) { + DeleteScenario(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/scenarios/${request.id}`; - const body = null; - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "DELETE", - body, - }, { - service: "EveningDetectiveServer", - method: "DeleteScenario", - }) as Promise; + return handler( + { + path: uri, + method: 'DELETE', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'DeleteScenario', + }, + ) as Promise }, - AddScenarioPlace(request) { + AddScenarioPlace(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } - const path = `api/scenarios/${request.id}/places`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}/places` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "POST", - body, - }, { - service: "EveningDetectiveServer", - method: "AddScenarioPlace", - }) as Promise; + return handler( + { + path: uri, + method: 'POST', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'AddScenarioPlace', + }, + ) as Promise }, - UpdateScenarioPlace(request) { + UpdateScenarioPlace(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } if (!request.code) { - throw new Error("missing required field request.code"); + throw new Error('missing required field request.code') } - const path = `api/scenarios/${request.id}/places/${request.code}`; - const body = JSON.stringify(request); - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}/places/${request.code}` + const body = JSON.stringify(request) + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "PUT", - body, - }, { - service: "EveningDetectiveServer", - method: "UpdateScenarioPlace", - }) as Promise; + return handler( + { + path: uri, + method: 'PUT', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'UpdateScenarioPlace', + }, + ) as Promise }, - DeleteScenarioPlace(request) { + DeleteScenarioPlace(request) { if (!request.id) { - throw new Error("missing required field request.id"); + throw new Error('missing required field request.id') } if (!request.code) { - throw new Error("missing required field request.code"); + throw new Error('missing required field request.code') } - const path = `api/scenarios/${request.id}/places/${request.code}`; - const body = null; - const queryParams: string[] = []; - let uri = path; + const path = `api/scenarios/${request.id}/places/${request.code}` + const body = null + const queryParams: string[] = [] + let uri = path if (queryParams.length > 0) { - uri += `?${queryParams.join("&")}` + uri += `?${queryParams.join('&')}` } - return handler({ - path: uri, - method: "DELETE", - body, - }, { - service: "EveningDetectiveServer", - method: "DeleteScenarioPlace", - }) as Promise; + return handler( + { + path: uri, + method: 'DELETE', + body, + }, + { + service: 'EveningDetectiveServer', + method: 'DeleteScenarioPlace', + }, + ) as Promise }, - }; + } } // Message that represents an arbitrary HTTP body. It should only be used for // payload formats that can't be represented as JSON, such as raw binary or @@ -732,13 +795,13 @@ export function createEveningDetectiveServerClient( // handled, all other features will continue to work unchanged. export type googleapi_HttpBody = { // The HTTP Content-Type header value specifying the content type of the body. - contentType: string | undefined; + contentType: string | undefined // The HTTP request/response body as raw binary. - data: string | undefined; + data: string | undefined // Application specific response metadata. Must be set in the first response // for streaming APIs. - extensions: wellKnownAny[] | undefined; -}; + extensions: wellKnownAny[] | undefined +} // If the Any contains a value that has a special JSON mapping, // it will be converted as follows: @@ -746,9 +809,8 @@ export type googleapi_HttpBody = { // Otherwise, the value will be converted into a JSON object, // and the "@type" field will be inserted to indicate the actual data type. interface wellKnownAny { - "@type": string; - [key: string]: unknown; + '@type': string + [key: string]: unknown } - // @@protoc_insertion_point(typescript-http-eof) diff --git a/src/assets/main.css b/src/assets/main.css index f095eae..fbde2da 100644 --- a/src/assets/main.css +++ b/src/assets/main.css @@ -8,7 +8,7 @@ body { } @font-face { - font-family: "font_old_typer"; + font-family: 'font_old_typer'; src: url('@/assets/fonts/a_OldTyper.ttf'); } @@ -57,4 +57,4 @@ body { margin-top: 70px; padding: 0; } -} \ No newline at end of file +} diff --git a/src/components/GamesPage.vue b/src/components/GamesPage.vue index 7e8c018..3820917 100644 --- a/src/components/GamesPage.vue +++ b/src/components/GamesPage.vue @@ -3,11 +3,9 @@ import HeaderMenu from '@/components/HeaderMenu.vue' diff --git a/src/components/HeaderMenu.vue b/src/components/HeaderMenu.vue index f7043d3..a4027f8 100644 --- a/src/components/HeaderMenu.vue +++ b/src/components/HeaderMenu.vue @@ -1,155 +1,165 @@ diff --git a/src/components/LoginPage.vue b/src/components/LoginPage.vue index de92d61..d1236f9 100644 --- a/src/components/LoginPage.vue +++ b/src/components/LoginPage.vue @@ -1,11 +1,21 @@ @@ -55,24 +64,25 @@ async function signup() {
-
Почта
- +
Пароль
- - Вход - - - Подождите... - + Вход + Подождите...
@@ -84,32 +94,40 @@ async function signup() {
Позывной
Почта
- +
- - - Регистрация - - - Подождите... - + + Регистрация + Подождите...
-
diff --git a/src/components/OfficePage.vue b/src/components/OfficePage.vue index b86fb8a..581418e 100644 --- a/src/components/OfficePage.vue +++ b/src/components/OfficePage.vue @@ -1,37 +1,35 @@ diff --git a/src/components/PlaceBlock.vue b/src/components/PlaceBlock.vue index e6a8f39..0d0d5e2 100644 --- a/src/components/PlaceBlock.vue +++ b/src/components/PlaceBlock.vue @@ -1,163 +1,176 @@ diff --git a/src/components/ScenariosEditorPage.vue b/src/components/ScenariosEditorPage.vue index 97e11d0..d1dae29 100644 --- a/src/components/ScenariosEditorPage.vue +++ b/src/components/ScenariosEditorPage.vue @@ -1,18 +1,18 @@ diff --git a/src/components/ScenariosPage.vue b/src/components/ScenariosPage.vue index 00dad8c..3ac6be2 100644 --- a/src/components/ScenariosPage.vue +++ b/src/components/ScenariosPage.vue @@ -1,15 +1,14 @@ diff --git a/src/components/UsersPage.vue b/src/components/UsersPage.vue index 844bc24..bd34390 100644 --- a/src/components/UsersPage.vue +++ b/src/components/UsersPage.vue @@ -3,11 +3,9 @@ import HeaderMenu from '@/components/HeaderMenu.vue' diff --git a/src/router/index.ts b/src/router/index.ts index 5687263..5c66b69 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -49,7 +49,7 @@ const router = createRouter({ component: ScenariosView, }, { - path: '/scenarios/:id', // Динамический параметр id + path: '/scenarios/:id', // Динамический параметр id name: 'ScenariosEditorView', component: ScenariosEditorView, }, diff --git a/src/stores/auth.ts b/src/stores/auth.ts index 72a51b7..e63b49a 100644 --- a/src/stores/auth.ts +++ b/src/stores/auth.ts @@ -1,226 +1,226 @@ -import { defineStore } from 'pinia'; -import { computed,ref } from 'vue'; +import { defineStore } from 'pinia' +import { computed, ref } from 'vue' -import { type User } from '@/api/generated/crabs/evening_detective_server'; -import { buildClient } from '@/api/generated/crabs/evening_detective_server/client'; +import { type User } from '@/api/generated/crabs/evening_detective_server' +import { buildClient } from '@/api/generated/crabs/evening_detective_server/client' export const useAuthStore = defineStore('auth', () => { - // ===== STATE ===== - const accessToken = ref(null); - const refreshToken = ref(null); - const user = ref(null); - const isLoading = ref(false); - const error = ref(null); + // ===== STATE ===== + const accessToken = ref(null) + const refreshToken = ref(null) + const user = ref(null) + const isLoading = ref(false) + const error = ref(null) - // ===== GETTERS ===== - const isAuthenticated = computed(() => !!accessToken.value); - const username = computed(() => user.value?.username || ''); - const userRoles = computed(() => user.value?.roles || []); + // ===== GETTERS ===== + const isAuthenticated = computed(() => !!accessToken.value) + const username = computed(() => user.value?.username || '') + const userRoles = computed(() => user.value?.roles || []) - // ===== ACTIONS ===== + // ===== ACTIONS ===== - // Инициализация из localStorage при загрузке - function initFromStorage() { - const token = localStorage.getItem('accessToken'); - const refresh = localStorage.getItem('refreshToken'); + // Инициализация из localStorage при загрузке + function initFromStorage() { + const token = localStorage.getItem('accessToken') + const refresh = localStorage.getItem('refreshToken') - if (token) { - accessToken.value = token; - refreshToken.value = refresh; + if (token) { + accessToken.value = token + refreshToken.value = refresh - // Получаем данные пользователя - fetchUser(); + // Получаем данные пользователя + fetchUser() + } + } + + function getToken(): string | null { + return accessToken.value + } + + // Получение данных пользователя + async function fetchUser() { + if (!accessToken.value) return + + try { + const client = buildClient(getToken) + const response = await client.GetMe({}) + + if (response.error) { + error.value = response.error + return + } + + if (response.user) { + user.value = response.user + } + } catch (err) { + console.error('Failed to fetch user:', err) + // Если 401 — токен протух + if (err instanceof Error && err.message.includes('401')) { + await logout() + } + } + } + + // Логин + async function login(email: string, password: string) { + isLoading.value = true + error.value = null + + try { + const client = buildClient(getToken) + const response = await client.Login({ email, password }) + + if (response.error) { + error.value = response.error + return false + } + + // Сохраняем токены + if (response.accessToken) { + accessToken.value = response.accessToken + refreshToken.value = response.refreshToken || null + + // Сохраняем в localStorage + localStorage.setItem('accessToken', response.accessToken) + if (response.refreshToken) { + localStorage.setItem('refreshToken', response.refreshToken) } + + // Получаем данные пользователя + await fetchUser() + + return true + } + + return false + } catch (err) { + error.value = err instanceof Error ? err.message : 'Login failed' + return false + } finally { + isLoading.value = false } + } - function getToken(): string | null { - return accessToken.value + // Обновление токена + async function refreshTokenAction() { + if (!refreshToken.value) return false + + try { + const client = buildClient(getToken) + const response = await client.Refresh({ + refreshToken: refreshToken.value, + }) + + if (response.error || !response.accessToken) { + return false + } + + // Обновляем токены + accessToken.value = response.accessToken + refreshToken.value = response.refreshToken || null + + localStorage.setItem('accessToken', response.accessToken) + if (response.refreshToken) { + localStorage.setItem('refreshToken', response.refreshToken) + } + + return true + } catch { + return false } + } - // Получение данных пользователя - async function fetchUser() { - if (!accessToken.value) return; + // Регистрация + async function signup(username: string, email: string) { + isLoading.value = true + error.value = null - try { - const client = buildClient(getToken); - const response = await client.GetMe({}); + try { + const client = buildClient(getToken) + const response = await client.Signup({ username, email }) - if (response.error) { - error.value = response.error; - return; - } + if (response.error) { + error.value = response.error + return false + } - if (response.user) { - user.value = response.user; - } - } catch (err) { - console.error('Failed to fetch user:', err); - // Если 401 — токен протух - if (err instanceof Error && err.message.includes('401')) { - await logout(); - } - } + return true + } catch (err) { + error.value = err instanceof Error ? err.message : 'Signup failed' + return false + } finally { + isLoading.value = false } + } - // Логин - async function login(email: string, password: string) { - isLoading.value = true; - error.value = null; + // Восстановление пароля + async function refreshPassword(email: string) { + isLoading.value = true + error.value = null - try { - const client = buildClient(getToken); - const response = await client.Login({ email, password }); + try { + const client = buildClient(getToken) + const response = await client.RefreshPassword({ email }) - if (response.error) { - error.value = response.error; - return false; - } + if (response.error) { + error.value = response.error + return false + } - // Сохраняем токены - if (response.accessToken) { - accessToken.value = response.accessToken; - refreshToken.value = response.refreshToken || null; - - // Сохраняем в localStorage - localStorage.setItem('accessToken', response.accessToken); - if (response.refreshToken) { - localStorage.setItem('refreshToken', response.refreshToken); - } - - // Получаем данные пользователя - await fetchUser(); - - return true; - } - - return false; - } catch (err) { - error.value = err instanceof Error ? err.message : 'Login failed'; - return false; - } finally { - isLoading.value = false; - } + return true + } catch (err) { + error.value = err instanceof Error ? err.message : 'Password reset failed' + return false + } finally { + isLoading.value = false } + } - // Обновление токена - async function refreshTokenAction() { - if (!refreshToken.value) return false; + // Выход + async function logout() { + accessToken.value = null + refreshToken.value = null + user.value = null + error.value = null - try { - const client = buildClient(getToken); - const response = await client.Refresh({ - refreshToken: refreshToken.value - }); + localStorage.removeItem('accessToken') + localStorage.removeItem('refreshToken') + } - if (response.error || !response.accessToken) { - return false; - } + // Проверка ролей + function hasRole(role: string): boolean { + return userRoles.value.includes(role) + } - // Обновляем токены - accessToken.value = response.accessToken; - refreshToken.value = response.refreshToken || null; + function hasAnyRole(roles: string[]): boolean { + return roles.some((role) => userRoles.value.includes(role)) + } - localStorage.setItem('accessToken', response.accessToken); - if (response.refreshToken) { - localStorage.setItem('refreshToken', response.refreshToken); - } + // ===== RETURN ===== + return { + // State + accessToken, + refreshToken, + user, + isLoading, + error, - return true; - } catch { - return false; - } - } + // Getters + isAuthenticated, + username, + userRoles, - // Регистрация - async function signup(username: string, email: string) { - isLoading.value = true; - error.value = null; - - try { - const client = buildClient(getToken); - const response = await client.Signup({ username, email }); - - if (response.error) { - error.value = response.error; - return false; - } - - return true - } catch (err) { - error.value = err instanceof Error ? err.message : 'Signup failed'; - return false; - } finally { - isLoading.value = false; - } - } - - // Восстановление пароля - async function refreshPassword(email: string) { - isLoading.value = true; - error.value = null; - - try { - const client = buildClient(getToken); - const response = await client.RefreshPassword({ email }); - - if (response.error) { - error.value = response.error; - return false; - } - - return true; - } catch (err) { - error.value = err instanceof Error ? err.message : 'Password reset failed'; - return false; - } finally { - isLoading.value = false; - } - } - - // Выход - async function logout() { - accessToken.value = null; - refreshToken.value = null; - user.value = null; - error.value = null; - - localStorage.removeItem('accessToken'); - localStorage.removeItem('refreshToken'); - } - - // Проверка ролей - function hasRole(role: string): boolean { - return userRoles.value.includes(role); - } - - function hasAnyRole(roles: string[]): boolean { - return roles.some(role => userRoles.value.includes(role)); - } - - // ===== RETURN ===== - return { - // State - accessToken, - refreshToken, - user, - isLoading, - error, - - // Getters - isAuthenticated, - username, - userRoles, - - // Actions - initFromStorage, - getToken, - login, - signup, - refreshPassword, - logout, - fetchUser, - refreshTokenAction, - hasRole, - hasAnyRole, - }; -}); \ No newline at end of file + // Actions + initFromStorage, + getToken, + login, + signup, + refreshPassword, + logout, + fetchUser, + refreshTokenAction, + hasRole, + hasAnyRole, + } +}) diff --git a/src/views/GamesView.vue b/src/views/GamesView.vue index a5f55d0..58b65e2 100644 --- a/src/views/GamesView.vue +++ b/src/views/GamesView.vue @@ -1,5 +1,5 @@