1 package de.dlr.shepard.data.structureddata.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.permission.services.PermissionsService;
6 import de.dlr.shepard.auth.users.services.UserService;
7 import de.dlr.shepard.common.filters.Subscribable;
8 import de.dlr.shepard.common.util.Constants;
9 import de.dlr.shepard.common.util.QueryParamHelper;
10 import de.dlr.shepard.data.ContainerAttributes;
11 import de.dlr.shepard.data.structureddata.entities.StructuredData;
12 import de.dlr.shepard.data.structureddata.entities.StructuredDataContainer;
13 import de.dlr.shepard.data.structureddata.entities.StructuredDataPayload;
14 import de.dlr.shepard.data.structureddata.io.StructuredDataContainerIO;
15 import de.dlr.shepard.data.structureddata.services.StructuredDataContainerService;
16 import jakarta.enterprise.context.RequestScoped;
17 import jakarta.inject.Inject;
18 import jakarta.validation.Valid;
19 import jakarta.validation.constraints.NotBlank;
20 import jakarta.validation.constraints.NotNull;
21 import jakarta.validation.constraints.PositiveOrZero;
22 import jakarta.ws.rs.Consumes;
23 import jakarta.ws.rs.DELETE;
24 import jakarta.ws.rs.GET;
25 import jakarta.ws.rs.POST;
26 import jakarta.ws.rs.PUT;
27 import jakarta.ws.rs.Path;
28 import jakarta.ws.rs.PathParam;
29 import jakarta.ws.rs.Produces;
30 import jakarta.ws.rs.QueryParam;
31 import jakarta.ws.rs.core.MediaType;
32 import jakarta.ws.rs.core.Response;
33 import jakarta.ws.rs.core.Response.Status;
34 import java.util.ArrayList;
35 import java.util.List;
36 import org.eclipse.microprofile.openapi.annotations.Operation;
37 import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
38 import org.eclipse.microprofile.openapi.annotations.media.Content;
39 import org.eclipse.microprofile.openapi.annotations.media.Schema;
40 import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
41 import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody;
42 import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
43 import org.eclipse.microprofile.openapi.annotations.tags.Tag;
44
45 @Consumes(MediaType.APPLICATION_JSON)
46 @Produces(MediaType.APPLICATION_JSON)
47 @Path(Constants.STRUCTURED_DATA_CONTAINERS)
48 @RequestScoped
49 public class StructuredDataRest {
50
51 @Inject
52 StructuredDataContainerService structuredDataContainerService;
53
54 @Inject
55 PermissionsService permissionsService;
56
57 @Inject
58 UserService userService;
59
60 @GET
61 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
62 @Operation(description = "Get all structured data containers")
63 @APIResponse(
64 description = "ok",
65 responseCode = "200",
66 content = @Content(schema = @Schema(type = SchemaType.ARRAY, implementation = StructuredDataContainerIO.class))
67 )
68 @APIResponse(responseCode = "400", description = "bad request")
69 @APIResponse(responseCode = "401", description = "not authorized")
70 @APIResponse(responseCode = "404", description = "not found")
71 @Parameter(name = Constants.QP_NAME)
72 @Parameter(name = Constants.QP_PAGE)
73 @Parameter(name = Constants.QP_SIZE)
74 @Parameter(name = Constants.QP_ORDER_BY_ATTRIBUTE)
75 @Parameter(name = Constants.QP_ORDER_DESC)
76 public Response getAllStructuredDataContainers(
77 @QueryParam(Constants.QP_NAME) String name,
78 @QueryParam(Constants.QP_PAGE) @PositiveOrZero Integer page,
79 @QueryParam(Constants.QP_SIZE) @PositiveOrZero Integer size,
80 @QueryParam(Constants.QP_ORDER_BY_ATTRIBUTE) ContainerAttributes orderBy,
81 @QueryParam(Constants.QP_ORDER_DESC) Boolean orderDesc
82 ) {
83 var params = new QueryParamHelper();
84 if (name != null) params = params.withName(name);
85 if (page != null && size != null) params = params.withPageAndSize(page, size);
86 if (orderBy != null) params = params.withOrderByAttribute(orderBy, orderDesc);
87
88 List<StructuredDataContainer> containers = structuredDataContainerService.getAllContainers(params);
89 var result = new ArrayList<StructuredDataContainerIO>(containers.size());
90 for (var container : containers) {
91 result.add(new StructuredDataContainerIO(container));
92 }
93 return Response.ok(result).build();
94 }
95
96 @GET
97 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}")
98 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
99 @Operation(description = "Get structured data container")
100 @APIResponse(
101 description = "ok",
102 responseCode = "200",
103 content = @Content(schema = @Schema(implementation = StructuredDataContainerIO.class))
104 )
105 @APIResponse(responseCode = "400", description = "bad request")
106 @APIResponse(responseCode = "401", description = "not authorized")
107 @APIResponse(responseCode = "403", description = "forbidden")
108 @APIResponse(responseCode = "404", description = "not found")
109 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
110 public Response getStructuredDataContainer(
111 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId
112 ) {
113 var result = structuredDataContainerService.getContainer(structuredDataId);
114 return Response.ok(new StructuredDataContainerIO(result)).build();
115 }
116
117 @DELETE
118 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}")
119 @Subscribable
120 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
121 @Operation(description = "Delete structured data container")
122 @APIResponse(description = "deleted", responseCode = "204")
123 @APIResponse(responseCode = "400", description = "bad request")
124 @APIResponse(responseCode = "401", description = "not authorized")
125 @APIResponse(responseCode = "403", description = "forbidden")
126 @APIResponse(responseCode = "404", description = "not found")
127 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
128 public Response deleteStructuredDataContainer(
129 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId
130 ) {
131 structuredDataContainerService.deleteContainer(structuredDataId);
132 return Response.status(Status.NO_CONTENT).build();
133 }
134
135 @POST
136 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
137 @Operation(description = "Create a new structured data container")
138 @APIResponse(
139 description = "created",
140 responseCode = "201",
141 content = @Content(schema = @Schema(implementation = StructuredDataContainerIO.class))
142 )
143 @APIResponse(responseCode = "400", description = "bad request")
144 @APIResponse(responseCode = "401", description = "not authorized")
145 @APIResponse(responseCode = "403", description = "forbidden")
146 @APIResponse(responseCode = "404", description = "not found")
147 public Response createStructuredDataContainer(
148 @RequestBody(
149 required = true,
150 content = @Content(schema = @Schema(implementation = StructuredDataContainerIO.class))
151 ) @Valid StructuredDataContainerIO structuredDataContainer
152 ) {
153 var result = structuredDataContainerService.createContainer(structuredDataContainer);
154 return Response.ok(new StructuredDataContainerIO(result)).status(Status.CREATED).build();
155 }
156
157 @POST
158 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/payload")
159 @Subscribable
160 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
161 @Operation(description = "Upload a new structured data object")
162 @APIResponse(
163 description = "created",
164 responseCode = "201",
165 content = @Content(schema = @Schema(implementation = StructuredData.class))
166 )
167 @APIResponse(responseCode = "400", description = "bad request")
168 @APIResponse(responseCode = "401", description = "not authorized")
169 @APIResponse(responseCode = "403", description = "forbidden")
170 @APIResponse(responseCode = "404", description = "not found")
171 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
172 public Response createStructuredData(
173 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId,
174 @RequestBody(
175 required = true,
176 content = @Content(schema = @Schema(implementation = StructuredDataPayload.class))
177 ) @Valid StructuredDataPayload payload
178 ) {
179 var result = structuredDataContainerService.createStructuredData(structuredDataId, payload);
180 return Response.status(Status.CREATED).entity(result).build();
181 }
182
183 @GET
184 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/payload")
185 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
186 @Operation(description = "Get structured data objects")
187 @APIResponse(
188 description = "ok",
189 responseCode = "200",
190 content = @Content(schema = @Schema(type = SchemaType.ARRAY, implementation = StructuredData.class))
191 )
192 @APIResponse(responseCode = "400", description = "bad request")
193 @APIResponse(responseCode = "401", description = "not authorized")
194 @APIResponse(responseCode = "403", description = "forbidden")
195 @APIResponse(responseCode = "404", description = "not found")
196 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
197 public Response getAllStructuredDatas(
198 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId
199 ) {
200 var result = structuredDataContainerService.getContainer(structuredDataId).getStructuredDatas();
201 return Response.ok(result).build();
202 }
203
204 @GET
205 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/payload/{" + Constants.OID + "}")
206 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
207 @Operation(description = "Download structured data")
208 @APIResponse(
209 description = "ok",
210 responseCode = "200",
211 content = @Content(schema = @Schema(implementation = StructuredDataPayload.class))
212 )
213 @APIResponse(responseCode = "400", description = "bad request")
214 @APIResponse(responseCode = "401", description = "not authorized")
215 @APIResponse(responseCode = "403", description = "forbidden")
216 @APIResponse(responseCode = "404", description = "not found")
217 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
218 @Parameter(name = Constants.OID)
219 public Response getStructuredData(
220 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId,
221 @PathParam(Constants.OID) @NotBlank String oid
222 ) {
223 var result = structuredDataContainerService.getStructuredData(structuredDataId, oid);
224 return Response.ok(result).build();
225 }
226
227 @DELETE
228 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/payload/{" + Constants.OID + "}")
229 @Subscribable
230 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
231 @Operation(description = "Delete structured data")
232 @APIResponse(description = "ok", responseCode = "204")
233 @APIResponse(responseCode = "400", description = "bad request")
234 @APIResponse(responseCode = "401", description = "not authorized")
235 @APIResponse(responseCode = "403", description = "forbidden")
236 @APIResponse(responseCode = "404", description = "not found")
237 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
238 @Parameter(name = Constants.OID)
239 public Response deleteStructuredData(
240 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId,
241 @PathParam(Constants.OID) @NotBlank String oid
242 ) {
243 structuredDataContainerService.deleteStructuredData(structuredDataId, oid);
244 return Response.status(Status.NO_CONTENT).build();
245 }
246
247 @GET
248 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/" + Constants.PERMISSIONS)
249 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
250 @Operation(description = "Get permissions")
251 @APIResponse(
252 description = "ok",
253 responseCode = "200",
254 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
255 )
256 @APIResponse(responseCode = "400", description = "bad request")
257 @APIResponse(responseCode = "401", description = "not authorized")
258 @APIResponse(responseCode = "403", description = "forbidden")
259 @APIResponse(responseCode = "404", description = "not found")
260 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
261 public Response getStructuredDataPermissions(
262 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId
263 ) {
264 var perms = structuredDataContainerService.getContainerPermissions(structuredDataId);
265 return Response.ok(new PermissionsIO(perms)).build();
266 }
267
268 @PUT
269 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/" + Constants.PERMISSIONS)
270 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
271 @Operation(description = "Edit permissions")
272 @APIResponse(
273 description = "ok",
274 responseCode = "200",
275 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
276 )
277 @APIResponse(responseCode = "400", description = "bad request")
278 @APIResponse(responseCode = "401", description = "not authorized")
279 @APIResponse(responseCode = "403", description = "forbidden")
280 @APIResponse(responseCode = "404", description = "not found")
281 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
282 public Response editStructuredDataPermissions(
283 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId,
284 @RequestBody(
285 required = true,
286 content = @Content(schema = @Schema(implementation = PermissionsIO.class))
287 ) @Valid PermissionsIO permissions
288 ) {
289 var perms = structuredDataContainerService.updateContainerPermissions(permissions, structuredDataId);
290 return Response.ok(new PermissionsIO(perms)).build();
291 }
292
293 @GET
294 @Path("/{" + Constants.STRUCTURED_DATA_CONTAINER_ID + "}/" + Constants.ROLES)
295 @Tag(name = Constants.STRUCTURED_DATA_CONTAINER)
296 @Operation(description = "Get roles")
297 @APIResponse(
298 description = "ok",
299 responseCode = "200",
300 content = @Content(schema = @Schema(implementation = Roles.class))
301 )
302 @APIResponse(responseCode = "400", description = "bad request")
303 @APIResponse(responseCode = "401", description = "not authorized")
304 @APIResponse(responseCode = "403", description = "forbidden")
305 @APIResponse(responseCode = "404", description = "not found")
306 @Parameter(name = Constants.STRUCTURED_DATA_CONTAINER_ID)
307 public Response getStructuredDataRoles(
308 @PathParam(Constants.STRUCTURED_DATA_CONTAINER_ID) @NotNull @PositiveOrZero Long structuredDataId
309 ) {
310 var roles = structuredDataContainerService.getContainerRoles(structuredDataId);
311 return Response.ok(roles).build();
312 }
313 }