Skip to content

Commit e6ef4be

Browse files
committed
Format code
1 parent e30468e commit e6ef4be

File tree

17 files changed

+162
-143
lines changed

17 files changed

+162
-143
lines changed

Diff for: app/[orgId]/contests/[id]/page.tsx

+11-9
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,21 @@ export default function ContestDetailsPage() {
4040
useEffect(() => {
4141
const fetchUserData = async () => {
4242
try {
43-
const res = await fetch('/api/me');
43+
const res = await fetch("/api/me");
4444
if (!res.ok) {
45-
throw new Error('Failed to fetch user data');
45+
throw new Error("Failed to fetch user data");
4646
}
4747
const userData = await res.json();
48-
48+
4949
// Find the user's role in the current organization
50-
const currentOrg = userData.orgs.find((org: any) => org.nameId === orgId);
50+
const currentOrg = userData.orgs.find(
51+
(org: any) => org.nameId === orgId,
52+
);
5153
if (currentOrg) {
5254
setUserRole(currentOrg.role);
5355
}
5456
} catch (err) {
55-
console.error('Error fetching user data:', err);
57+
console.error("Error fetching user data:", err);
5658
}
5759
};
5860

@@ -145,17 +147,17 @@ export default function ContestDetailsPage() {
145147
};
146148

147149
const status = getContestStatus();
148-
150+
149151
// Determine if problems should be shown
150152
const shouldShowProblems = () => {
151153
const now = new Date();
152154
const startTime = new Date(contestData.startTime);
153-
155+
154156
// If contest has started, show problems to everyone
155157
if (now >= startTime) return true;
156-
158+
157159
// For upcoming contests, only show problems to non-members (admins, instructors)
158-
return userRole !== 'member';
160+
return userRole !== "member";
159161
};
160162

161163
if (isLoading) {

Diff for: app/api-doc/page.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ export default async function ApiDoc() {
1111
</Suspense>
1212
</section>
1313
);
14-
}
14+
}

Diff for: app/api-doc/react-swagger.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
'use client';
1+
"use client";
22

3-
import dynamic from 'next/dynamic';
3+
import dynamic from "next/dynamic";
44

5-
const SwaggerUI = dynamic(() => import('swagger-ui-react'), { ssr: false });
5+
const SwaggerUI = dynamic(() => import("swagger-ui-react"), { ssr: false });
66

77
type Props = {
88
spec: Record<string, any>;
@@ -20,4 +20,4 @@ function ReactSwagger({ spec }: Props) {
2020
);
2121
}
2222

23-
export default ReactSwagger;
23+
export default ReactSwagger;

Diff for: app/api/metrics/route.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { NextResponse } from "next/server"
2-
import { metrics } from "@/lib/metrics"
1+
import { NextResponse } from "next/server";
2+
import { metrics } from "@/lib/metrics";
33

44
/**
55
* @swagger
@@ -22,12 +22,12 @@ import { metrics } from "@/lib/metrics"
2222
* # TYPE http_request_duration_ms histogram
2323
* http_request_duration_ms_bucket{method="GET",path="/api/metrics",le="10"} 1
2424
*/
25-
export const runtime = 'edge'
25+
export const runtime = "edge";
2626

2727
export async function GET() {
2828
return new NextResponse(metrics.getMetrics(), {
2929
headers: {
30-
'Content-Type': 'text/plain; version=0.0.4',
30+
"Content-Type": "text/plain; version=0.0.4",
3131
},
32-
})
33-
}
32+
});
33+
}

Diff for: lib/metrics.ts

+44-40
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,85 @@
11
// Simple in-memory metrics store compatible with Edge Runtime
22
class EdgeMetrics {
3-
private counters: Map<string, number>
4-
private histograms: Map<string, number[]>
3+
private counters: Map<string, number>;
4+
private histograms: Map<string, number[]>;
55

66
constructor() {
7-
this.counters = new Map()
8-
this.histograms = new Map()
7+
this.counters = new Map();
8+
this.histograms = new Map();
99
}
1010

1111
// Counter methods
1212
incrementCounter(name: string, labels: Record<string, string>) {
13-
const key = this.getKey(name, labels)
14-
const current = this.counters.get(key) || 0
15-
this.counters.set(key, current + 1)
13+
const key = this.getKey(name, labels);
14+
const current = this.counters.get(key) || 0;
15+
this.counters.set(key, current + 1);
1616
}
1717

1818
// Histogram methods
19-
observeHistogram(name: string, value: number, labels: Record<string, string>) {
20-
const key = this.getKey(name, labels)
21-
const values = this.histograms.get(key) || []
22-
values.push(value)
23-
this.histograms.set(key, values)
19+
observeHistogram(
20+
name: string,
21+
value: number,
22+
labels: Record<string, string>,
23+
) {
24+
const key = this.getKey(name, labels);
25+
const values = this.histograms.get(key) || [];
26+
values.push(value);
27+
this.histograms.set(key, values);
2428
}
2529

2630
// Get metrics in Prometheus format
2731
getMetrics(): string {
28-
let output = ''
32+
let output = "";
2933

3034
// Counter metrics
3135
this.counters.forEach((value, key) => {
32-
const [name, labelStr] = this.parseKey(key)
33-
output += `# TYPE ${name} counter\n`
34-
output += `${name}${labelStr} ${value}\n`
35-
})
36+
const [name, labelStr] = this.parseKey(key);
37+
output += `# TYPE ${name} counter\n`;
38+
output += `${name}${labelStr} ${value}\n`;
39+
});
3640

3741
// Histogram metrics
3842
this.histograms.forEach((values, key) => {
39-
const [name, labelStr] = this.parseKey(key)
40-
output += `# TYPE ${name} histogram\n`
43+
const [name, labelStr] = this.parseKey(key);
44+
output += `# TYPE ${name} histogram\n`;
4145

4246
// Calculate quantiles
43-
const sorted = values.sort((a, b) => a - b)
44-
const count = sorted.length
45-
const sum = sorted.reduce((a, b) => a + b, 0)
47+
const sorted = values.sort((a, b) => a - b);
48+
const count = sorted.length;
49+
const sum = sorted.reduce((a, b) => a + b, 0);
4650

47-
output += `${name}_count${labelStr} ${count}\n`
48-
output += `${name}_sum${labelStr} ${sum}\n`
51+
output += `${name}_count${labelStr} ${count}\n`;
52+
output += `${name}_sum${labelStr} ${sum}\n`;
4953

5054
// Add bucket information
51-
const buckets = [10, 50, 100, 200, 500, 1000, 2000, 5000]
52-
buckets.forEach(bucket => {
53-
const le = bucket
54-
const count = sorted.filter(v => v <= le).length
55-
output += `${name}_bucket${this.addLe(labelStr, le)} ${count}\n`
56-
})
57-
})
55+
const buckets = [10, 50, 100, 200, 500, 1000, 2000, 5000];
56+
buckets.forEach((bucket) => {
57+
const le = bucket;
58+
const count = sorted.filter((v) => v <= le).length;
59+
output += `${name}_bucket${this.addLe(labelStr, le)} ${count}\n`;
60+
});
61+
});
5862

59-
return output
63+
return output;
6064
}
6165

6266
private getKey(name: string, labels: Record<string, string>): string {
6367
const labelStr = Object.entries(labels)
6468
.map(([k, v]) => `${k}="${v}"`)
65-
.join(',')
66-
return `${name}{${labelStr}}`
69+
.join(",");
70+
return `${name}{${labelStr}}`;
6771
}
6872

6973
private parseKey(key: string): [string, string] {
70-
const match = key.match(/^(.+){(.+)}$/)
71-
if (!match) return [key, '']
72-
return [match[1], `{${match[2]}}`]
74+
const match = key.match(/^(.+){(.+)}$/);
75+
if (!match) return [key, ""];
76+
return [match[1], `{${match[2]}}`];
7377
}
7478

7579
private addLe(labelStr: string, le: number): string {
76-
if (labelStr === '') return `{le="${le}"}`
77-
return labelStr.replace('}', `,le="${le}"}`)
80+
if (labelStr === "") return `{le="${le}"}`;
81+
return labelStr.replace("}", `,le="${le}"}`);
7882
}
7983
}
8084

81-
export const metrics = new EdgeMetrics()
85+
export const metrics = new EdgeMetrics();

Diff for: lib/seeder.ts

+12-10
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export async function seedDatabase(config = seedConfig) {
5555
return false;
5656
}
5757
*/
58-
58+
5959
// Create users
6060
const users = await createUsers(config.users);
6161
const orgs = await createOrganizations(config.organizations, users);
@@ -129,7 +129,7 @@ async function createOrganizations(
129129
admins: SelectUser[];
130130
organizers: SelectUser[];
131131
members: SelectUser[];
132-
}
132+
},
133133
) {
134134
const createdOrgs = [];
135135

@@ -167,12 +167,12 @@ async function createOrganizations(
167167
}
168168

169169
async function createOrgMemberships(
170-
orgId: number,
170+
orgId: number,
171171
users: {
172172
admins: SelectUser[];
173173
organizers: SelectUser[];
174174
members: SelectUser[];
175-
}
175+
},
176176
) {
177177
const membershipValues = [
178178
// Assign first admin as owner
@@ -247,8 +247,8 @@ async function createContests(
247247
),
248248
organizerId: orgId,
249249
organizerKind: "org",
250-
allowList: [], // Add missing required fields
251-
disallowList: [], // Add missing required fields
250+
allowList: [], // Add missing required fields
251+
disallowList: [], // Add missing required fields
252252
})
253253
.returning();
254254

@@ -287,10 +287,12 @@ async function createGroups(
287287
.returning();
288288

289289
// Add random members to group
290-
const memberUsers = users.members.slice(0, membersPerGroup).map((user: SelectUser) => ({
291-
groupId: group.id,
292-
userId: user.id,
293-
}));
290+
const memberUsers = users.members
291+
.slice(0, membersPerGroup)
292+
.map((user: SelectUser) => ({
293+
groupId: group.id,
294+
userId: user.id,
295+
}));
294296

295297
await db.insert(groupMemberships).values(memberUsers);
296298
}

Diff for: middleware/error.ts

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
1-
import { NextResponse } from 'next/server'
2-
import type { NextRequest } from 'next/server'
1+
import { NextResponse } from "next/server";
2+
import type { NextRequest } from "next/server";
33

44
export function errorMiddleware(error: Error, request: NextRequest) {
55
// Log error details
66
console.error({
7-
type: 'error',
7+
type: "error",
88
timestamp: new Date().toISOString(),
99
url: request.url,
1010
name: error.name,
1111
message: error.message,
1212
stack: error.stack,
13-
})
13+
});
1414

1515
// Return appropriate error response
1616
return new NextResponse(
1717
JSON.stringify({
18-
status: 'error',
19-
message: process.env.NODE_ENV === 'production'
20-
? 'Internal Server Error'
21-
: error.message,
18+
status: "error",
19+
message:
20+
process.env.NODE_ENV === "production"
21+
? "Internal Server Error"
22+
: error.message,
2223
}),
2324
{
2425
status: 500,
25-
headers: { 'content-type': 'application/json' },
26-
}
27-
)
28-
}
26+
headers: { "content-type": "application/json" },
27+
},
28+
);
29+
}

Diff for: middleware/logging.ts

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
1-
import { NextResponse } from 'next/server'
2-
import type { NextRequest } from 'next/server'
1+
import { NextResponse } from "next/server";
2+
import type { NextRequest } from "next/server";
33

44
export function loggingMiddleware(request: NextRequest) {
5-
const startTime = Date.now()
6-
const requestId = crypto.randomUUID()
5+
const startTime = Date.now();
6+
const requestId = crypto.randomUUID();
77

88
// Log request
99
console.log({
10-
type: 'request',
10+
type: "request",
1111
id: requestId,
1212
timestamp: new Date().toISOString(),
1313
method: request.method,
1414
url: request.url,
15-
userAgent: request.headers.get('user-agent'),
16-
})
15+
userAgent: request.headers.get("user-agent"),
16+
});
1717

18-
const response = NextResponse.next()
18+
const response = NextResponse.next();
1919

2020
// Add request ID to response headers
21-
response.headers.set('X-Request-ID', requestId)
21+
response.headers.set("X-Request-ID", requestId);
2222

2323
// Log response timing
24-
const duration = Date.now() - startTime
24+
const duration = Date.now() - startTime;
2525
console.log({
26-
type: 'response',
26+
type: "response",
2727
id: requestId,
2828
timestamp: new Date().toISOString(),
2929
duration: `${duration}ms`,
3030
status: response.status,
31-
})
31+
});
3232

33-
return response
34-
}
33+
return response;
34+
}

0 commit comments

Comments
 (0)