View Javadoc
1   package fr.ifremer.quadrige3.synchro.server.rest.administration.program;
2   
3   /*-
4    * #%L
5    * Quadrige3 Core :: Quadrige3 Synchro server
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2017 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.ImmutableList;
27  import com.google.common.collect.Lists;
28  import fr.ifremer.quadrige3.core.exception.SaveForbiddenException;
29  import fr.ifremer.quadrige3.core.service.administration.program.ProgramService;
30  import fr.ifremer.quadrige3.core.vo.administration.program.ProgramVO;
31  import fr.ifremer.quadrige3.synchro.server.config.SynchroServerConfiguration;
32  import fr.ifremer.quadrige3.synchro.server.security.SecurityContextHelper;
33  import fr.ifremer.quadrige3.synchro.server.service.ServiceLocator;
34  import fr.ifremer.quadrige3.synchro.server.service.synchro.ReferentialSynchroService;
35  import org.springframework.web.bind.annotation.*;
36  
37  import java.util.List;
38  import java.util.Set;
39  
40  @RestController
41  @RequestMapping("/program")
42  public class ProgramRestController {
43  
44      @RequestMapping(value="/save/list/", method = RequestMethod.POST)
45      public @ResponseBody List<ProgramVO> save(@RequestBody List<ProgramVO> programs) {
46  
47          ProgramService service = ServiceLocator.instance().getProgramService();
48  
49          if (!SecurityContextHelper.isAuthenticateAsAdmin()) {
50              // Check user permission
51              List<String> programCodes = Lists.transform(programs, ProgramVO::getProgCd);
52              boolean hasWriteAccess = service.hasWritePermission(SecurityContextHelper.getPrincipalUserId(), programCodes);
53              if (!hasWriteAccess) {
54                  throw new SaveForbiddenException(SaveForbiddenException.Type.PERMISSION, "No write permission on all program to save", programCodes);
55              }
56          }
57  
58          List<ProgramVO> savedPrograms = service.save(programs);
59  
60          // clean cache on referential last update date
61          ServiceLocator.instance().getCacheService().clearCache(ReferentialSynchroService.REFERENTIAL_UPDATE_DATE_CACHE);
62          
63          return savedPrograms;
64      }
65  
66      @RequestMapping(value="/save", method = RequestMethod.POST)
67      public @ResponseBody ProgramVO save(@RequestBody ProgramVO program)  {
68  
69          ProgramService service = ServiceLocator.instance().getProgramService();
70  
71          if (!SecurityContextHelper.isAuthenticateAsAdmin()) {
72              // Check user permission
73              List<String> programCodes = ImmutableList.of(program.getProgCd());
74              boolean hasWriteAccess = program.getProgCd() == null || service.hasWritePermission(SecurityContextHelper.getPrincipalUserId(), programCodes);
75              if (!hasWriteAccess) {
76                  throw new SaveForbiddenException(SaveForbiddenException.Type.PERMISSION, "No write permission on program", programCodes);
77              }
78          }
79  
80          ProgramVO result = service.save(program);
81  
82          // clean cache on referential last update date
83          ServiceLocator.instance().getCacheService().clearCache(ReferentialSynchroService.REFERENTIAL_UPDATE_DATE_CACHE);
84  
85          return result;
86      }
87  
88      @RequestMapping(value="/get/{progCd}", method = RequestMethod.GET)
89      public @ResponseBody ProgramVO get(@PathVariable(value="progCd") String progCd) {
90  
91          ProgramService service = ServiceLocator.instance().getProgramService();
92          return service.getByCode(progCd);
93      }
94  
95      @RequestMapping(value="/compatibleProgramCodes", method = RequestMethod.GET)
96      public @ResponseBody Set<String> getCompatibleList() {
97  
98          SynchroServerConfiguration config = SynchroServerConfiguration.getInstance();
99  
100         return config.getSynchroProgramCodeIncludes();
101     }
102 
103 
104 }