1
+ package org.ionproject.codegarten
2
+
3
+ import org.ionproject.codegarten.responses.siren.SirenLink
4
+ import org.springframework.http.MediaType
5
+ import org.springframework.web.util.UriTemplate
6
+ import java.net.URI
7
+
8
+ object Routes {
9
+ val INPUT_CONTENT_TYPE = MediaType .APPLICATION_FORM_URLENCODED
10
+
11
+ const val SCHEME = " http"
12
+ const val PORT = " 8080"
13
+ const val HOST = " localhost:$PORT "
14
+ const val API_BASE_URI = " /api"
15
+ const val IM_BASE_URI = " /im"
16
+
17
+ const val PAGE_TEMPLATE_QUERY = " {?page,limit}"
18
+ const val PAGE_QUERY = " ?page={page}&limit={limit}"
19
+
20
+ const val ORG_PARAM = " orgId"
21
+ const val CLASSROOM_PARAM = " classroomNumber"
22
+ const val ASSIGNMENT_PARAM = " assignmentNumber"
23
+ const val DELIVERY_PARAM = " deliveryNumber"
24
+ const val USER_PARAM = " userId"
25
+
26
+
27
+ // Error
28
+ const val ERROR_HREF = " /error"
29
+
30
+
31
+ // Interaction Manager routes
32
+ const val AUTH_HREF = " $IM_BASE_URI /oauth"
33
+ const val AUTH_CODE_HREF = " $AUTH_HREF /authorize"
34
+ const val AUTH_TOKEN_HREF = " $AUTH_HREF /access_token"
35
+ const val GH_INSTALLATIONS_HREF = " $IM_BASE_URI /github/install"
36
+ const val GH_INSTALLATIONS_CB_HREF = " $IM_BASE_URI /github/install/cb"
37
+
38
+
39
+ // Users
40
+ const val USER_HREF = " $API_BASE_URI /user"
41
+ const val USER_BY_ID_HREF = " $API_BASE_URI /users/{$USER_PARAM }"
42
+
43
+ val USER_BY_ID_HREF_TEMPLATE = UriTemplate (USER_BY_ID_HREF )
44
+
45
+ fun getUserByIdUri (userId : Int ) = USER_BY_ID_HREF_TEMPLATE .expand(userId)
46
+
47
+
48
+ // Organizations
49
+ const val ORGS_HREF = " $API_BASE_URI /orgs"
50
+ const val ORG_BY_ID_HREF = " $ORGS_HREF /{$ORG_PARAM }"
51
+
52
+ val ORG_BY_ID_HREF_TEMPLATE = UriTemplate (ORG_BY_ID_HREF )
53
+
54
+ fun getOrgByIdUri (orgId : Int ) = ORG_BY_ID_HREF_TEMPLATE .expand(orgId)
55
+
56
+
57
+ // Classrooms
58
+ const val CLASSROOMS_HREF = " $ORG_BY_ID_HREF /classrooms"
59
+ const val CLASSROOM_BY_NUMBER_HREF = " $CLASSROOMS_HREF /{$CLASSROOM_PARAM }"
60
+
61
+ val CLASSROOM_HREF_TEMPLATE = UriTemplate (CLASSROOMS_HREF )
62
+ val CLASSROOM_BY_NUMBER_HREF_TEMPLATE = UriTemplate (CLASSROOM_BY_NUMBER_HREF )
63
+
64
+ fun getClassroomsUri (orgId : Int ) = CLASSROOM_HREF_TEMPLATE .expand(orgId)
65
+ fun getClassroomByNumberUri (orgId : Int , classroomNumber : Int ) =
66
+ CLASSROOM_BY_NUMBER_HREF_TEMPLATE .expand(orgId, classroomNumber)
67
+
68
+
69
+ // Assignments
70
+ const val ASSIGNMENTS_HREF = " $CLASSROOM_BY_NUMBER_HREF /assignments"
71
+ const val ASSIGNMENT_BY_NUMBER_HREF = " $ASSIGNMENTS_HREF /{$ASSIGNMENT_PARAM }"
72
+ const val ASSIGNMENTS_OF_USER_HREF = " $USER_HREF /assignments"
73
+
74
+ val ASSIGNMENTS_HREF_TEMPLATE = UriTemplate (ASSIGNMENTS_HREF )
75
+ val ASSIGNMENT_BY_NUMBER_HREF_TEMPLATE = UriTemplate (ASSIGNMENT_BY_NUMBER_HREF )
76
+
77
+ fun getAssignmentsUri (orgId : Int , classroomNumber : Int ) = ASSIGNMENTS_HREF_TEMPLATE .expand(orgId, classroomNumber)
78
+ fun getAssignmentByNumberUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int ) =
79
+ ASSIGNMENT_BY_NUMBER_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber)
80
+
81
+
82
+ // Deliveries
83
+ const val DELIVERIES_HREF = " $ASSIGNMENT_BY_NUMBER_HREF /deliveries"
84
+ const val DELIVERY_BY_NUMBER_HREF = " $DELIVERIES_HREF /{$DELIVERY_PARAM }"
85
+
86
+ val DELIVERIES_HREF_TEMPLATE = UriTemplate (DELIVERIES_HREF )
87
+ val DELIVERY_BY_NUMBER_HREF_TEMPLATE = UriTemplate (DELIVERY_BY_NUMBER_HREF )
88
+
89
+ fun getDeliveriesUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int ) =
90
+ DELIVERIES_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber)
91
+ fun getDeliveryByNumberUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int , deliveryNumber : Int ) =
92
+ DELIVERY_BY_NUMBER_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber, deliveryNumber)
93
+
94
+
95
+ // User Classroom
96
+ const val USERS_OF_CLASSROOM_HREF = " $CLASSROOM_BY_NUMBER_HREF /users"
97
+ const val USER_OF_CLASSROOM_HREF = " $USERS_OF_CLASSROOM_HREF /{$USER_PARAM }"
98
+
99
+ val USER_OF_CLASSROOM_HREF_TEMPLATE = UriTemplate (USER_OF_CLASSROOM_HREF )
100
+
101
+ fun getUserOfClassroomUri (orgId : Int , classroomNumber : Int , userId : Int ) =
102
+ USER_OF_CLASSROOM_HREF_TEMPLATE .expand(orgId, classroomNumber, userId)
103
+
104
+
105
+ // User Assignment
106
+ const val USERS_OF_ASSIGNMENT_HREF = " $ASSIGNMENT_BY_NUMBER_HREF /users"
107
+ const val USER_OF_ASSIGNMENT_HREF = " $USERS_OF_ASSIGNMENT_HREF /{$USER_PARAM }"
108
+
109
+ val USERS_OF_ASSIGNMENT_HREF_TEMPLATE = UriTemplate (USERS_OF_ASSIGNMENT_HREF )
110
+ val USER_OF_ASSIGNMENT_HREF_TEMPLATE = UriTemplate (USER_OF_ASSIGNMENT_HREF )
111
+
112
+ fun getUsersOfAssignmentUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int ) =
113
+ USERS_OF_ASSIGNMENT_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber)
114
+ fun getUserOfAssignmentUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int , userId : Int ) =
115
+ USER_OF_ASSIGNMENT_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber, userId)
116
+
117
+
118
+ // User Deliveries
119
+ const val DELIVERIES_OF_USER_HREF = " $USER_OF_ASSIGNMENT_HREF /deliveries"
120
+
121
+ val DELIVERIES_OF_USER_HREF_TEMPLATE = UriTemplate (DELIVERIES_OF_USER_HREF )
122
+
123
+ fun getDeliveriesOfUserUri (orgId : Int , classroomNumber : Int , assignmentNumber : Int , userId : Int ) =
124
+ DELIVERIES_OF_USER_HREF_TEMPLATE .expand(orgId, classroomNumber, assignmentNumber, userId)
125
+
126
+
127
+ // Helpers
128
+ fun createSirenLinkListForPagination (uri : URI , page : Int , limit : Int , collectionSize : Int ): List <SirenLink > {
129
+ val toReturn = mutableListOf (
130
+ SirenLink (listOf (" self" ), UriTemplate (" ${uri}$PAGE_QUERY " ).expand(page, limit)),
131
+ SirenLink (listOf (" page" ), hrefTemplate = " ${uri}$PAGE_TEMPLATE_QUERY " )
132
+ )
133
+
134
+ if (page > 0 && collectionSize > 0 )
135
+ toReturn.add(
136
+ SirenLink (
137
+ listOf (" previous" ),
138
+ UriTemplate (" ${uri}$PAGE_QUERY " )
139
+ .expand(page - 1 , limit)
140
+ )
141
+ )
142
+
143
+ if (collectionSize > ((page + 1 ) * limit))
144
+ toReturn.add(
145
+ SirenLink (
146
+ listOf (" next" ),
147
+ UriTemplate (" ${uri}$PAGE_QUERY " )
148
+ .expand(page + 1 , limit)
149
+ )
150
+ )
151
+
152
+ return toReturn
153
+ }
154
+
155
+ fun URI.includeHost () = URI (SCHEME .toLowerCase(), HOST , this .path, this .query, this .fragment)
156
+ }
0 commit comments