diff --git a/apps/api/package.json b/apps/api/package.json index f11543f9..e5ef3621 100755 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -20,6 +20,7 @@ "elysia": "1.1.6", "elysia-compression": "^0.0.7", "elysia-helmet": "^2.0.0", + "ky": "^1.7.2", "node-rsa": "^1.1.1", "pg": "^8.12.0", "pg-hstore": "^2.3.4", diff --git a/apps/api/src/routes/ads/handler.ts b/apps/api/src/routes/ads/handler.ts index 54a272a9..91d406a5 100755 --- a/apps/api/src/routes/ads/handler.ts +++ b/apps/api/src/routes/ads/handler.ts @@ -5,6 +5,7 @@ import { getCookieFromToken } from '@helpers' import { HeadersWithCookie } from '@utils' import { adsGetFromDB, saveAds } from 'src/models/Ads/actions' +import { fetcher } from 'src/utils/fetcher' import type { WithToken } from '../../types' type Params = WithToken<{ @@ -18,7 +19,8 @@ export const getAds = async ({ const authData = await getCookieFromToken(token) const path = `${SERVER_URL}/services/people/organization/news/last/10` console.log(path) - const response = await fetch(path, { + + const response = await fetcher.get(path, { headers: HeadersWithCookie(authData.cookie) }) @@ -26,7 +28,7 @@ export const getAds = async ({ return adsGetFromDB(spoId) } - const result = await response.json() + const result = await response.json() // Попутно сохраняем saveAds(result, authData) diff --git a/apps/api/src/routes/attestation/service/get/getAttestationFromDiary.ts b/apps/api/src/routes/attestation/service/get/getAttestationFromDiary.ts index a071a2ec..96d20fcc 100755 --- a/apps/api/src/routes/attestation/service/get/getAttestationFromDiary.ts +++ b/apps/api/src/routes/attestation/service/get/getAttestationFromDiary.ts @@ -3,13 +3,16 @@ import type { AttestationResponse } from '@diary-spo/shared' import { SERVER_URL } from '@config' import type { ICacheData } from '@helpers' import { HeadersWithCookie } from '@utils' +import ky from 'ky' export const getAttestationFromDiary = async ( authData: ICacheData ): Promise => { const path = `${SERVER_URL}/services/reports/curator/group-attestation-for-student/${authData.idFromDiary}` - return fetch(path, { - headers: HeadersWithCookie(authData.cookie) - }) + return ky + .get(path, { + headers: HeadersWithCookie(authData.cookie) + }) + .json() } diff --git a/apps/api/src/routes/auth/login/handler.ts b/apps/api/src/routes/auth/login/handler.ts index c57ae98e..cadbb95a 100755 --- a/apps/api/src/routes/auth/login/handler.ts +++ b/apps/api/src/routes/auth/login/handler.ts @@ -2,7 +2,8 @@ import { API_ERRORS, NotFoundError, UnknownError } from '@api' import { SERVER_URL } from '@config' import { b64 } from '@diary-spo/crypto' import type { ResponseLogin, UserData } from '@diary-spo/shared' -import { fetcher } from '@utils' + +import { fetcher } from 'src/utils/fetcher' import { offlineAuth } from './service' import { handleResponse } from './service/helpers' import { saveUserData } from './service/save' @@ -23,11 +24,15 @@ const postAuth = async ({ password = await b64(password) } - const res = await fetcher({ - url: `${SERVER_URL}/services/security/login`, - method: 'POST', - body: JSON.stringify({ login, password, isRemember: true }) - }) + const rawResponse = await fetcher.post( + `${SERVER_URL}/services/security/login`, + { + json: { login, password, isRemember: true } + } + ) + + const res = await rawResponse.json() + const parsedRes = handleResponse(res) switch (parsedRes) { @@ -51,11 +56,18 @@ const postAuth = async ({ * Поэтому проверяем хотя бы наличие одного обязательного поля **/ - if (!parsedRes.data.tenants) { - throw new UnknownError('Unreachable auth error') + const setCookieHeader = rawResponse.headers.get('Set-Cookie') + + if (!parsedRes.tenants || !setCookieHeader) { + throw new UnknownError(`Unreachable auth error${parsedRes}`) } - const userData = await saveUserData(parsedRes, login, password) + const userData = await saveUserData( + parsedRes, + login, + password, + setCookieHeader + ) if (!userData) { throw new UnknownError('Unreachable auth error') diff --git a/apps/api/src/routes/auth/login/service/save/saveUserData.ts b/apps/api/src/routes/auth/login/service/save/saveUserData.ts index 7060ca55..285fa4ad 100755 --- a/apps/api/src/routes/auth/login/service/save/saveUserData.ts +++ b/apps/api/src/routes/auth/login/service/save/saveUserData.ts @@ -2,7 +2,8 @@ import { API_CODES, ApiError } from '@api' import { SERVER_URL } from '@config' import type { PersonResponse, UserData } from '@diary-spo/shared' import { generateToken } from '@helpers' -import { type ApiResponse, cookieExtractor, error, fetcher } from '@utils' +import { cookieExtractor, error } from '@utils' +import { fetcher } from 'src/utils/fetcher' import { getFormattedDiaryUserData, saveOrGetDiaryUser, @@ -11,30 +12,29 @@ import { import { saveOrGetSPO } from '../../../../../models/SPO' export const saveUserData = async ( - parsedRes: ApiResponse, + parsedRes: UserData, login: string, - password: string + password: string, + setCookieHeader: string ) => { - const tenant = parsedRes.data.tenants[parsedRes.data.tenantName] + const tenant = parsedRes.tenants[parsedRes.tenantName] const student = tenant.studentRole.students[0] const SPO = tenant.settings.organization - const setCookieHeader = parsedRes.headers.get('Set-Cookie') const cookie = cookieExtractor(setCookieHeader ?? '') try { - const detailedInfo = await fetcher({ - url: `${SERVER_URL}/services/security/account-settings`, - cookie - }) + const rawResponse = await fetcher.get( + `${SERVER_URL}/services/security/account-settings`, + { + headers: { + Cookie: cookie + } + } + ) - if (typeof detailedInfo === 'number') { - throw new ApiError( - 'Error get detailed info!', - API_CODES.INTERNAL_SERVER_ERROR - ) - } + const detailedInfo = await rawResponse.json() - const person = detailedInfo.data.person + const person = detailedInfo.persons[0] const spoAddress = SPO.actualAddress.length > 5 diff --git a/apps/api/src/routes/finalMarks/service/get/getFinalMarks.ts b/apps/api/src/routes/finalMarks/service/get/getFinalMarks.ts index f1ad2614..601bde55 100755 --- a/apps/api/src/routes/finalMarks/service/get/getFinalMarks.ts +++ b/apps/api/src/routes/finalMarks/service/get/getFinalMarks.ts @@ -2,11 +2,12 @@ import { SERVER_URL } from '@config' import type { AcademicRecord } from '@diary-spo/shared' import type { ICacheData } from '@helpers' import { HeadersWithCookie } from '@utils' +import { fetcher } from 'src/utils/fetcher' export const getFinalMarksFromDiary = async (authData: ICacheData) => { const path = `${SERVER_URL}/services/students/${authData.idFromDiary}/attestation` - const response = fetch(path, { + const response = fetcher.get(path, { headers: HeadersWithCookie(authData.cookie) }) diff --git a/apps/api/src/routes/lessons/service/get/getLessons.ts b/apps/api/src/routes/lessons/service/get/getLessons.ts index 3f3d0a9c..a8274a72 100755 --- a/apps/api/src/routes/lessons/service/get/getLessons.ts +++ b/apps/api/src/routes/lessons/service/get/getLessons.ts @@ -4,6 +4,7 @@ import type { Day } from '@diary-spo/shared' import type { ICacheData } from '@helpers' import { HeadersWithCookie } from '@utils' import { detectTerm } from 'src/models/Term/actions/other/detectTerm' +import { fetcher } from 'src/utils/fetcher' import { ScheduleGetFromDB, daySave } from '../../../../models/Schedule' import { getFormattedResponse } from '../helpers' @@ -15,7 +16,7 @@ export const getLessonsService = async ( ): Promise => { const path = `${SERVER_URL}/services/students/${authData.idFromDiary}/lessons/${startDate}/${endDate}` - const response = await fetch(path, { + const response = await fetcher.get(path, { headers: HeadersWithCookie(authData.cookie) }) diff --git a/apps/api/src/routes/organization/handler.ts b/apps/api/src/routes/organization/handler.ts index b621f6e9..36be6249 100755 --- a/apps/api/src/routes/organization/handler.ts +++ b/apps/api/src/routes/organization/handler.ts @@ -3,6 +3,7 @@ import type { Optional } from 'sequelize' import { API_CODES, API_ERRORS, ApiError } from '@api' import { SERVER_URL } from '@config' import { HeadersWithCookie } from '@utils' +import { fetcher } from 'src/utils/fetcher' import { DiaryUserModel } from '../../models/DiaryUser' import { GroupModel } from '../../models/Group' import { SPOModel, type SPOModelType } from '../../models/SPO' @@ -18,9 +19,11 @@ const getOrganization = async ({ }: Data): Promise> => { const path = `${SERVER_URL}/services/people/organization` - const response = await fetch(path, { - headers: HeadersWithCookie(cookie) - }).then((res) => res.json()) + const response = await fetcher + .get(path, { + headers: HeadersWithCookie(cookie) + }) + .json() if (response) { /* Хотелось бы красиво по убыванию... diff --git a/apps/api/src/routes/performance.current/service/get/getPerformanceCurrent.ts b/apps/api/src/routes/performance.current/service/get/getPerformanceCurrent.ts index 891abe0c..fcc7d151 100755 --- a/apps/api/src/routes/performance.current/service/get/getPerformanceCurrent.ts +++ b/apps/api/src/routes/performance.current/service/get/getPerformanceCurrent.ts @@ -1,12 +1,13 @@ import { SERVER_URL } from '@config' import type { ICacheData } from '@helpers' import { HeadersWithCookie } from '@utils' +import { fetcher } from 'src/utils/fetcher' export const getPerformanceCurrent = async (authData: ICacheData) => { const path = `${SERVER_URL}/services/reports/current/performance/${authData.idFromDiary}` console.log(path) - return fetch(path, { + return fetcher.get(path, { headers: HeadersWithCookie(authData.cookie) }) } diff --git a/apps/api/src/utils/fetcher.ts b/apps/api/src/utils/fetcher.ts old mode 100755 new mode 100644 index 567922e1..469e2ee0 --- a/apps/api/src/utils/fetcher.ts +++ b/apps/api/src/utils/fetcher.ts @@ -1,46 +1,5 @@ -export type HTTPMethods = 'GET' | 'POST' +import ky from 'ky' -export interface ApiResponse { - data: T - headers: Headers - status: number -} - -interface Params { - url: string - method?: HTTPMethods - body?: any - cookie?: string -} - -export const fetcher = async ({ - url, - method = 'GET', - body, - cookie -}: Params): Promise | number> => { - try { - const response = await fetch(url, { - method, - body, - headers: { - 'Content-Type': 'application/json;charset=UTF-8', - Cookie: cookie ?? '' - } - }) - //console.log(path) - console.log(url) - - if (!response.ok) { - return response.status - } - - return { - data: (await response.json()) as T, - headers: response.headers, - status: response.status - } - } catch (error) { - return 500 - } -} +export const fetcher = ky.extend({ + timeout: 10000 // 10 seconds +}) diff --git a/apps/api/src/utils/index.ts b/apps/api/src/utils/index.ts index 639bc871..e9274368 100755 --- a/apps/api/src/utils/index.ts +++ b/apps/api/src/utils/index.ts @@ -2,5 +2,4 @@ export * from './headers' export * from './formatted' export * from './error' export * from './cookieExtractor' -export * from './fetcher' export * from './errorLogger' diff --git a/apps/api/src/worker/cookieUpdater/submodules/updateUserCookie.ts b/apps/api/src/worker/cookieUpdater/submodules/updateUserCookie.ts index 7913a726..922ed81d 100755 --- a/apps/api/src/worker/cookieUpdater/submodules/updateUserCookie.ts +++ b/apps/api/src/worker/cookieUpdater/submodules/updateUserCookie.ts @@ -1,6 +1,7 @@ import { SERVER_URL } from '@config' import type { UserData } from '@diary-spo/shared' -import { cookieExtractor, fetcher, formatDate } from '@utils' +import { cookieExtractor, formatDate } from '@utils' +import ky from 'ky' import type { IDiaryUserModel } from '../../../models/DiaryUser' import { logger } from '../../utils/logger' @@ -13,9 +14,7 @@ export const updateUserCookie = async ( console.log('Обновляю cookie пользователя', userInfo) // 1. Авторизируемся - const res = await fetcher({ - url: `${SERVER_URL}/services/security/login`, - method: 'POST', + const rawResponse = await ky.post(`${SERVER_URL}/services/security/login`, { body: JSON.stringify({ login: user.login, password: user.password, @@ -24,13 +23,13 @@ export const updateUserCookie = async ( }) // Если дневник вернул что-то другое... - if (typeof res === 'number') { + if (!rawResponse.ok) { log('WORKER: Что-то не так... Дневник ответил чем-то другим ?') return } // 2. Подготавливаем куку - const setCookieHeader = res.headers.get('Set-Cookie') + const setCookieHeader = rawResponse.headers.get('Set-Cookie') const cookie = cookieExtractor(setCookieHeader ?? '') // 3. Обновляем куку и дату обновления diff --git a/apps/shared/src/api/self/index.ts b/apps/shared/src/api/self/index.ts index e4c80798..6ba679b5 100755 --- a/apps/shared/src/api/self/index.ts +++ b/apps/shared/src/api/self/index.ts @@ -1,13 +1,13 @@ import type { Person } from '../../base.ts' export interface PersonResponse { - person: Person & { + persons: Array } /** diff --git a/bun.lockb b/bun.lockb index 0cbc05d8..df7d8933 100755 Binary files a/bun.lockb and b/bun.lockb differ