View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
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 }