style: run new eslint config on EVERYTHING ELSE
Some checks failed
Build and Publish Docker Image / build-publish (push) Has been cancelled

This commit is contained in:
William Oldham 2025-01-08 16:30:37 +00:00
parent 45d2be809c
commit 9bebbe6e05
31 changed files with 160 additions and 150 deletions

View File

@ -1,10 +1,10 @@
import crypto from 'node:crypto';
import path from 'node:path';
import fs from 'fs-extra';
import mongoose from 'mongoose';
import dotenv from 'dotenv';
import { LOG_INFO, LOG_WARN, LOG_ERROR } from '@/logger';
import { DisabledFeatures, Config } from '@/types/common/config';
import type mongoose from 'mongoose';
import type { DisabledFeatures, Config } from '@/types/common/config';
dotenv.config();
@ -78,7 +78,7 @@ export const config: Config = {
secret: process.env.PN_BOSS_CONFIG_S3_ACCESS_SECRET?.trim() || ''
},
disk_path: process.env.PN_BOSS_CONFIG_CDN_DISK_PATH?.trim() || ''
},
}
};
LOG_INFO('Config loaded, checking integrity');

View File

@ -4,10 +4,10 @@ import { CECSlot } from '@/models/cec-slot';
import { Task } from '@/models/task';
import { File } from '@/models/file';
import { config } from '@/config-manager';
import { HydratedCECDataDocument } from '@/types/mongoose/cec-data';
import { HydratedCECSlotDocument, ICECSlot } from '@/types/mongoose/cec-slot';
import { HydratedTaskDocument, ITask } from '@/types/mongoose/task';
import { HydratedFileDocument, IFile } from '@/types/mongoose/file';
import type { HydratedCECDataDocument } from '@/types/mongoose/cec-data';
import type { HydratedCECSlotDocument, ICECSlot } from '@/types/mongoose/cec-slot';
import type { HydratedTaskDocument, ITask } from '@/types/mongoose/task';
import type { HydratedFileDocument, IFile } from '@/types/mongoose/file';
const connection_string: string = config.mongoose.connection_string;
const options: mongoose.ConnectOptions = config.mongoose.options;
@ -168,7 +168,7 @@ export async function getRandomCECData(pids: number[], gameID: number): Promise<
// * We search through the CECSlot so that everyone has the same chance of getting their data picked up
const filter: mongoose.FilterQuery<ICECSlot> = {
creator_pid: {
$in: pids,
$in: pids
},
game_id: gameID
};

View File

@ -1,6 +1,7 @@
import express from 'express';
import { CTRSystemModel } from '@/types/common/user-agent-info';
import type { UserAgentInfo } from '@/types/common/user-agent-info';
import type express from 'express';
// import RequestException from '@/request-exception';
import { CTRSystemModel, UserAgentInfo } from '@/types/common/user-agent-info';
const FIRMWARE_PATCH_REGION_WIIU_REGEX = /(\d)([JEU])/;

View File

@ -1,5 +1,5 @@
import mongoose from 'mongoose';
import { ICECData, ICECDataMethods, CECDataModel } from '@/types/mongoose/cec-data';
import type { ICECData, ICECDataMethods, CECDataModel } from '@/types/mongoose/cec-data';
const CECDataSchema = new mongoose.Schema<ICECData, CECDataModel, ICECDataMethods>({
creator_pid: Number,

View File

@ -1,5 +1,5 @@
import mongoose from 'mongoose';
import { ICECSlot, ICECSlotMethods, CECSlotModel } from '@/types/mongoose/cec-slot';
import type { ICECSlot, ICECSlotMethods, CECSlotModel } from '@/types/mongoose/cec-slot';
const CECSlotSchema = new mongoose.Schema<ICECSlot, CECSlotModel, ICECSlotMethods>({
creator_pid: Number,

View File

@ -1,6 +1,6 @@
import mongoose from 'mongoose';
import { AutoIncrementID } from '@typegoose/auto-increment';
import { IFile, IFileMethods, FileModel } from '@/types/mongoose/file';
import { AutoIncrementID } from '@typegoose/auto-increment';
import type { IFile, IFileMethods, FileModel } from '@/types/mongoose/file';
const FileSchema = new mongoose.Schema<IFile, FileModel, IFileMethods>({
deleted: {

View File

@ -1,5 +1,5 @@
import mongoose from 'mongoose';
import { ITask, ITaskMethods, TaskModel } from '@/types/mongoose/task';
import type { ITask, ITaskMethods, TaskModel } from '@/types/mongoose/task';
const TaskSchema = new mongoose.Schema<ITask, TaskModel, ITaskMethods>({
deleted: {
@ -12,7 +12,7 @@ const TaskSchema = new mongoose.Schema<ITask, TaskModel, ITaskMethods>({
creator_pid: Number,
status: {
type: String,
enum : ['open'] // TODO - What else is there?
enum: ['open'] // TODO - What else is there?
},
title_id: String,
description: Number,

View File

@ -6,4 +6,4 @@ export default class RequestException extends Error {
this.status = status;
}
}
}

View File

@ -1,9 +1,10 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { DeleteFileRequest } from '@pretendonetwork/grpc/boss/delete_file';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { getTaskFileByDataID } from '@/database';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
import type { CallContext } from 'nice-grpc';
import type { DeleteFileRequest } from '@pretendonetwork/grpc/boss/delete_file';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
export async function deleteFile(request: DeleteFileRequest, context: CallContext & AuthenticationCallContextExt): Promise<Empty> {
// * This is asserted in authentication middleware, we know this is never null

View File

@ -1,9 +1,10 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { DeleteTaskRequest } from '@pretendonetwork/grpc/boss/delete_task';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { getTask } from '@/database';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
import type { CallContext } from 'nice-grpc';
import type { DeleteTaskRequest } from '@pretendonetwork/grpc/boss/delete_task';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
export async function deleteTask(request: DeleteTaskRequest, context: CallContext & AuthenticationCallContextExt): Promise<Empty> {
// * This is asserted in authentication middleware, we know this is never null

View File

@ -1,4 +1,3 @@
import { BOSSServiceImplementation } from '@pretendonetwork/grpc/boss/boss_service';
import { listKnownBOSSApps } from '@/services/grpc/boss/list-known-boss-apps';
import { listTasks } from '@/services/grpc/boss/list-tasks';
import { registerTask } from '@/services/grpc/boss/register-task';
@ -8,6 +7,7 @@ import { listFiles } from '@/services/grpc/boss/list-files';
import { uploadFile } from '@/services/grpc/boss/upload-file';
import { updateFileMetadata } from '@/services/grpc/boss/update-file-metadata';
import { deleteFile } from '@/services/grpc/boss/delete-file';
import type { BOSSServiceImplementation } from '@pretendonetwork/grpc/boss/boss_service';
export const implementation: BOSSServiceImplementation = {
listKnownBOSSApps,

View File

@ -1,7 +1,7 @@
import { Status, ServerError } from 'nice-grpc';
import { ListFilesRequest, ListFilesResponse } from '@pretendonetwork/grpc/boss/list_files';
import { isValidCountryCode, isValidLanguage } from '@/util';
import { getTaskFiles } from '@/database';
import type { ListFilesRequest, ListFilesResponse } from '@pretendonetwork/grpc/boss/list_files';
const BOSS_APP_ID_FILTER_REGEX = /^[A-Za-z0-9]*$/;

View File

@ -1,4 +1,4 @@
import { ListKnownBOSSAppsResponse } from '@pretendonetwork/grpc/boss/list_known_boss_apps';
import type { ListKnownBOSSAppsResponse } from '@pretendonetwork/grpc/boss/list_known_boss_apps';
export async function listKnownBOSSApps(): Promise<ListKnownBOSSAppsResponse> {
return {
@ -8,400 +8,400 @@ export async function listKnownBOSSApps(): Promise<ListKnownBOSSAppsResponse> {
titleId: '0005003010016000',
titleRegion: 'UNK',
name: 'Unknown',
tasks: [ 'olvinfo' ]
tasks: ['olvinfo']
},
{
bossAppId: 'VFoY6V7u7UUq1EG5',
titleId: '0005003010016100',
titleRegion: 'UNK',
name: 'Unknown',
tasks: [ 'olvinfo' ]
tasks: ['olvinfo']
},
{
bossAppId: '8MNOVprfNVAJjfCM',
titleId: '0005003010016200',
titleRegion: 'UNK',
name: 'Unknown',
tasks: [ 'olvinfo' ]
tasks: ['olvinfo']
},
{
bossAppId: 'v1cqzWykBKUg0rHQ',
titleId: '000500301001900A',
titleRegion: 'JPN',
name: 'Miiverse Post All',
tasks: [ 'solv' ]
tasks: ['solv']
},
{
bossAppId: 'bieC9ACJlisFg5xS',
titleId: '000500301001910A',
titleRegion: 'USA',
name: 'Miiverse Post All',
tasks: [ 'solv' ]
tasks: ['solv']
},
{
bossAppId: 'tOaQcoBLtPTgVN3Y',
titleId: '000500301001920A',
titleRegion: 'EUR',
name: 'Miiverse Post All',
tasks: [ 'solv' ]
tasks: ['solv']
},
{
bossAppId: 'HX8a16MMNn6i1z0Y',
titleId: '000500301001400A',
titleRegion: 'JPN',
name: 'Nintendo eShop',
tasks: [ 'wood1', 'woodBGM' ]
tasks: ['wood1', 'woodBGM']
},
{
bossAppId: '07E3nY6lAwlwrQRo',
titleId: '000500301001410A',
titleRegion: 'USA',
name: 'Nintendo eShop',
tasks: [ 'wood1', 'woodBGM' ]
tasks: ['wood1', 'woodBGM']
},
{
bossAppId: '8UsM86l8xgkjFk8z',
titleId: '000500301001420A',
titleRegion: 'EUR',
name: 'Nintendo eShop',
tasks: [ 'wood1', 'woodBGM' ]
tasks: ['wood1', 'woodBGM']
},
{
bossAppId: 'IXmFUqR2qenXfF61',
titleId: '0005001010066000',
titleRegion: 'ALL',
name: 'ECO Process',
tasks: [ 'promo1', 'promo2', 'promo3', 'push' ]
tasks: ['promo1', 'promo2', 'promo3', 'push']
},
{
bossAppId: 'BMQAm5iUVtPsJVsU',
titleId: '000500101004D000',
titleRegion: 'JPN',
name: 'Notifications',
tasks: [ 'sysmsg1', 'sysmsg2' ]
tasks: ['sysmsg1', 'sysmsg2']
},
{
bossAppId: 'LRmanFo4Tx3kEGDp',
titleId: '000500101004D100',
titleRegion: 'USA',
name: 'Notifications',
tasks: [ 'sysmsg1', 'sysmsg2' ]
tasks: ['sysmsg1', 'sysmsg2']
},
{
bossAppId: 'TZr27FE8wzKiEaTO',
titleId: '000500101004D200',
titleRegion: 'EUR',
name: 'Notifications',
tasks: [ 'sysmsg1', 'sysmsg2' ]
tasks: ['sysmsg1', 'sysmsg2']
},
{
bossAppId: 'JnIrm9c4E9JBmxBo',
titleId: '0005000010185200',
titleRegion: 'JPN',
name: 'NewスーパーマリオブラザーズU 無料お試し版 (New SUPER MARIO BROS. U (Trial))',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'dadlI27Ww8H2d56x',
titleId: '0005000010101C00',
titleRegion: 'JPN',
name: 'NewスーパーマリオブラザーズU (New SUPER MARIO BROS. U)',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'RaPn5saabzliYrpo',
titleId: '0005000010101D00',
titleRegion: 'USA',
name: 'New SUPER MARIO BROS. U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: '14VFIK3rY2SP0WRE',
titleId: '0005000010101E00',
titleRegion: 'EUR',
name: 'New SUPER MARIO BROS. U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'RbEQ44t2AocC4rvu',
titleId: '000500001014B700',
titleRegion: 'USA',
name: 'New SUPER MARIO BROS. U + New SUPER LUIGI U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: '287gv3WZdxo1QRhl',
titleId: '000500001014B800',
titleRegion: 'EUR',
name: 'New SUPER MARIO BROS. U + New SUPER LUIGI U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'bb6tOEckvgZ50ciH',
titleId: '0005000010162B00',
titleRegion: 'JPN',
name: 'スプラトゥーン (Splatoon)',
tasks: [ 'optdat2', 'schdat2', 'schdata' ]
tasks: ['optdat2', 'schdat2', 'schdata']
},
{
bossAppId: 'rjVlM7hUXPxmYQJh',
titleId: '0005000010176900',
titleRegion: 'USA',
name: 'Splatoon',
tasks: [ 'optdat2', 'schdat2', 'schdata', 'optdata2', 'schdata2' ]
tasks: ['optdat2', 'schdat2', 'schdata', 'optdata2', 'schdata2']
},
{
bossAppId: 'zvGSM4kOrXpkKnpT',
titleId: '0005000010176A00',
titleRegion: 'EUR',
name: 'Splatoon',
tasks: [ 'optdat2', 'schdat2', 'schdata', 'optdata' ]
tasks: ['optdat2', 'schdat2', 'schdata', 'optdata']
},
{
bossAppId: 'm8KJPtmPweiPuETE',
titleId: '000500001012F100',
titleRegion: 'JPN',
name: 'Wii Sports Club',
tasks: [ 'sp1_ans' ]
tasks: ['sp1_ans']
},
{
bossAppId: 'pO72Hi5uqf5yuNd8',
titleId: '0005000010144D00',
titleRegion: 'USA',
name: 'Wii Sports Club',
tasks: [ 'sp1_ans' ]
tasks: ['sp1_ans']
},
{
bossAppId: '4m8Xme1wKgzwslTJ',
titleId: '0005000010144E00',
titleRegion: 'EUR',
name: 'Wii Sports Club',
tasks: [ 'sp1_ans' ]
tasks: ['sp1_ans']
},
{
bossAppId: 'ESLqtAhxS8KQU4eu',
titleId: '000500001018DB00',
titleRegion: 'JPN',
name: 'Super Mario Maker (スーパーマリオメーカー)',
tasks: [ 'CHARA' ]
tasks: ['CHARA']
},
{
bossAppId: 'vGwChBW1ExOoHDsm',
titleId: '000500001018DC00',
titleRegion: 'USA',
name: 'Super Mario Maker',
tasks: [ 'CHARA' ]
tasks: ['CHARA']
},
{
bossAppId: 'IeUc4hQsKKe9rJHB',
titleId: '000500001018DD00',
titleRegion: 'EUA',
name: 'Super Mario Maker',
tasks: [ 'CHARA' ]
tasks: ['CHARA']
},
{
bossAppId: '4krJA4Gx3jF5nhQf',
titleId: '000500001012BC00',
titleRegion: 'JPN',
name: 'ピクミン3 (PIKMIN 3)',
tasks: [ 'histgrm' ]
tasks: ['histgrm']
},
{
bossAppId: '9jRZEoWYLc3OG9a8',
titleId: '000500001012BD00',
titleRegion: 'USA',
name: 'PIKMIN 3',
tasks: [ 'histgrm' ]
tasks: ['histgrm']
},
{
bossAppId: 'VWqUTspR5YtjDjxa',
titleId: '000500001012BE00',
titleRegion: 'EUR',
name: 'PIKMIN 3',
tasks: [ 'histgrm' ]
tasks: ['histgrm']
},
{
bossAppId: 'Ge1KtMu8tYlf4AUM',
titleId: '0005000010192000',
titleRegion: 'JPN',
name: '太鼓の達人 特盛り! (Taiko no Tatsujin Tokumori!)',
tasks: [ 'notice1' ]
tasks: ['notice1']
},
{
bossAppId: 'gycVtTzCouZmukZ6',
titleId: '0005000010110E00',
titleRegion: 'JPN',
name: '大乱闘スマッシュブラザーズ for Wii U (Super Smash Bros. for Wii U)',
tasks: [ 'NEWS', 'amiibo' ]
tasks: ['NEWS', 'amiibo']
},
{
bossAppId: 'o2Ug1pIp9Uhri6Nh',
titleId: '0005000010144F00',
titleRegion: 'USA',
name: 'Super Smash Bros. for Wii U',
tasks: [ 'amiibo', 'NEWS', 'friend', 'CONQ' ]
tasks: ['amiibo', 'NEWS', 'friend', 'CONQ']
},
{
bossAppId: 'n6rAJ1nnfC1Sgcpl',
titleId: '0005000010145000',
titleRegion: 'EUR',
name: 'Super Smash Bros. for Wii U',
tasks: [ 'amiibo', 'NEWS', 'friend', 'CONQ' ]
tasks: ['amiibo', 'NEWS', 'friend', 'CONQ']
},
{
bossAppId: 'CHUN6T1m7Xk4EBg4',
titleId: '00050000101DFF00',
titleRegion: 'JPN',
name: 'プチコンBIG (Petitcom BIG)',
tasks: [ 'ptcbnws' ]
tasks: ['ptcbnws']
},
{
bossAppId: 'zyXdCW9jGdi9rjaz',
titleId: '0005000010142200',
titleRegion: 'JPN',
name: 'NewスーパールイージU (New SUPER LUIGI U)',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'jPHLlJr2fJyTzffp',
titleId: '0005000010142300',
titleRegion: 'USA',
name: 'New SUPER LUIGI U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'YsXB6IRGSI56tPxl',
titleId: '0005000010142400',
titleRegion: 'EUR',
name: 'New SUPER LUIGI U',
tasks: [ 'news' ]
tasks: ['news']
},
{
bossAppId: 'Lbqp9Sg1i0xUzFFa',
titleId: '0005000010113800',
titleRegion: 'EUR',
name: 'Zen Pinball 2',
tasks: [ 'PTS' ]
tasks: ['PTS']
},
{
bossAppId: 'DwU7n0FidGrLNiOo',
titleId: '000500001014D900',
titleRegion: 'JPN',
name: 'ぷよぷよテトリス (PUYOPUYOTETRIS)',
tasks: [ 'boss1', 'boss2', 'boss3' ]
tasks: ['boss1', 'boss2', 'boss3']
},
{
bossAppId: 'yIUkFmuGVkGP8pDb',
titleId: '0005000010132200',
titleRegion: 'JPN',
name: '太鼓の達人 Uば~じょん! (Taiko no Tatsujin Wii U version!)',
tasks: [ 'notice1' ]
tasks: ['notice1']
},
{
bossAppId: 'v4WRObSzD7VU3dcJ',
titleId: '00050000101D3000',
titleRegion: 'JPN',
name: '太鼓の達人 あつめて★ともだち大作戦! (Taiko no Tatsujin Atsumete★ TomodachiDaisakusen!)',
tasks: [ 'notice1' ]
tasks: ['notice1']
},
{
bossAppId: '3zDjXIA57bSceyaw',
titleId: '00050000101BEC00',
titleRegion: 'USA',
name: 'Star Fox Guard',
tasks: [ 'param' ]
tasks: ['param']
},
{
bossAppId: 'NL38jhExI2CQqhWd',
titleId: '00050000101CDB00',
titleRegion: 'JPN',
name: 'Splatoon Pre-Launch Review',
tasks: [ 'schdata' ]
tasks: ['schdata']
},
{
bossAppId: 'sE6KwEpQYyg6tdU7',
titleId: '00050000101CDC00',
titleRegion: 'USA',
name: 'Splatoon Pre-Launch Review',
tasks: [ 'schdata' ]
tasks: ['schdata']
},
{
bossAppId: 'pTKZ9q5KrCP3gBag',
titleId: '00050000101CDD00',
titleRegion: 'EUR',
name: 'Splatoon Pre-Launch Review',
tasks: [ 'schdata' ]
tasks: ['schdata']
},
{
bossAppId: 'CJT88RO008LAnD51',
titleId: '0005000010170600',
titleRegion: 'JPN',
name: '仮面ライダー バトライド・ウォーⅡ プレミアムTVMOVIEサウンドED. (KAMEN RIDER BATTRIDE WAR Ⅱ PREMIUM TV&MOVIE SOUND ED.)',
tasks: [ 'PE_GAK', 'PE_ZNG' ]
tasks: ['PE_GAK', 'PE_ZNG']
},
{
bossAppId: 'FyyMFzEByuQJc6sJ',
titleId: '0005000010135200',
titleRegion: 'USA',
name: 'Star Wars Pinball',
tasks: [ 'PTS' ]
tasks: ['PTS']
},
{
bossAppId: 'A4yyXWKZZUToFtrt',
titleId: '0005000010132A00',
titleRegion: 'EUR',
name: 'Star Wars Pinball',
tasks: [ 'PTS' ]
tasks: ['PTS']
},
{
bossAppId: 'HauaFQ1sPsnQ6rBj',
titleId: '0005000010171F00',
titleRegion: 'USA',
name: 'Pushmo World',
tasks: [ 'annouce' ]
tasks: ['annouce']
},
{
bossAppId: 'qDUeFmk0Az71nHyD',
titleId: '0005000010110900',
titleRegion: 'JPN',
name: 'NINJA GAIDEN 3: Razor\'s Edge',
tasks: [ 'DLCINFO' ]
tasks: ['DLCINFO']
},
{
bossAppId: 'yVsSPM2E0DEOxroT',
titleId: '0005000010110A00',
titleRegion: 'USA',
name: 'NINJA GAIDEN 3: Razor\'s Edge',
tasks: [ 'DLCINFO' ]
tasks: ['DLCINFO']
},
{
bossAppId: 'Xw6OvZkQofQ3O8Bi',
titleId: '0005000010110B00',
titleRegion: 'EUR',
name: 'Ninja Gaiden 3: Razor\'s Edge',
tasks: [ 'DLCINFO' ]
tasks: ['DLCINFO']
},
{
bossAppId: 'LUQX5swEjBUPQ8nR',
titleId: '0005000010110200',
titleRegion: 'USA',
name: 'WARRIORS OROCHI 3 Hyper(NA)',
tasks: [ 'OR2H000' ]
tasks: ['OR2H000']
},
{
bossAppId: 'y4pXrgLe0JGao3No',
titleId: '0005000010112B00',
titleRegion: 'EUR',
name: 'WARRIORS OROCHI 3 Hyper(EU)',
tasks: [ 'OR2H000' ]
tasks: ['OR2H000']
},
{
bossAppId: 'j01mRJ9sNe00MWPC',
titleId: '0005000010170700',
titleRegion: 'JPN',
name: '仮面ライダー バトライド・ウォーⅡ (KAMEN RIDER BATTRIDE WAR Ⅱ)',
tasks: [ 'CHR_GAK', 'CHR_ZNG' ]
tasks: ['CHR_GAK', 'CHR_ZNG']
}
]
};
}
}

View File

@ -1,5 +1,5 @@
import { ListTasksResponse } from '@pretendonetwork/grpc/boss/list_tasks';
import { getAllTasks } from '@/database';
import type { ListTasksResponse } from '@pretendonetwork/grpc/boss/list_tasks';
export async function listTasks(): Promise<ListTasksResponse> {
const tasks = await getAllTasks(false);

View File

@ -1,9 +1,10 @@
import { Status, ServerMiddlewareCall, CallContext, ServerError } from 'nice-grpc';
import { Status, ServerError } from 'nice-grpc';
import { config } from '@/config-manager';
import type { ServerMiddlewareCall, CallContext } from 'nice-grpc';
export async function* apiKeyMiddleware<Request, Response>(
call: ServerMiddlewareCall<Request, Response>,
context: CallContext,
context: CallContext
): AsyncGenerator<Response, Response | void, undefined> {
const apiKey: string | undefined = context.metadata.get('X-API-Key');
@ -12,4 +13,4 @@ export async function* apiKeyMiddleware<Request, Response>(
}
return yield* call.next(call.request, context);
}
}

View File

@ -1,13 +1,14 @@
import { Status, ServerMiddlewareCall, CallContext, ServerError } from 'nice-grpc';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { getUserDataByToken } from '@/util';
import type { ServerMiddlewareCall, CallContext } from 'nice-grpc';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
const TOKEN_REQUIRED_PATHS = [
'/boss.BOSS/RegisterTask',
'/boss.BOSS/UpdateTask',
'/boss.BOSS/DeleteTask',
'/boss.BOSS/UploadFile',
'/boss.BOSS/DeleteFile',
'/boss.BOSS/DeleteFile'
];
export type AuthenticationCallContextExt = {
@ -16,7 +17,7 @@ export type AuthenticationCallContextExt = {
export async function* authenticationMiddleware<Request, Response>(
call: ServerMiddlewareCall<Request, Response, AuthenticationCallContextExt>,
context: CallContext,
context: CallContext
): AsyncGenerator<Response, Response | void, undefined> {
const token: string | undefined = context.metadata.get('X-Token')?.trim();
@ -50,4 +51,4 @@ export async function* authenticationMiddleware<Request, Response>(
throw new ServerError(Status.INVALID_ARGUMENT, message);
}
}
}

View File

@ -1,9 +1,10 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { RegisterTaskRequest, RegisterTaskResponse } from '@pretendonetwork/grpc/boss/register_task';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { ServerError, Status } from 'nice-grpc';
import { getTask } from '@/database';
import { Task } from '@/models/task';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { CallContext } from 'nice-grpc';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { RegisterTaskRequest, RegisterTaskResponse } from '@pretendonetwork/grpc/boss/register_task';
const BOSS_APP_ID_FILTER_REGEX = /^[A-Za-z0-9]*$/;

View File

@ -1,10 +1,11 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { UpdateFileMetadataRequest } from '@pretendonetwork/grpc/boss/update_file_metadata';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { getTaskFileByDataID } from '@/database';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
import { isValidFileNotifyCondition, isValidFileType } from '@/util';
import type { CallContext } from 'nice-grpc';
import type { UpdateFileMetadataRequest } from '@pretendonetwork/grpc/boss/update_file_metadata';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
export async function updateFileMetadata(request: UpdateFileMetadataRequest, context: CallContext & AuthenticationCallContextExt): Promise<Empty> {
// * This is asserted in authentication middleware, we know this is never null

View File

@ -1,9 +1,10 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { UpdateTaskRequest } from '@pretendonetwork/grpc/boss/update_task';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { getTask } from '@/database';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
import type { CallContext } from 'nice-grpc';
import type { UpdateTaskRequest } from '@pretendonetwork/grpc/boss/update_task';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { Empty } from '@pretendonetwork/grpc/boss/google/protobuf/empty';
export async function updateTask(request: UpdateTaskRequest, context: CallContext & AuthenticationCallContextExt): Promise<Empty> {
// * This is asserted in authentication middleware, we know this is never null

View File

@ -1,12 +1,13 @@
import { CallContext, Status, ServerError } from 'nice-grpc';
import { UploadFileRequest, UploadFileResponse } from '@pretendonetwork/grpc/boss/upload_file';
import { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import { Status, ServerError } from 'nice-grpc';
import { encryptWiiU } from '@pretendonetwork/boss-crypto';
import { isValidCountryCode, isValidFileNotifyCondition, isValidFileType, isValidLanguage, md5, uploadCDNFile } from '@/util';
import { getTask, getTaskFile } from '@/database';
import { File } from '@/models/file';
import { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import { config } from '@/config-manager';
import type { CallContext } from 'nice-grpc';
import type { AuthenticationCallContextExt } from '@/services/grpc/boss/middleware/authentication-middleware';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
import type { UploadFileRequest, UploadFileResponse } from '@pretendonetwork/grpc/boss/upload_file';
const BOSS_APP_ID_FILTER_REGEX = /^[A-Za-z0-9]*$/;
@ -172,7 +173,7 @@ export async function uploadFile(request: UploadFileRequest, context: CallContex
notifyOnNew: file.notify_on_new,
notifyLed: file.notify_led,
createdTimestamp: file.created,
updatedTimestamp: file.updated,
updatedTimestamp: file.updated
}
};
}

View File

@ -1,9 +1,10 @@
import { createServer, Server } from 'nice-grpc';
import { createServer } from 'nice-grpc';
import { BOSSDefinition } from '@pretendonetwork/grpc/boss/boss_service';
import { apiKeyMiddleware } from '@/services/grpc/boss/middleware/api-key-middleware';
import { authenticationMiddleware } from '@/services/grpc/boss/middleware/authentication-middleware';
import { implementation } from '@/services/grpc/boss/implementation';
import { config } from '@/config-manager';
import type { Server } from 'nice-grpc';
export async function startGRPCServer(): Promise<void> {
const server: Server = createServer();
@ -11,4 +12,4 @@ export async function startGRPCServer(): Promise<void> {
server.with(apiKeyMiddleware).with(authenticationMiddleware).add(BOSSDefinition, implementation);
await server.listen(`${config.grpc.boss.address}:${config.grpc.boss.port}`);
}
}

View File

@ -15,14 +15,14 @@ npfl.get('/p01/filelist/:appID/:taskID', async (request: express.Request<{
appID: string;
taskID: string;
}, any, any, {
c?: string;
l?: string;
a1?: string;
a2?: string;
a3?: string;
ap?: string;
tm?: string;
}>, response) => {
c?: string;
l?: string;
a1?: string;
a2?: string;
a3?: string;
ap?: string;
tm?: string;
}>, response) => {
for (const param in request.query) {
// * Beats me why the real server does this.
// * Just doing accurate emulation ¯\_(ツ)_/¯
@ -87,7 +87,7 @@ npfl.get('/p01/filelist/:appID/:taskID', async (request: express.Request<{
file.attribute2,
file.attribute3,
file.size,
file.updated/1000n // * Expects time as seconds, not milliseconds
file.updated / 1000n // * Expects time as seconds, not milliseconds
];
const line = `${params.join('\t')}\r\n`;
@ -111,4 +111,4 @@ const router = express.Router();
router.use(subdomain('npfl.c.app', npfl));
export default router;
export default router;

View File

@ -2,7 +2,7 @@ import xmlbuilder from 'xmlbuilder';
import moment from 'moment';
import express from 'express';
import subdomain from 'express-subdomain';
import { PolicyList } from '@/types/common/policylist';
import type { PolicyList } from '@/types/common/policylist';
const nppl = express.Router();
@ -186,4 +186,4 @@ const router = express.Router();
router.use(subdomain('nppl.c.app', nppl)); // * 3DS
router.use(subdomain('nppl.app', nppl)); // * WiiU
export default router;
export default router;

View File

@ -1,7 +1,7 @@
import mongoose from 'mongoose';
import type mongoose from 'mongoose';
export interface DisabledFeatures {
s3: boolean
s3: boolean;
}
export interface Config {

View File

@ -14,4 +14,4 @@ export type PolicyList = {
Persistent?: boolean;
Revive?: boolean;
}[];
};
};

View File

@ -4,7 +4,7 @@ export enum CTRSystemModel {
KTR, // * New Nintendo 3DS
FTR, // * Nintendo 2DS
RED, // * New Nintendo 3DS XL
JAN // * New Nintendo 2DS XL
JAN // * New Nintendo 2DS XL
}
export type UserAgentInfo = {

View File

@ -13,4 +13,4 @@ declare module 'express-subdomain'{
subdomain: string,
fn: Router | ((req: Request, res: Response) => void | any)
): (req: Request, res: Response, next: () => void) => void | typeof fn;
}
}

View File

@ -1,4 +1,4 @@
import { Model, HydratedDocument } from 'mongoose';
import type { Model, HydratedDocument } from 'mongoose';
export interface ICECData {
creator_pid: number;
@ -13,6 +13,6 @@ export interface ICECDataMethods {}
interface ICECDataQueryHelpers {}
export type CECDataModel = Model<ICECData, ICECDataQueryHelpers, ICECDataMethods>
export type CECDataModel = Model<ICECData, ICECDataQueryHelpers, ICECDataMethods>;
export type HydratedCECDataDocument = HydratedDocument<ICECData, ICECDataMethods>
export type HydratedCECDataDocument = HydratedDocument<ICECData, ICECDataMethods>;

View File

@ -1,4 +1,4 @@
import { Model, HydratedDocument } from 'mongoose';
import type { Model, HydratedDocument } from 'mongoose';
export interface ICECSlot {
creator_pid: number;
@ -10,6 +10,6 @@ export interface ICECSlotMethods {}
interface ICECSlotQueryHelpers {}
export type CECSlotModel = Model<ICECSlot, ICECSlotQueryHelpers, ICECSlotMethods>
export type CECSlotModel = Model<ICECSlot, ICECSlotQueryHelpers, ICECSlotMethods>;
export type HydratedCECSlotDocument = HydratedDocument<ICECSlot, ICECSlotMethods>
export type HydratedCECSlotDocument = HydratedDocument<ICECSlot, ICECSlotMethods>;

View File

@ -1,4 +1,4 @@
import { Model, HydratedDocument } from 'mongoose';
import type { Model, HydratedDocument } from 'mongoose';
export interface IFile {
deleted: boolean;
@ -26,6 +26,6 @@ export interface IFileMethods {}
interface IFileQueryHelpers {}
export type FileModel = Model<IFile, IFileQueryHelpers, IFileMethods>
export type FileModel = Model<IFile, IFileQueryHelpers, IFileMethods>;
export type HydratedFileDocument = HydratedDocument<IFile, IFileMethods>
export type HydratedFileDocument = HydratedDocument<IFile, IFileMethods>;

View File

@ -1,4 +1,4 @@
import { Model, HydratedDocument } from 'mongoose';
import type { Model, HydratedDocument } from 'mongoose';
export interface ITask {
deleted: boolean;
@ -6,17 +6,17 @@ export interface ITask {
in_game_id: string;
boss_app_id: string;
creator_pid: number;
status: 'open'; // TODO - Make this a union. What else is there?
status: 'open'; // TODO - Make this a union. What else is there?
title_id: string;
description: string;
created: bigint;
updated: bigint;
}
export interface ITaskMethods {}
export interface ITaskMethods { }
interface ITaskQueryHelpers {}
interface ITaskQueryHelpers { }
export type TaskModel = Model<ITask, ITaskQueryHelpers, ITaskMethods>
export type TaskModel = Model<ITask, ITaskQueryHelpers, ITaskMethods>;
export type HydratedTaskDocument = HydratedDocument<ITask, ITaskMethods>
export type HydratedTaskDocument = HydratedDocument<ITask, ITaskMethods>;