Skip to content

Commit da9edac

Browse files
authored
Merge pull request #284 from PretendoNetwork/feat/even-more-jsx
Porting more to JSX and typescript
2 parents bd0be5a + 70e6700 commit da9edac

49 files changed

Lines changed: 1527 additions & 1381 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/juxtaposition-ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
},
5757
"devDependencies": {
5858
"@pretendonetwork/eslint-config": "^0.1.3",
59+
"@types/cookie-parser": "^1.4.10",
5960
"@types/express-session": "^1.18.2",
6061
"@types/hashmap": "^2.3.4",
6162
"@types/luxon": "^3.7.1",

apps/juxtaposition-ui/src/middleware/checkBan.ts renamed to apps/juxtaposition-ui/src/middleware/checkBan.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import moment from 'moment';
22
import { database as db } from '@/database';
33
import { config } from '@/config';
44
import { humanDate, humanFromNow } from '@/util';
5+
import { WebLoginView } from '@/services/juxt-web/views/web/loginView';
6+
import { buildContext } from '@/services/juxt-web/views/context';
57
import type { RequestHandler } from 'express';
68

79
export const checkBan: RequestHandler = async (request, response, next) => {
@@ -42,7 +44,7 @@ export const checkBan: RequestHandler = async (request, response, next) => {
4244
if (!accessAllowed) {
4345
response.status(500);
4446
if (request.directory === 'web') {
45-
return response.render('web/login.ejs', { toast: 'No access. Must be tester or dev', redirect: request.originalUrl });
47+
return response.jsx(<WebLoginView ctx={buildContext(response)} toast="No access. Must be tester or dev" redirect={request.originalUrl} />);
4648
} else {
4749
return response.render('portal/error_fatal.ejs', {
4850
code: 5989999,
@@ -80,10 +82,7 @@ export const checkBan: RequestHandler = async (request, response, next) => {
8082
banMessage += `\n\nIf you have any questions, please contact the moderators on the Pretendo Network Forum (https://preten.do/ban-appeal/).`;
8183

8284
if (request.directory === 'web') {
83-
return response.render('web/login.ejs', {
84-
toast: banMessage,
85-
redirect: request.originalUrl
86-
});
85+
return response.jsx(<WebLoginView ctx={buildContext(response)} toast={banMessage} redirect={request.originalUrl} />);
8786
} else {
8887
return response.render(request.directory + '/error_fatal.ejs', {
8988
message: banMessage,

apps/juxtaposition-ui/src/middleware/consoleAuth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const consoleAuth: RequestHandler = async (request, response, next) => {
2424
request.paramPackData = ppack ? decodeParamPack(ppack) : null;
2525
response.header('X-Nintendo-WhiteList', config.whitelist);
2626

27-
if (!request.user) {
27+
if (!request.user && request.cookies.access_token) {
2828
try {
2929
// Developer accounts may also use an OAuth token for console frontends
3030
const user = await getUserDataFromToken(request.cookies.access_token);
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { processLanguage } from '@/util';
2+
import type { Request, RequestHandler } from 'express';
23

3-
export async function detectVersion(request, response, next) {
4-
request.timerDate = Date.now();
4+
export const detectVersion: RequestHandler = async (request, response, next) => {
55
// Check the domain and set the directory
66
if (includes(request, 'juxt')) {
77
request.directory = 'web';
@@ -13,8 +13,8 @@ export async function detectVersion(request, response, next) {
1313
request.isWrite = request.method === 'POST' || request.method === 'PUT' || request.method === 'DELETE';
1414

1515
next();
16-
}
16+
};
1717

18-
function includes(request, domain) {
18+
function includes(request: Request, domain: string): boolean {
1919
return request.subdomains.findIndex(element => element.includes(domain)) !== -1;
2020
}

apps/juxtaposition-ui/src/middleware/discovery.js renamed to apps/juxtaposition-ui/src/middleware/discovery.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { database as db } from '@/database';
22
import { config } from '@/config';
3+
import { WebLoginView } from '@/services/juxt-web/views/web/loginView';
4+
import { buildContext } from '@/services/juxt-web/views/context';
5+
import type { RequestHandler } from 'express';
36

4-
export async function checkDiscovery(request, response, next) {
7+
export const checkDiscovery: RequestHandler = async (request, response, next) => {
58
const discovery = await db.getEndPoint(config.serverEnvironment);
69

710
if (!discovery || discovery.status !== 0) {
@@ -19,7 +22,7 @@ export async function checkDiscovery(request, response, next) {
1922
break;
2023
}
2124
if (request.directory === 'web') {
22-
return response.render('web/login.ejs', { toast: message, redirect: request.originalUrl });
25+
return response.jsx(<WebLoginView ctx={buildContext(response)} toast={message} redirect={request.originalUrl} />);
2326
} else {
2427
return response.render('portal/error_fatal.ejs', {
2528
message,
@@ -33,4 +36,4 @@ export async function checkDiscovery(request, response, next) {
3336
}
3437

3538
next();
36-
}
39+
};

apps/juxtaposition-ui/src/middleware/jsx.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export function renderJsx(el: ReactElement): string {
1515
*/
1616
export const jsxRenderer: RequestHandler = (request, response, next) => {
1717
response.jsx = (el, addDoctype): typeof response => {
18-
const prefix = addDoctype ? htmlDoctype + '\n' : '';
18+
const prefix = (addDoctype ?? true) ? htmlDoctype + '\n' : '';
1919
response.send(prefix + renderJsx(el));
2020
return response;
2121
};

apps/juxtaposition-ui/src/models/endpoint.js

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Schema, model } from 'mongoose';
2+
import type { HydratedDocument } from 'mongoose';
3+
4+
export type Endpoint = {
5+
status: number;
6+
server_access_level: string;
7+
topics: boolean;
8+
guest_access: boolean;
9+
new_users: boolean;
10+
host: string;
11+
api_host: string;
12+
portal_host: string;
13+
n3ds_host: string;
14+
} & Document;
15+
16+
export type HydratedEndpointDocument = HydratedDocument<Endpoint>;
17+
18+
export const endpointSchema = new Schema<Endpoint>({
19+
status: Number,
20+
server_access_level: String,
21+
topics: Boolean,
22+
guest_access: Boolean,
23+
new_users: {
24+
type: Boolean,
25+
default: true
26+
},
27+
host: String,
28+
api_host: String,
29+
portal_host: String,
30+
n3ds_host: String
31+
});
32+
33+
export const Endpoint = model('Endpoint', endpointSchema);
34+
export const ENDPOINT = Endpoint;

apps/juxtaposition-ui/src/models/report.js

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Schema, model } from 'mongoose';
2+
import type { HydratedDocument, Model } from 'mongoose';
3+
4+
export interface IReport {
5+
pid: number;
6+
reported_by: number;
7+
post_id: string;
8+
reason: number;
9+
message: string;
10+
created_at: Date;
11+
resolved?: boolean | null;
12+
note?: string | null;
13+
resolved_by?: number | null;
14+
resolved_at?: Date | null;
15+
}
16+
17+
export type ReportModel = Model<IReport>;
18+
export type HydratedReportDocument = HydratedDocument<IReport>;
19+
20+
export interface IReportMethods {
21+
resolve(pid: number, note: string | null): Promise<void>;
22+
}
23+
24+
export const ReportSchema = new Schema<IReport, ReportModel, IReportMethods>({
25+
pid: {
26+
type: Number,
27+
required: true
28+
},
29+
reported_by: {
30+
type: Number,
31+
required: true
32+
},
33+
post_id: {
34+
type: String,
35+
required: true
36+
},
37+
reason: {
38+
type: Number,
39+
required: true
40+
},
41+
message: {
42+
type: String,
43+
required: true
44+
},
45+
created_at: {
46+
type: Date,
47+
required: true,
48+
default: new Date()
49+
},
50+
resolved: {
51+
type: Boolean,
52+
default: false
53+
},
54+
note: String,
55+
resolved_by: Number,
56+
resolved_at: Date
57+
});
58+
59+
ReportSchema.method<HydratedReportDocument>('resolve', async function (pid, note) {
60+
this.set('resolved', true);
61+
this.set('resolved_by', pid);
62+
this.set('resolved_at', new Date());
63+
this.set('note', note);
64+
await this.save();
65+
});
66+
67+
export const Report = model<IReport, ReportModel>('Report', ReportSchema);
68+
export const REPORT = Report;

0 commit comments

Comments
 (0)