1
2
3
4
5
6
7 package ch.colabproject.colab.api.rest.project;
8
9 import ch.colabproject.colab.api.controller.project.ProjectManager;
10 import ch.colabproject.colab.api.controller.team.TeamManager;
11 import ch.colabproject.colab.api.exceptions.ColabMergeException;
12 import ch.colabproject.colab.api.model.DuplicationParam;
13 import ch.colabproject.colab.api.model.card.AbstractCardType;
14 import ch.colabproject.colab.api.model.card.Card;
15 import ch.colabproject.colab.api.model.card.CardContent;
16 import ch.colabproject.colab.api.model.link.ActivityFlowLink;
17 import ch.colabproject.colab.api.model.project.CopyParam;
18 import ch.colabproject.colab.api.model.project.Project;
19 import ch.colabproject.colab.api.persistence.jpa.project.CopyParamDao;
20 import ch.colabproject.colab.api.persistence.jpa.project.ProjectDao;
21 import ch.colabproject.colab.api.rest.project.bean.ProjectCreationData;
22 import ch.colabproject.colab.api.rest.project.bean.ProjectStructure;
23 import ch.colabproject.colab.generator.model.annotations.AdminResource;
24 import ch.colabproject.colab.generator.model.annotations.AuthenticationRequired;
25 import ch.colabproject.colab.generator.model.exceptions.HttpErrorMessage;
26 import java.util.List;
27 import java.util.Set;
28 import jakarta.inject.Inject;
29 import jakarta.ws.rs.Consumes;
30 import jakarta.ws.rs.GET;
31 import jakarta.ws.rs.POST;
32 import jakarta.ws.rs.PUT;
33 import jakarta.ws.rs.Path;
34 import jakarta.ws.rs.PathParam;
35 import jakarta.ws.rs.Produces;
36 import jakarta.ws.rs.core.MediaType;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40
41
42
43
44
45 @Path("projects")
46 @Consumes(MediaType.APPLICATION_JSON)
47 @Produces(MediaType.APPLICATION_JSON)
48 @AuthenticationRequired
49 public class ProjectRestEndpoint {
50
51
52 private static final Logger logger = LoggerFactory.getLogger(ProjectRestEndpoint.class);
53
54
55 @Inject
56 private ProjectManager projectManager;
57
58
59 @Inject
60 private TeamManager teamManager;
61
62
63 @Inject
64 private ProjectDao projectDao;
65
66
67 @Inject
68 private CopyParamDao copyParamDao;
69
70
71
72
73
74
75
76
77
78
79
80
81 @GET
82 @Path("/{id: [0-9]+}")
83 public Project getProject(@PathParam("id") Long id) {
84 logger.debug("Get project #{}", id);
85 return projectDao.findProject(id);
86 }
87
88
89
90
91
92
93 @GET
94 @Path("Mine")
95 public List<Project> getProjectsWhereTeamMember() {
96 logger.debug("Get projects where current user is a team member of");
97 return projectManager.findProjectsWhereTeamMember();
98 }
99
100
101
102
103
104 @GET
105 @Path("Global")
106 public List<Project> getAllGlobalModels() {
107 logger.debug("Get all global projects");
108 return projectDao.findAllGlobalModels();
109 }
110
111
112
113
114
115
116 @GET
117 @Path("MyInstanceableModels")
118 public List<Project> getInstanceableModels() {
119 logger.debug("Get all models linked by a instancemaker to the current user");
120 return projectManager.findInstanceableModelsForCurrentUser();
121 }
122
123
124
125
126
127
128 @GET
129 @AdminResource
130 public List<Project> getAllProjects() {
131 logger.debug("Get all projects");
132 return projectDao.findAllProject();
133 }
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 @POST
149 @Path("createProject")
150 public Long createProject(ProjectCreationData creationData) {
151 logger.debug("Create a project with {}", creationData);
152
153 Project project = projectManager.createProject(creationData);
154
155 creationData.getGuestsEmail().stream().forEach(email -> {
156 teamManager.invite(project.getId(), email);
157 });
158
159 return project.getId();
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173 @POST
174 @Path("copyProject/{id: [0-9]+}/{name}")
175 public Long duplicateProject(@PathParam("id") Long baseProjectId,
176 @PathParam("name") String name, DuplicationParam params) throws ColabMergeException {
177 logger.debug("duplicate the project #{} with params {}", baseProjectId, params);
178
179 DuplicationParam effectiveParams = params;
180 if (effectiveParams == null) {
181 effectiveParams = DuplicationParam.buildDefaultForProjectDuplication();
182 }
183
184
185 if (effectiveParams.isMakeOnlyCardTypeReferences()) {
186 throw new IllegalArgumentException();
187 }
188
189 Project newProject = projectManager.duplicateProject(baseProjectId, effectiveParams);
190
191 newProject.setName(name);
192
193 projectDao.updateProject(newProject);
194
195 return newProject.getId();
196 }
197
198
199
200
201
202
203
204
205
206
207
208
209 @PUT
210 public void updateProject(Project project) throws ColabMergeException {
211 logger.debug("Update project {}", project);
212 projectDao.updateProject(project);
213 }
214
215
216
217
218
219
220
221
222 @PUT
223 @Path("copyParam")
224 public void updateCopyParam(CopyParam copyParam) throws ColabMergeException {
225 logger.debug("Update copy param {}", copyParam);
226 copyParamDao.updateCopyParam(copyParam);
227 }
228
229
230
231
232
233
234
235
236
237
238
239
240
241 @PUT
242 @Path("{projectId: [0-9]+}/PutInBin")
243 public void putProjectInBin(@PathParam("projectId") Long projectId) {
244 logger.debug("put in bin project #{}", projectId);
245 projectManager.putProjectInBin(projectId);
246 }
247
248
249
250
251
252
253
254
255
256
257
258 @PUT
259 @Path("{projectId: [0-9]+}/RestoreFromBin")
260 public void restoreProjectFromBin(@PathParam("projectId") Long projectId) {
261 logger.debug("restore from bin project #{}", projectId);
262 projectManager.restoreProjectFromBin(projectId);
263 }
264
265
266
267
268
269
270
271
272
273
274 @PUT
275 @Path("{projectId: [0-9]+}/FlagAsToDeleteForever")
276 public void flagProjectAsToDeleteForever(@PathParam("projectId") Long projectId) {
277 logger.debug("flag project #{} as to delete forever", projectId);
278 projectManager.flagProjectAsToDeleteForever(projectId);
279 }
280
281
282
283
284
285
286
287
288
289
290
291
292 @GET
293 @Path("{id: [0-9]+}/RootCard")
294 public Card getRootCardOfProject(@PathParam("id") Long projectId) {
295 logger.debug("get the root card of the project #{}", projectId);
296 return projectManager.getRootCard(projectId);
297 }
298
299
300
301
302
303
304
305
306 @GET
307 @Path("{id: [0-9]+}/CardTypes")
308 public Set<AbstractCardType> getCardTypesOfProject(@PathParam("id") Long projectId) {
309 logger.debug("Get project #{} card types", projectId);
310 return projectManager.getCardTypes(projectId);
311 }
312
313
314
315
316
317
318
319
320 @GET
321 @Path("{id: [0-9]+}/Cards")
322 public Set<Card> getCardsOfProject(@PathParam("id") Long projectId) {
323 logger.debug("Get project #{} cards", projectId);
324 return projectManager.getCards(projectId);
325 }
326
327
328
329
330
331
332
333
334 @GET
335 @Path("{id: [0-9]+}/CardContents")
336 public Set<CardContent> getCardContentsOfProject(@PathParam("id") Long projectId) {
337 logger.debug("Get project #{} cardContents", projectId);
338 return projectManager.getCardContents(projectId);
339 }
340
341
342
343
344
345
346
347
348 @GET
349 @Path("{id: [0-9]+}/structure")
350 public ProjectStructure getStructureOfProject(@PathParam("id") Long projectId) {
351 logger.debug("Get project #{} cardContents", projectId);
352 return projectManager.getStructure(projectId);
353 }
354
355
356
357
358
359
360
361
362 @GET
363 @Path("{id: [0-9]+}/ActivityFlowLink")
364 public Set<ActivityFlowLink> getActivityFlowLinks(@PathParam("id") Long projectId) {
365 logger.debug("Get project #{} activityflowlinks", projectId);
366 return projectManager.getActivityFlowLinks(projectId);
367 }
368
369
370
371
372
373
374
375
376 @GET
377 @Path("{id: [0-9]+}/copyParams")
378 public CopyParam getCopyParam(@PathParam("id") Long projectId) {
379 CopyParam copyParam = projectManager.getCopyParam(projectId);
380 logger.debug("Got project #{} copy param : {}", projectId, copyParam);
381 return copyParam;
382 }
383
384
385
386
387
388 }