1
+ import { FastifyInstance , FastifyRequest , FastifyReply } from 'fastify'
2
+ import { JWTPayload } from 'jose'
3
+ import sql from 'mssql'
4
+
5
+ import DefaultRepository from '../repositories/default.repository'
6
+
7
+ declare module 'fastify' {
8
+ export interface FastifyInstance {
9
+ getSqlPool : ( name ?: string ) => Promise < sql . ConnectionPool >
10
+ }
11
+
12
+ export interface FastifyRequest {
13
+ jwt : JWTPayload
14
+ hasRole : ( role : string ) => boolean
15
+ hasPermission : ( permission : string , scope ?: string ) => boolean
16
+ }
17
+
18
+ export interface FastifyReply {
19
+ success : ( data ?: any , code ?: number , executionTime ?: number ) => FastifyReply
20
+ fail : ( data ?: any , code ?: number , executionTime ?: number ) => FastifyReply
21
+ error : ( message ?: string , code ?: number , executionTime ?: number ) => FastifyReply
22
+ }
23
+ }
24
+
25
+ export default async function ( fastify : FastifyInstance ) {
26
+ /**
27
+ * Get all default for current user
28
+ * @route GET /api/{APP_VERSION}/{serviceName}/default
29
+ */
30
+ fastify . get ( '' , async ( request : FastifyRequest < { } > , reply : FastifyReply ) => {
31
+ try {
32
+ if ( ! request . jwt )
33
+ return reply . error ( 'missing jwt!' , 401 )
34
+
35
+ const pool = await fastify . getSqlPool ( )
36
+ const repo = new DefaultRepository ( request . log , pool )
37
+
38
+ request . log . debug ( { } , 'fetching default' )
39
+ const data = await repo . list ( request . jwt . sub )
40
+
41
+ request . log . debug ( { default_length : data ?. length } , 'fetched default' )
42
+ return reply . success ( data )
43
+ } catch ( err ) {
44
+ request . log . error ( { err } , 'Failed to fetch default from database' )
45
+ return reply . error ( 'failed to fetch default from database' )
46
+ }
47
+ } )
48
+
49
+ /**
50
+ * Create a new default for user
51
+ * @route GET /api/{APP_VERSION}/{serviceName}/default
52
+ */
53
+ fastify . get ( '' , async ( request : FastifyRequest < { } > , reply : FastifyReply ) => {
54
+ try {
55
+ if ( ! request . jwt )
56
+ return reply . error ( 'missing jwt!' , 401 )
57
+
58
+ const pool = await fastify . getSqlPool ( )
59
+ const repo = new DefaultRepository ( request . log , pool )
60
+
61
+ request . log . debug ( { } , 'creating default' )
62
+ const data = await repo . create ( request . jwt . sub , request . body )
63
+
64
+ request . log . debug ( { success : data } , 'created default' )
65
+ return reply . success ( data )
66
+ } catch ( err ) {
67
+ request . log . error ( { err } , 'Failed to create default from database' )
68
+ return reply . error ( 'failed to create default from database' )
69
+ }
70
+ } )
71
+
72
+ /**
73
+ * Update a specific user default
74
+ * @route put /api/{APP_VERSION}/{serviceName}/default/:id
75
+ */
76
+ fastify . put ( '/:id' , async ( request : FastifyRequest < { } > , reply : FastifyReply ) => {
77
+ try {
78
+ if ( ! request . jwt )
79
+ return reply . error ( 'missing jwt!' , 401 )
80
+
81
+ const pool = await fastify . getSqlPool ( )
82
+ const repo = new DefaultRepository ( request . log , pool )
83
+
84
+ request . log . debug ( { } , 'updating default' )
85
+ const data = await repo . update ( + request . params . id , request . jwt . sub , request . body )
86
+
87
+ request . log . debug ( { success : data } , 'updated default' )
88
+ return reply . success ( data )
89
+ } catch ( err ) {
90
+ request . log . error ( { err } , 'Failed to update default in database' )
91
+ return reply . error ( 'failed to update default in database' )
92
+ }
93
+ } )
94
+
95
+ /**
96
+ * Delete a specific user default
97
+ * @route DELETE /api/{APP_VERSION}/{serviceName}/default/:id
98
+ */
99
+ fastify . delete ( '/:id' , async ( request : FastifyRequest < { Params : { id : number } } > , reply : FastifyReply ) => {
100
+ try {
101
+ if ( ! request . jwt )
102
+ return reply . error ( 'missing jwt!' , 401 )
103
+
104
+ const pool = await fastify . getSqlPool ( )
105
+ const repo = new DefaultRepository ( request . log , pool )
106
+
107
+ request . log . debug ( { } , 'deleting default' )
108
+ const data = await repo . delete ( + request . params . id , request . jwt . sub )
109
+
110
+ request . log . debug ( { success : data } , 'removed default' )
111
+ return reply . success ( data )
112
+ } catch ( err ) {
113
+ request . log . error ( { err } , 'Failed to delete default from database' )
114
+ return reply . error ( 'failed to delete default from database' )
115
+ }
116
+ } )
117
+ }
0 commit comments