File size: 3,156 Bytes
3d23b0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { FastifyPluginAsync } from 'fastify';
import * as handlers from './handlers';
import * as schemas from './schemas';
import validateUsername from '../../shared/middlewares/validate';
import type {
    StatusQuery,
    UserQuery,
    ContestQuery,
    StandingsQuery,
    ContestStatusQuery,
    BlogEntryQuery,
    RecentStatusQuery
} from './types';

const codeforcesRoutes: FastifyPluginAsync = async (fastify) => {
    // User routes (with username validation)
    fastify.get<{ Querystring: UserQuery }>(
        '/rating',
        { preHandler: [validateUsername], schema: schemas.userRatingSchema },
        handlers.getUserRatingHandler
    );

    fastify.get<{ Querystring: UserQuery }>(
        '/contest-history',
        { preHandler: [validateUsername], schema: schemas.contestHistorySchema },
        handlers.getContestHistoryHandler
    );

    fastify.get<{ Querystring: StatusQuery }>(
        '/status',
        { preHandler: [validateUsername], schema: schemas.userStatusSchema },
        handlers.getUserStatusHandler
    );

    fastify.get<{ Querystring: UserQuery }>(
        '/blogs',
        { preHandler: [validateUsername], schema: schemas.userBlogsSchema },
        handlers.getUserBlogsHandler
    );

    fastify.get<{ Querystring: UserQuery }>(
        '/solved-problems',
        { preHandler: [validateUsername], schema: schemas.solvedProblemsSchema },
        handlers.getSolvedProblemsHandler
    );

    // General platform routes
    fastify.get('/contests', { schema: schemas.contestsSchema }, handlers.getContestsHandler);
    fastify.get('/recent-actions', { schema: schemas.recentActionsSchema }, handlers.getRecentActionsHandler);
    fastify.get('/problems', { schema: schemas.problemsSchema }, handlers.getProblemsHandler);

    // Contest specific routes
    fastify.get<{ Querystring: StandingsQuery }>(
        '/contest/standings',
        { schema: schemas.contestStandingsSchema },
        handlers.getContestStandingsHandler
    );

    fastify.get<{ Querystring: ContestQuery }>(
        '/contest/rating-changes',
        { schema: schemas.contestRatingChangesSchema },
        handlers.getContestRatingChangesHandler
    );

    fastify.get<{ Querystring: ContestQuery }>(
        '/contest/hacks',
        { schema: schemas.contestHacksSchema },
        handlers.getContestHacksHandler
    );

    fastify.get<{ Querystring: ContestStatusQuery }>(
        '/contest/status',
        { schema: schemas.contestStatusSchema },
        handlers.getContestStatusHandler
    );

    // Problemset routes
    fastify.get<{ Querystring: RecentStatusQuery }>(
        '/problemset/recent-status',
        { schema: schemas.problemsetRecentStatusSchema },
        handlers.getProblemsetRecentStatusHandler
    );

    // Blog routes
    fastify.get<{ Querystring: BlogEntryQuery }>(
        '/blog/view',
        { schema: schemas.blogEntrySchema },
        handlers.getBlogEntryHandler
    );

    fastify.get<{ Querystring: BlogEntryQuery }>(
        '/blog/comments',
        { schema: schemas.blogCommentsSchema },
        handlers.getBlogCommentsHandler
    );
};

export default codeforcesRoutes;