1 package net.sumaris.server.http.graphql.administration;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
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
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
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 }