1 /*
2 * Make.org Core API
3 * Copyright (C) 2018 Make.org
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 */
19
20 package org.make.api.user
21
22 import org.make.api.operation.OperationServiceComponent
23 import org.make.api.question.QuestionServiceComponent
24 import org.make.api.technical.MakeDirectives.MakeDirectivesDependencies
25 import org.make.api.user.DefaultPersistentUserServiceComponent.PersistentUser
26 import org.make.core._
27 import org.make.core.user._
28
29 import akka.http.scaladsl.server._
30 import io.swagger.annotations._
31
32 import javax.ws.rs.Path
33
34 @Api(value = "Admin Consultation Moderators")
35 @Path(value = "/admin/consultation/moderators")
36 trait AdminConsultationModeratorApi extends Directives {
37
38 @ApiOperation(
39 value = "get-consultation-moderator",
40 httpMethod = "GET",
41 code = HttpCodes.OK,
42 authorizations = Array(
43 new Authorization(
44 value = "MakeApi",
45 scopes = Array(new AuthorizationScope(scope = "admin", description = "BO Admin"))
46 )
47 )
48 )
49 @ApiResponses(
50 value =
51 Array(new ApiResponse(code = HttpCodes.OK, message = "Ok", response = classOf[ConsultationModerator.Response]))
52 )
53 @ApiImplicitParams(
54 value = Array(
55 new ApiImplicitParam(
56 name = "moderatorId",
57 paramType = "path",
58 dataType = "string",
59 example = "11111111-2222-3333-4444-555555555555"
60 )
61 )
62 )
63 @Path(value = "/{moderatorId}")
64 def getConsultationModerator: Route
65
66 @ApiOperation(
67 value = "get-consultation-moderators",
68 httpMethod = "GET",
69 code = HttpCodes.OK,
70 authorizations = Array(
71 new Authorization(
72 value = "MakeApi",
73 scopes = Array(new AuthorizationScope(scope = "admin", description = "BO Admin"))
74 )
75 )
76 )
77 @ApiImplicitParams(
78 value = Array(
79 new ApiImplicitParam(
80 name = "_start",
81 paramType = "query",
82 dataType = "int",
83 allowableValues = "range[0, infinity]"
84 ),
85 new ApiImplicitParam(
86 name = "_end",
87 paramType = "query",
88 dataType = "int",
89 allowableValues = "range[0, infinity]"
90 ),
91 new ApiImplicitParam(
92 name = "_sort",
93 paramType = "query",
94 dataType = "string",
95 allowableValues = PersistentUser.swaggerAllowableValues
96 ),
97 new ApiImplicitParam(
98 name = "_order",
99 paramType = "query",
100 dataType = "string",
101 allowableValues = Order.swaggerAllowableValues
102 ),
103 new ApiImplicitParam(name = "id", paramType = "query", dataType = "string", allowMultiple = true),
104 new ApiImplicitParam(name = "email", paramType = "query", dataType = "string"),
105 new ApiImplicitParam(name = "firstName", paramType = "query", dataType = "string")
106 )
107 )
108 @ApiResponses(
109 value = Array(
110 new ApiResponse(code = HttpCodes.OK, message = "Ok", response = classOf[Array[ConsultationModerator.Response]])
111 )
112 )
113 @Path(value = "/")
114 def getConsultationModerators: Route
115
116 @ApiOperation(
117 value = "create-consultation-moderator",
118 httpMethod = "POST",
119 code = HttpCodes.Created,
120 authorizations = Array(
121 new Authorization(
122 value = "MakeApi",
123 scopes = Array(new AuthorizationScope(scope = "admin", description = "BO Admin"))
124 )
125 )
126 )
127 @ApiImplicitParams(
128 value = Array(
129 new ApiImplicitParam(
130 value = "body",
131 paramType = "body",
132 dataType = "org.make.api.user.EventScopedModerator.Request.Create"
133 )
134 )
135 )
136 @ApiResponses(
137 value = Array(
138 new ApiResponse(code = HttpCodes.Created, message = "Created", response = classOf[ConsultationModerator.Response])
139 )
140 )
141 @Path(value = "/")
142 def createConsultationModerator: Route
143
144 @ApiOperation(
145 value = "update-consultation-moderator",
146 httpMethod = "PUT",
147 code = HttpCodes.OK,
148 authorizations = Array(
149 new Authorization(
150 value = "MakeApi",
151 scopes = Array(
152 new AuthorizationScope(scope = "admin", description = "BO Admin"),
153 new AuthorizationScope(scope = "moderator", description = "BO Moderator")
154 )
155 )
156 )
157 )
158 @ApiImplicitParams(
159 value = Array(
160 new ApiImplicitParam(name = "moderatorId", paramType = "path", dataType = "string"),
161 new ApiImplicitParam(
162 value = "body",
163 paramType = "body",
164 dataType = "org.make.api.user.EventScopedModerator.Request.Update"
165 )
166 )
167 )
168 @ApiResponses(
169 value =
170 Array(new ApiResponse(code = HttpCodes.OK, message = "Ok", response = classOf[ConsultationModerator.Response]))
171 )
172 @Path(value = "/{moderatorId}")
173 def updateConsultationModerator: Route
174
175 def routes: Route =
176 getConsultationModerator ~ getConsultationModerators ~ createConsultationModerator ~ updateConsultationModerator
177 }
178
179 trait AdminConsultationModeratorApiComponent {
180 def adminConsultationModeratorApi: AdminConsultationModeratorApi
181 }
182
183 trait DefaultAdminConsultationModeratorApiComponent
184 extends AdminConsultationModeratorApiComponent
185 with DefaultEventScopedModeratorApiComponent {
186
187 this: MakeDirectivesDependencies
188 with UserServiceComponent
189 with PersistentUserServiceComponent
190 with QuestionServiceComponent
191 with OperationServiceComponent =>
192
193 override lazy val adminConsultationModeratorApi: AdminConsultationModeratorApi =
194 new DefaultAdminConsultationModeratorApi
195
196 class DefaultAdminConsultationModeratorApi extends AdminConsultationModeratorApi {
197
198 private val base: EventScopedModeratorApi =
199 new DefaultEventScopedModeratorApi(Role.RoleConsultationModerator, "consultation", "ConsultationModerator")
200
201 override def getConsultationModerator: Route = base.getModerator
202 override def getConsultationModerators: Route = base.getModerators
203 override def createConsultationModerator: Route = base.createModerator
204 override def updateConsultationModerator: Route = base.updateModerator
205 }
206 }
207
208 /** Alias of the shared models, mirroring `DialogueModerator`. */
209 object ConsultationModerator {
210 object Request {
211 type Create = EventScopedModerator.Request.Create
212 val Create: EventScopedModerator.Request.Create.type = EventScopedModerator.Request.Create
213
214 type Update = EventScopedModerator.Request.Update
215 val Update: EventScopedModerator.Request.Update.type = EventScopedModerator.Request.Update
216 }
217
218 type Response = EventScopedModerator.Response
219 val Response: EventScopedModerator.Response.type = EventScopedModerator.Response
220 }