diff --git a/.env.example b/.env.example index ddb092c..e4095c3 100644 --- a/.env.example +++ b/.env.example @@ -4,8 +4,10 @@ APP_DEBUG=true APP_LOG_SQL=true APP_PORT=8001 -APP_HOST=127.0.0.1 -APP_KEY= +APP_HOST=localhost +FRONTEND_URI=http://localhost:8000 +APP_CORS_ALLOW=http://localhost:8000 +APP_KEY= ################# # MISC SETTINGS # @@ -18,17 +20,20 @@ FILE_TMP_LOCATION=./storage/tmp/ # API ENDPOINT BASE URIs # ########################## VATSIM_API_BASE=https://api.vatsim.net/api/v2 +VATEUD_API_BASE=https://core.vateud.net/api VATGER_API_BASE=https://vatsim-germany.org/api MOODLE_API_BASE=https://api.moodle.vatsim-germany.org +VATEUD_CORE_API_KEY= + ######################### # VATSIM CONNECT CONFIG # ######################### CONNECT_BASE=https://auth-dev.vatsim.net -CONNECT_REDIRECT_URI= +CONNECT_REDIRECT_URI=http://localhost:8000/login/callback CONNECT_SCOPE="full_name vatsim_details email country" -CONNECT_CLIENT_ID= -CONNECT_SECRET= +CONNECT_CLIENT_ID= +CONNECT_SECRET= ######################## # DATABASE INFORMATION # @@ -36,6 +41,15 @@ CONNECT_SECRET= DB_DIALECT=mysql DB_HOST=127.0.0.1 DB_PORT=3306 -DB_DATABASE_NAME= -DB_USERNAME= -DB_PASSWORD= +DB_DATABASE_NAME= +DB_USERNAME= +DB_PASSWORD= + +#################### +# MAIL INFORMATION # +#################### +SMTP_HOST= +SMTP_PORT= +SMTP_USERNAME= +SMTP_PASSWORD= +DEBUG_EMAIL= \ No newline at end of file diff --git a/src/core/Config.ts b/src/core/Config.ts index 62cb1d5..a5c5581 100644 --- a/src/core/Config.ts +++ b/src/core/Config.ts @@ -77,6 +77,10 @@ export const Config = { MOODLE_API_BASE: process.env.MOODLE_API_BASE, }, + VATEUD_CORE_CONFIG: { + API_KEY: process.env.VATEUD_CORE_API_KEY + }, + CONNECT_CONFIG: { BASE_URL: process.env.CONNECT_BASE, CLIENT_ID: process.env.CONNECT_CLIENT_ID, diff --git a/src/libraries/vateud/VateudCoreLibrary.ts b/src/libraries/vateud/VateudCoreLibrary.ts index 3aca063..84406ad 100644 --- a/src/libraries/vateud/VateudCoreLibrary.ts +++ b/src/libraries/vateud/VateudCoreLibrary.ts @@ -1,22 +1,37 @@ import axios, {Method} from "axios"; import JobLibrary, {JobTypeEnum} from "../JobLibrary"; -import {VateudCoreSoloCreateResponse, VateudCoreSoloCreateT, VateudCoreTypeEnum} from "./VateudCoreLibraryTypes"; +import { + VateudCoreSoloCreateResponseT, + VateudCoreSoloCreateT, + VateudCoreSoloRemoveResponseT, + VateudCoreSoloRemoveT, + VateudCoreTypeEnum +} from "./VateudCoreLibraryTypes"; import {Config} from "../../core/Config"; +import {UserSolo} from "../../models/UserSolo"; +import Logger, {LogLevels} from "../../utility/Logger"; type SendT = { method: Method; endpoint: string; - data: any; + data?: any; } /** * Sends the actual request to VATEUD Core * @param props - * @param type */ -async function _send(props: SendT, type: VateudCoreTypeEnum): Promise { +async function _send(props: SendT): Promise { + if (Config.VATEUD_CORE_CONFIG.API_KEY == null) { + Logger.log(LogLevels.LOG_ERROR, `VATEUD Core API Key missing, but attempted to update: ${props.endpoint}. Aborting.`); + return undefined; + } + try { const res = await axios({ + headers: { + 'x-api-key': Config.VATEUD_CORE_CONFIG.API_KEY, + }, url: `${Config.URI_CONFIG.VATEUD_API_BASE}/${props.endpoint}`, method: props.method, data: props.data @@ -28,12 +43,19 @@ async function _send(props: SendT, type: VateudCoreTypeEnum): Promise({ + const res = await _send({ endpoint: "/solo", method: "post", - data: soloInfo - }, VateudCoreTypeEnum.SOLO_CREATE); + data: soloInfo.post_data + }); if (!res) { // If the request fails, we schedule a job to attempt it additional times. await JobLibrary.scheduleJob(JobTypeEnum.VATEUD_CORE, { @@ -42,15 +64,52 @@ async function createSolo(soloInfo: VateudCoreSoloCreateT) { data: { solo_create: { local_solo_id: soloInfo.local_solo_id, - user_id: soloInfo.user_id, - position: soloInfo.position, - instructor_cid: soloInfo.instructor_cid, - expire_at: soloInfo.expires_at + user_id: soloInfo.post_data.user_id, + position: soloInfo.post_data.position, + instructor_cid: soloInfo.post_data.instructor_cid, + expire_at: soloInfo.post_data.expires_at } } }); return undefined; } + await UserSolo.update({ + vateud_solo_id: res.data.id + }, { + where: { + id: soloInfo.local_solo_id + } + }); + return res; +} + +/** + * Removes a solo. + * On failure, it schedules a job which repeats the same request n times until it succeeds + * @param soloInfo + */ +async function removeSolo(soloInfo: VateudCoreSoloRemoveT) { + const res = await _send({ + endpoint: `/solo/${soloInfo.vateud_solo_id}`, + method: "delete" + }); + if (!res) { + await JobLibrary.scheduleJob(JobTypeEnum.VATEUD_CORE, { + type: VateudCoreTypeEnum.SOLO_REMOVE, + method: "delete", + data: { + solo_remove: { + local_solo_id: soloInfo.local_solo_id, + vateud_solo_id: soloInfo.vateud_solo_id + } + } + }); + } +} + +export default { + createSolo, + removeSolo } \ No newline at end of file diff --git a/src/libraries/vateud/VateudCoreLibraryTypes.ts b/src/libraries/vateud/VateudCoreLibraryTypes.ts index 88e5387..7845a33 100644 --- a/src/libraries/vateud/VateudCoreLibraryTypes.ts +++ b/src/libraries/vateud/VateudCoreLibraryTypes.ts @@ -15,16 +15,18 @@ export type VateudCorePayload = { export type VateudCoreSoloCreateT = { local_solo_id: number; - user_id: number; - position: string; - instructor_cid: number; - starts_at: string; - expires_at: string; + post_data: { + user_id: number; + position: string; + instructor_cid: number; + starts_at: string; + expires_at: string; + } } -export type VateudCoreSoloCreateResponse = { +export type VateudCoreSoloCreateResponseT = { success: boolean; - data: Array<{ + data: { id: number; user_cid: number; instructor_cid: number; @@ -33,5 +35,15 @@ export type VateudCoreSoloCreateResponse = { facility: number; created_at: string; updated_at: string; - }> + } +} + +export type VateudCoreSoloRemoveT = { + local_solo_id: number; + vateud_solo_id: number; +} + +export type VateudCoreSoloRemoveResponseT = { + success: boolean; + message: string; } \ No newline at end of file