View Javadoc
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 }