1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.opencastproject.graphql.datafetcher.event;
23
24 import org.opencastproject.elasticsearch.api.SearchIndexException;
25 import org.opencastproject.elasticsearch.api.SearchResult;
26 import org.opencastproject.elasticsearch.index.ElasticsearchIndex;
27 import org.opencastproject.elasticsearch.index.objects.event.Event;
28 import org.opencastproject.elasticsearch.index.objects.event.EventIndexSchema;
29 import org.opencastproject.elasticsearch.index.objects.event.EventSearchQuery;
30 import org.opencastproject.graphql.datafetcher.ElasticsearchDataFetcher;
31 import org.opencastproject.graphql.event.GqlEventList;
32 import org.opencastproject.graphql.exception.GraphQLRuntimeException;
33 import org.opencastproject.graphql.exception.OpencastErrorType;
34 import org.opencastproject.graphql.execution.context.OpencastContext;
35 import org.opencastproject.graphql.type.input.EventFilterByInput;
36 import org.opencastproject.graphql.type.input.EventOrderByInput;
37 import org.opencastproject.security.api.Permissions;
38 import org.opencastproject.security.api.SecurityService;
39 import org.opencastproject.security.api.User;
40
41 import java.util.Arrays;
42 import java.util.Objects;
43
44 import graphql.schema.DataFetchingEnvironment;
45
46 public class EventOffsetDataFetcher extends ElasticsearchDataFetcher<GqlEventList> {
47
48 private User user;
49
50 private String seriesId;
51
52 private boolean writeOnly;
53
54 public EventOffsetDataFetcher withUser(User user) {
55 this.user = user;
56 return this;
57 }
58
59 public EventOffsetDataFetcher withSeriesId(String seriesId) {
60 this.seriesId = seriesId;
61 return this;
62 }
63
64 public EventOffsetDataFetcher writeOnly(boolean writeOnly) {
65 this.writeOnly = writeOnly;
66 return this;
67 }
68
69 @Override
70 public GqlEventList get(OpencastContext opencastContext, DataFetchingEnvironment dataFetchingEnvironment) {
71 SecurityService securityService = opencastContext.getService(SecurityService.class);
72 ElasticsearchIndex searchIndex = opencastContext.getService(ElasticsearchIndex.class);
73
74 EventSearchQuery eventSearchQuery = new EventSearchQuery(
75 securityService.getOrganization().getId(),
76 Objects.requireNonNullElse(user, securityService.getUser())
77 );
78
79 eventSearchQuery = addPaginationParams(eventSearchQuery, dataFetchingEnvironment);
80
81 eventSearchQuery = addEventOrderByParams(eventSearchQuery, dataFetchingEnvironment);
82
83 eventSearchQuery = addEventFilterByParams(eventSearchQuery, dataFetchingEnvironment);
84
85 eventSearchQuery = addQueryParams(eventSearchQuery, dataFetchingEnvironment);
86
87 if (seriesId != null) {
88 eventSearchQuery.withSeriesId(seriesId);
89 }
90
91 if (writeOnly) {
92 eventSearchQuery.withAction(Permissions.Action.WRITE);
93 }
94
95 try {
96 SearchResult<Event> result = searchIndex.getByQuery(eventSearchQuery);
97 Arrays.stream(result.getItems()).forEach(item -> item.getSource()
98 .updatePreview(opencastContext.getConfiguration().eventPreviewSubtype()));
99 return new GqlEventList(result);
100 } catch (SearchIndexException e) {
101 throw new GraphQLRuntimeException(OpencastErrorType.InternalError, e);
102 }
103 }
104
105 private EventSearchQuery addEventFilterByParams(
106 EventSearchQuery eventSearchQuery,
107 final DataFetchingEnvironment environment
108 ) {
109 EventFilterByInput eventFilterBy = parseObjectParam("filterBy", EventFilterByInput.class, environment);
110
111 if (eventFilterBy == null) {
112 return eventSearchQuery;
113 }
114
115 if (eventFilterBy.getStatus() != null) {
116 eventSearchQuery.withEventStatus(eventFilterBy.getStatus().getFilterValue());
117 }
118
119 if (eventFilterBy.getSeriesId() != null) {
120 eventSearchQuery.withSeriesId(eventFilterBy.getSeriesId());
121 }
122
123 if (eventFilterBy.getPublished() != null) {
124 eventSearchQuery.withIsPublished(eventFilterBy.getPublished());
125 }
126
127 return eventSearchQuery;
128 }
129
130 public EventSearchQuery addEventOrderByParams(
131 EventSearchQuery eventSearchQuery,
132 final DataFetchingEnvironment environment
133 ) {
134 EventOrderByInput eventOrderBy = parseObjectParam("orderBy", EventOrderByInput.class, environment);
135
136 if (eventOrderBy == null) {
137 return eventSearchQuery;
138 }
139
140 if (eventOrderBy.getTitle() != null) {
141 eventSearchQuery.sortByTitle(eventOrderBy.getTitle().getOrder());
142 }
143 if (eventOrderBy.getPresenters() != null) {
144 eventSearchQuery.sortByPresenter(eventOrderBy.getPresenters().getOrder());
145 }
146 if (eventOrderBy.getSeriesName() != null) {
147 eventSearchQuery.sortBySeriesName(eventOrderBy.getSeriesName().getOrder());
148 }
149 if (eventOrderBy.getTechnicalStartTime() != null) {
150 eventSearchQuery.sortByTechnicalStartDate(eventOrderBy.getTechnicalStartTime().getOrder());
151 }
152 if (eventOrderBy.getTechnicalEndTime() != null) {
153 eventSearchQuery.sortByTechnicalEndDate(eventOrderBy.getTechnicalEndTime().getOrder());
154 }
155 if (eventOrderBy.getStartDate() != null) {
156 eventSearchQuery.sortByStartDate(eventOrderBy.getStartDate().getOrder());
157 }
158 if (eventOrderBy.getEndDate() != null) {
159 eventSearchQuery.sortByEndDate(eventOrderBy.getEndDate().getOrder());
160 }
161 if (eventOrderBy.getCreated() != null) {
162 eventSearchQuery.withSortOrder(EventIndexSchema.CREATED, eventOrderBy.getCreated().getOrder());
163 }
164 if (eventOrderBy.getWorkflowState() != null) {
165 eventSearchQuery.sortByWorkflowState(eventOrderBy.getWorkflowState().getOrder());
166 }
167 if (eventOrderBy.getLocation() != null) {
168 eventSearchQuery.sortByLocation(eventOrderBy.getLocation().getOrder());
169 }
170 if (eventOrderBy.getEventStatus() != null) {
171 eventSearchQuery.sortByEventStatus(eventOrderBy.getEventStatus().getOrder());
172 }
173 return eventSearchQuery;
174 }
175 }