View Javadoc
1   package net.sumaris.server.http.graphql.administration;
2   
3   /*-
4    * #%L
5    * SUMARiS:: Server
6    * %%
7    * Copyright (C) 2018 SUMARiS Consortium
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.base.Preconditions;
26  import io.leangen.graphql.annotations.*;
27  import net.sumaris.core.dao.technical.SortDirection;
28  import net.sumaris.core.model.administration.programStrategy.Strategy;
29  import net.sumaris.core.service.administration.programStrategy.ProgramService;
30  import net.sumaris.core.service.administration.programStrategy.StrategyService;
31  import net.sumaris.core.service.referential.PmfmService;
32  import net.sumaris.core.service.referential.ReferentialService;
33  import net.sumaris.core.service.referential.taxon.TaxonNameService;
34  import net.sumaris.core.vo.administration.programStrategy.PmfmStrategyVO;
35  import net.sumaris.core.vo.administration.programStrategy.ProgramVO;
36  import net.sumaris.core.vo.administration.programStrategy.StrategyFetchOptions;
37  import net.sumaris.core.vo.administration.programStrategy.StrategyVO;
38  import net.sumaris.core.vo.filter.ProgramFilterVO;
39  import net.sumaris.core.vo.referential.PmfmVO;
40  import net.sumaris.core.vo.referential.TaxonGroupVO;
41  import net.sumaris.core.vo.referential.TaxonNameVO;
42  import net.sumaris.server.http.security.IsAdmin;
43  import net.sumaris.server.http.security.IsSupervisor;
44  import org.apache.commons.lang3.StringUtils;
45  import org.slf4j.Logger;
46  import org.slf4j.LoggerFactory;
47  import org.springframework.beans.factory.annotation.Autowired;
48  import org.springframework.stereotype.Service;
49  import org.springframework.transaction.annotation.Transactional;
50  
51  import java.util.List;
52  import java.util.Set;
53  
54  @Service
55  @Transactional
56  public class ProgramGraphQLService {
57  
58      private static final Logger log = LoggerFactory.getLogger(ProgramGraphQLService.class);
59  
60      @Autowired
61      private ProgramService programService;
62  
63      @Autowired
64      private StrategyService strategyService;
65  
66      @Autowired
67      private ReferentialService referentialService;
68  
69      @Autowired
70      private PmfmService pmfmService;
71  
72      @Autowired
73      private TaxonNameService taxonNameService;
74  
75      @Autowired
76      public ProgramGraphQLService() {
77          super();
78      }
79  
80  
81      /* -- Program / Strategy-- */
82  
83      @GraphQLQuery(name = "program", description = "Get a program")
84      @Transactional(readOnly = true)
85      public ProgramVO getProgram(
86              @GraphQLArgument(name = "label") String label,
87              @GraphQLArgument(name = "id") Integer id
88      ) {
89          Preconditions.checkArgument(id != null || StringUtils.isNotBlank(label));
90          if (id != null) {
91              return programService.get(id);
92          }
93          return programService.getByLabel(label);
94      }
95  
96      @GraphQLQuery(name = "programs", description = "Search in programs")
97      @Transactional(readOnly = true)
98      public List<ProgramVO> findProgramsByFilter(
99              @GraphQLArgument(name = "filter") ProgramFilterVO filter,
100             @GraphQLArgument(name = "offset", defaultValue = "0") Integer offset,
101             @GraphQLArgument(name = "size", defaultValue = "1000") Integer size,
102             @GraphQLArgument(name = "sortBy", defaultValue = ProgramVO.Fields.LABEL) String sort,
103             @GraphQLArgument(name = "sortDirection", defaultValue = "asc") String direction) {
104         if (filter == null) {
105             return programService.getAll();
106         }
107         return programService.findByFilter(filter, offset, size, sort, SortDirection.valueOf(direction.toUpperCase()));
108     }
109 
110     @GraphQLQuery(name = "strategies", description = "Get program's strategie")
111     public List<StrategyVO> getStrategiesByProgram(@GraphQLContext ProgramVO program,
112                                                    @GraphQLEnvironment() Set<String> fields) {
113         return strategyService.findByProgram(program.getId(), getFetchOptions(fields));
114     }
115 
116     @GraphQLQuery(name = "pmfm", description = "Get strategy pmfm")
117     public PmfmVO getPmfmStrategyPmfm(@GraphQLContext PmfmStrategyVO pmfmStrategy) {
118         if (pmfmStrategy.getPmfm() != null) {
119             return pmfmStrategy.getPmfm();
120         }
121         else if (pmfmStrategy.getPmfmId() != null) {
122             return pmfmService.get(pmfmStrategy.getPmfmId());
123         }
124         return null;
125     }
126 
127     @GraphQLQuery(name = "taxonNames", description = "Get taxon group's taxons")
128     public List<TaxonNameVO> getTaxonGroupTaxonNames(@GraphQLContext TaxonGroupVO taxonGroup) {
129         if (taxonGroup.getId() != null) {
130             return taxonNameService.getAllByTaxonGroup(taxonGroup.getId());
131         }
132         return null;
133     }
134 
135     /* -- Mutations -- */
136 
137     @GraphQLMutation(name = "saveProgram", description = "Save a program (with strategies)")
138     @IsSupervisor
139     public ProgramVO saveProgram(
140             @GraphQLArgument(name = "program") ProgramVO program) {
141         return programService.save(program);
142     }
143 
144     @GraphQLMutation(name = "deleteProgram", description = "Delete a program")
145     @IsAdmin
146     public void deleteProgram(@GraphQLArgument(name = "id") int id) {
147         programService.delete(id);
148     }
149 
150     /* -- Protected methods -- */
151     protected StrategyFetchOptions getFetchOptions(Set<String> fields) {
152         return StrategyFetchOptions.builder()
153                 .withPmfmStrategyInheritance(
154                         fields.contains(Strategy.Fields.PMFM_STRATEGIES + "/" + PmfmStrategyVO.Fields.LABEL)
155                         && !fields.contains(Strategy.Fields.PMFM_STRATEGIES + "/" + PmfmStrategyVO.Fields.PMFM)
156                 )
157                 .build();
158     }
159 }