1 package de.dlr.shepard.auth.users.endpoints;
2
3 import de.dlr.shepard.auth.permission.io.PermissionsIO;
4 import de.dlr.shepard.auth.permission.model.Roles;
5 import de.dlr.shepard.auth.users.entities.UserGroup;
6 import de.dlr.shepard.auth.users.io.UserGroupIO;
7 import de.dlr.shepard.auth.users.services.UserGroupService;
8 import de.dlr.shepard.common.util.Constants;
9 import de.dlr.shepard.common.util.QueryParamHelper;
10 import jakarta.enterprise.context.RequestScoped;
11 import jakarta.inject.Inject;
12 import jakarta.validation.Valid;
13 import jakarta.validation.constraints.NotNull;
14 import jakarta.validation.constraints.PositiveOrZero;
15 import jakarta.ws.rs.Consumes;
16 import jakarta.ws.rs.DELETE;
17 import jakarta.ws.rs.GET;
18 import jakarta.ws.rs.POST;
19 import jakarta.ws.rs.PUT;
20 import jakarta.ws.rs.Path;
21 import jakarta.ws.rs.PathParam;
22 import jakarta.ws.rs.Produces;
23 import jakarta.ws.rs.QueryParam;
24 import jakarta.ws.rs.core.MediaType;
25 import jakarta.ws.rs.core.Response;
26 import jakarta.ws.rs.core.Response.Status;
27 import java.util.ArrayList;
28 import java.util.List;
29 import org.eclipse.microprofile.openapi.annotations.Operation;
30 import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
31 import org.eclipse.microprofile.openapi.annotations.media.Content;
32 import org.eclipse.microprofile.openapi.annotations.media.Schema;
33 import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
34 import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody;
35 import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
36 import org.eclipse.microprofile.openapi.annotations.tags.Tag;
37
38 @Produces(MediaType.APPLICATION_JSON)
39 @Consumes(MediaType.APPLICATION_JSON)
40 @Path(Constants.USERGROUPS)
41 @RequestScoped
42 public class UserGroupRest {
43
44 @Inject
45 UserGroupService userGroupService;
46
47 @POST
48 @Tag(name = Constants.USERGROUP)
49 @Operation(description = "Create a new usergroup")
50 @APIResponse(
51 description = "created",
52 responseCode = "201",
53 content = @Content(schema = @Schema(implementation = UserGroupIO.class))
54 )
55 @APIResponse(responseCode = "400", description = "bad request")
56 @APIResponse(responseCode = "401", description = "not authorized")
57 public Response createUserGroup(
58 @RequestBody(
59 required = true,
60 content = @Content(schema = @Schema(implementation = UserGroupIO.class))
61 ) @Valid UserGroupIO userGroup
62 ) {
63 var newUserGroup = userGroupService.createUserGroup(userGroup);
64 return Response.ok(new UserGroupIO(newUserGroup)).status(Status.CREATED).build();
65 }
66
67 @PUT
68 @Path("/{" + Constants.USERGROUP_ID + "}")
69 @Tag(name = Constants.USERGROUP)
70 @Operation(description = "Update usergroup")
71 @APIResponse(
72 description = "ok",
73 responseCode = "200",
74 content = @Content(schema = @Schema(implementation = UserGroupIO.class))
75 )
76 @APIResponse(responseCode = "400", description = "bad request")
77 @APIResponse(responseCode = "401", description = "not authorized")
78 @APIResponse(responseCode = "403", description = "forbidden")
79 @APIResponse(responseCode = "404", description = "not found")
80 @Parameter(name = Constants.USERGROUP_ID)
81 public Response updateUserGroup(
82 @PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long id,
83 @RequestBody(
84 required = true,
85 content = @Content(schema = @Schema(implementation = UserGroupIO.class))
86 ) @Valid UserGroupIO userGroup
87 ) {
88 UserGroup updatedUserGroup = userGroupService.updateUserGroup(id, userGroup);
89 return Response.ok(new UserGroupIO(updatedUserGroup)).build();
90 }
91
92 @DELETE
93 @Path("/{" + Constants.USERGROUP_ID + "}")
94 @Tag(name = Constants.USERGROUP)
95 @Operation(description = "Delete usergroup")
96 @APIResponse(description = "deleted", responseCode = "204")
97 @APIResponse(responseCode = "400", description = "bad request")
98 @APIResponse(responseCode = "401", description = "not authorized")
99 @APIResponse(responseCode = "403", description = "forbidden")
100 @APIResponse(responseCode = "404", description = "not found")
101 @Parameter(name = Constants.USERGROUP_ID)
102 public Response deleteUserGroup(@PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long id) {
103 userGroupService.deleteUserGroup(id);
104 return Response.status(Status.NO_CONTENT).build();
105 }
106
107 @GET
108 @Path("/{" + Constants.USERGROUP_ID + "}")
109 @Tag(name = Constants.USERGROUP)
110 @Operation(description = "Get usergroup")
111 @APIResponse(
112 description = "ok",
113 responseCode = "200",
114 content = @Content(schema = @Schema(implementation = UserGroupIO.class))
115 )
116 @APIResponse(responseCode = "400", description = "bad request")
117 @APIResponse(responseCode = "401", description = "not authorized")
118 @APIResponse(responseCode = "403", description = "forbidden")
119 @APIResponse(responseCode = "404", description = "not found")
120 @Parameter(name = Constants.USERGROUP_ID)
121 public Response getUserGroup(@PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long id) {
122 UserGroup ret = userGroupService.getUserGroup(id);
123 return Response.ok(new UserGroupIO(ret)).build();
124 }
125
126 @GET
127 @Tag(name = Constants.USERGROUP)
128 @Operation(description = "Get all usergroups")
129 @APIResponse(
130 description = "ok",
131 responseCode = "200",
132 content = @Content(schema = @Schema(type = SchemaType.ARRAY, implementation = UserGroupIO.class))
133 )
134 @APIResponse(responseCode = "400", description = "bad request")
135 @APIResponse(responseCode = "401", description = "not authorized")
136 @Parameter(name = Constants.QP_PAGE)
137 @Parameter(name = Constants.QP_SIZE)
138 @Parameter(name = Constants.QP_ORDER_BY_ATTRIBUTE)
139 @Parameter(name = Constants.QP_ORDER_DESC)
140 public Response getAllUserGroups(
141 @QueryParam(Constants.QP_PAGE) @PositiveOrZero Integer page,
142 @QueryParam(Constants.QP_SIZE) @PositiveOrZero Integer size,
143 @QueryParam(Constants.QP_ORDER_BY_ATTRIBUTE) UserGroupAttributes orderBy,
144 @QueryParam(Constants.QP_ORDER_DESC) Boolean orderDesc
145 ) {
146 var params = new QueryParamHelper();
147 if (page != null && size != null) params = params.withPageAndSize(page, size);
148 if (orderBy != null) params = params.withOrderByAttribute(orderBy, orderDesc);
149 List<UserGroup> allUserGroups = userGroupService.getAllUserGroups(params);
150 var result = new ArrayList<UserGroupIO>(allUserGroups.size());
151 for (UserGroup userGroup : allUserGroups) {
152 result.add(new UserGroupIO(userGroup));
153 }
154 return Response.ok(result).build();
155 }
156
157 @GET
158 @Path("/{" + Constants.USERGROUP_ID + "}/" + Constants.PERMISSIONS)
159 @Tag(name = Constants.USERGROUP)
160 @Operation(description = "Get permissions")
161 @APIResponse(
162 description = "ok",
163 responseCode = "200",
164 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
165 )
166 @APIResponse(responseCode = "400", description = "bad request")
167 @APIResponse(responseCode = "401", description = "not authorized")
168 @APIResponse(responseCode = "403", description = "forbidden")
169 @APIResponse(responseCode = "404", description = "not found")
170 @Parameter(name = Constants.USERGROUP_ID)
171 public Response getUserGroupPermissions(
172 @PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long userGroupId
173 ) {
174 var perms = userGroupService.getUserGroupPermissions(userGroupId);
175 return Response.ok(new PermissionsIO(perms)).build();
176 }
177
178 @PUT
179 @Path("/{" + Constants.USERGROUP_ID + "}/" + Constants.PERMISSIONS)
180 @Tag(name = Constants.USERGROUP)
181 @Operation(description = "Edit permissions")
182 @APIResponse(
183 description = "ok",
184 responseCode = "200",
185 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
186 )
187 @APIResponse(responseCode = "400", description = "bad request")
188 @APIResponse(responseCode = "401", description = "not authorized")
189 @APIResponse(responseCode = "403", description = "forbidden")
190 @APIResponse(responseCode = "404", description = "not found")
191 @Parameter(name = Constants.USERGROUP_ID)
192 public Response editUserGroupPermissions(
193 @PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long userGroupId,
194 @RequestBody(
195 required = true,
196 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
197 ) @Valid PermissionsIO permissions
198 ) {
199 var perms = userGroupService.updateUserGroupPermissions(permissions, userGroupId);
200 return Response.ok(new PermissionsIO(perms)).build();
201 }
202
203 @GET
204 @Path("/{" + Constants.USERGROUP_ID + "}/" + Constants.ROLES)
205 @Tag(name = Constants.USERGROUP)
206 @Operation(description = "Get roles")
207 @APIResponse(
208 description = "ok",
209 responseCode = "200",
210 content = @Content(schema = @Schema(implementation = Roles.class))
211 )
212 @APIResponse(responseCode = "400", description = "bad request")
213 @APIResponse(responseCode = "401", description = "not authorized")
214 @APIResponse(responseCode = "403", description = "forbidden")
215 @APIResponse(responseCode = "404", description = "not found")
216 @Parameter(name = Constants.USERGROUP_ID)
217 public Response getUserGroupRoles(@PathParam(Constants.USERGROUP_ID) @NotNull @PositiveOrZero Long userGroupId) {
218 var roles = userGroupService.getUserGroupRoles(userGroupId);
219 return Response.ok(roles).build();
220 }
221 }