Skip to content

Commit d167069

Browse files
stefanvitStefan Vitanov
and
Stefan Vitanov
authored
[ID-75] Fix GET surveys time filtering (#76)
* remove the old filter and set the new docs for get surveys * return the time filter * set the time filter items from the query and fix the filter for getting surveys * add the time filter for the admin get surveys API * fix the filter for /creator/surveys * set the Changelog.md --------- Co-authored-by: Stefan Vitanov <[email protected]>
1 parent 8e667d3 commit d167069

File tree

11 files changed

+343
-155
lines changed

11 files changed

+343
-155
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Fixed
9+
- Fix GET surveys time filtering [#75](https://github.com/rokwire/surveys-building-block/issues/75)
10+
811
## [1.10.2] - 2024-08-06
912
### Fixed
1013
- Use mongo db aggregation pipeline for get surveys and survey responses [#71](https://github.com/rokwire/surveys-building-block/issues/71)

core/model/surveys.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,6 @@ type SurveyTimeFilter struct {
212212
EndTimeBefore *time.Time `json:"end_time_before"`
213213
}
214214

215-
// SurveyTimeFilterRequest wraps the time filter for surveys
216-
type SurveyTimeFilterRequest struct {
217-
StartTimeAfter *string `json:"start_time_after"`
218-
StartTimeBefore *string `json:"start_time_before"`
219-
EndTimeAfter *string `json:"end_time_after"`
220-
EndTimeBefore *string `json:"end_time_before"`
221-
}
222-
223215
// SurveysResponseData wraps the entire record
224216
type SurveysResponseData struct {
225217
ID string `json:"id"`
@@ -252,3 +244,11 @@ type SurveysResponseData struct {
252244
EstimatedCompletionTime *int `json:"estimated_completion_time"`
253245
Completed *bool `json:"completed"`
254246
}
247+
248+
// SurveyTimeFilterRequest wraps the time filter for surveys
249+
type SurveyTimeFilterRequest struct {
250+
StartTimeAfter *string `json:"start_time_after"`
251+
StartTimeBefore *string `json:"start_time_before"`
252+
EndTimeAfter *string `json:"end_time_after"`
253+
EndTimeBefore *string `json:"end_time_before"`
254+
}

driven/storage/adapter_surveys.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -213,16 +213,28 @@ func (a *Adapter) GetSurveysAndSurveyResponses(orgID string, appID string, creat
213213
surveyFilter = append(surveyFilter, bson.E{Key: "calendar_event_id", Value: calendarEventID})
214214
}
215215
if timeFilter.StartTimeAfter != nil {
216-
surveyFilter = append(surveyFilter, bson.E{Key: "start_date", Value: bson.M{"$gte": *timeFilter.StartTimeAfter}})
216+
surveyFilter = append(surveyFilter, primitive.E{Key: "$or", Value: bson.A{
217+
bson.M{"start_date": nil},
218+
bson.M{"start_date": primitive.M{"$gte": *timeFilter.StartTimeAfter}},
219+
}})
217220
}
218221
if timeFilter.StartTimeBefore != nil {
219-
surveyFilter = append(surveyFilter, bson.E{Key: "start_date", Value: bson.M{"$lte": *timeFilter.StartTimeBefore}})
222+
surveyFilter = append(surveyFilter, primitive.E{Key: "$or", Value: bson.A{
223+
bson.M{"start_date": nil},
224+
bson.M{"start_date": primitive.M{"$lte": *timeFilter.StartTimeBefore}},
225+
}})
220226
}
221227
if timeFilter.EndTimeAfter != nil {
222-
surveyFilter = append(surveyFilter, bson.E{Key: "end_date", Value: bson.M{"$gte": *timeFilter.EndTimeAfter}})
228+
surveyFilter = append(surveyFilter, primitive.E{Key: "$or", Value: bson.A{
229+
bson.M{"end_date": nil},
230+
bson.M{"end_date": primitive.M{"$gte": *timeFilter.EndTimeAfter}},
231+
}})
223232
}
224233
if timeFilter.EndTimeBefore != nil {
225-
surveyFilter = append(surveyFilter, bson.E{Key: "end_date", Value: bson.M{"$lte": *timeFilter.EndTimeBefore}})
234+
surveyFilter = append(surveyFilter, primitive.E{Key: "$or", Value: bson.A{
235+
bson.M{"end_date": nil},
236+
bson.M{"end_date": primitive.M{"$lte": *timeFilter.EndTimeBefore}},
237+
}})
226238
}
227239

228240
if public != nil {

driver/web/apis_admin.go

+19-21
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import (
1818
"application/core"
1919
"application/core/model"
2020
"encoding/json"
21-
"io/ioutil"
22-
"log"
2321
"net/http"
2422
"sort"
2523
"strconv"
@@ -183,25 +181,6 @@ func (h AdminAPIsHandler) getSurvey(l *logs.Log, r *http.Request, claims *tokena
183181
}
184182

185183
func (h AdminAPIsHandler) getSurveys(l *logs.Log, r *http.Request, claims *tokenauth.Claims) logs.HTTPResponse {
186-
data, err := ioutil.ReadAll(r.Body)
187-
if err != nil {
188-
return l.HTTPResponseErrorAction(logutils.ActionRead, logutils.TypeRequestBody, nil, err, http.StatusBadRequest, false)
189-
}
190-
191-
var items *model.SurveyTimeFilterRequest
192-
// If the body is empty or only contains whitespace, treat it as nil
193-
if len(data) == 0 {
194-
log.Println("Request body is empty, proceeding with default behavior.")
195-
items = &model.SurveyTimeFilterRequest{StartTimeBefore: nil, StartTimeAfter: nil, EndTimeAfter: nil, EndTimeBefore: nil}
196-
} else {
197-
// Unmarshal the data into the items struct
198-
err = json.Unmarshal(data, &items)
199-
if err != nil {
200-
log.Printf("Error unmarshaling request body: %v", err)
201-
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
202-
}
203-
}
204-
filter := surveyTimeFilter(items)
205184

206185
surveyIDsRaw := r.URL.Query().Get("ids")
207186
var surveyIDs []string
@@ -270,6 +249,25 @@ func (h AdminAPIsHandler) getSurveys(l *logs.Log, r *http.Request, claims *token
270249
completed = &valueCompleted
271250
}
272251

252+
var timeFilterItems model.SurveyTimeFilterRequest
253+
startsBeforeRaw := r.URL.Query().Get("starts_before")
254+
if startsBeforeRaw != "" {
255+
timeFilterItems.StartTimeBefore = &startsBeforeRaw
256+
}
257+
startsAfterRaw := r.URL.Query().Get("starts_after")
258+
if startsAfterRaw != "" {
259+
timeFilterItems.StartTimeAfter = &startsAfterRaw
260+
}
261+
endsBeforeRaw := r.URL.Query().Get("ends_before")
262+
if endsBeforeRaw != "" {
263+
timeFilterItems.EndTimeBefore = &endsBeforeRaw
264+
}
265+
endsAfterRaw := r.URL.Query().Get("ends_after")
266+
if endsAfterRaw != "" {
267+
timeFilterItems.EndTimeAfter = &endsAfterRaw
268+
}
269+
filter := surveyTimeFilter(&timeFilterItems)
270+
273271
surveys, surverysRsponse, err := h.app.Admin.GetSurveys(claims.OrgID, claims.AppID, &claims.Subject, nil, surveyIDs, surveyTypes, calendarEventID,
274272
&limit, &offset, filter, public, archived, completed)
275273
if err != nil {

driver/web/apis_client.go

+75-21
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import (
1818
"application/core"
1919
"application/core/model"
2020
"encoding/json"
21-
"io/ioutil"
22-
"log"
2321
"net/http"
2422
"strconv"
2523
"strings"
@@ -57,25 +55,7 @@ func (h ClientAPIsHandler) getSurvey(l *logs.Log, r *http.Request, claims *token
5755
}
5856

5957
func (h ClientAPIsHandler) getSurveys(l *logs.Log, r *http.Request, claims *tokenauth.Claims) logs.HTTPResponse {
60-
data, err := ioutil.ReadAll(r.Body)
61-
if err != nil {
62-
return l.HTTPResponseErrorAction(logutils.ActionRead, logutils.TypeRequestBody, nil, err, http.StatusBadRequest, false)
63-
}
6458

65-
var items *model.SurveyTimeFilterRequest
66-
// If the body is empty or only contains whitespace, treat it as nil
67-
if len(data) == 0 {
68-
log.Println("Request body is empty, proceeding with default behavior.")
69-
items = &model.SurveyTimeFilterRequest{StartTimeBefore: nil, StartTimeAfter: nil, EndTimeAfter: nil, EndTimeBefore: nil}
70-
} else {
71-
// Unmarshal the data into the items struct
72-
err = json.Unmarshal(data, &items)
73-
if err != nil {
74-
log.Printf("Error unmarshaling request body: %v", err)
75-
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
76-
}
77-
}
78-
filter := surveyTimeFilter(items)
7959
surveyIDsRaw := r.URL.Query().Get("ids")
8060
var surveyIDs []string
8161
if len(surveyIDsRaw) > 0 {
@@ -144,6 +124,25 @@ func (h ClientAPIsHandler) getSurveys(l *logs.Log, r *http.Request, claims *toke
144124
completed = &valueCompleted
145125
}
146126

127+
var timeFilterItems model.SurveyTimeFilterRequest
128+
startsBeforeRaw := r.URL.Query().Get("starts_before")
129+
if startsBeforeRaw != "" {
130+
timeFilterItems.StartTimeBefore = &startsBeforeRaw
131+
}
132+
startsAfterRaw := r.URL.Query().Get("starts_after")
133+
if startsAfterRaw != "" {
134+
timeFilterItems.StartTimeAfter = &startsAfterRaw
135+
}
136+
endsBeforeRaw := r.URL.Query().Get("ends_before")
137+
if endsBeforeRaw != "" {
138+
timeFilterItems.EndTimeBefore = &endsBeforeRaw
139+
}
140+
endsAfterRaw := r.URL.Query().Get("ends_after")
141+
if endsAfterRaw != "" {
142+
timeFilterItems.EndTimeAfter = &endsAfterRaw
143+
}
144+
filter := surveyTimeFilter(&timeFilterItems)
145+
147146
surveys, surverysRsponse, err := h.app.Client.GetSurveys(claims.OrgID, claims.AppID, &claims.Subject, nil, surveyIDs, surveyTypes, calendarEventID,
148147
&limit, &offset, filter, public, archived, completed)
149148
if err != nil {
@@ -520,7 +519,62 @@ func (h ClientAPIsHandler) getCreatorSurveys(l *logs.Log, r *http.Request, claim
520519
offset = intParsed
521520
}
522521

523-
resData, _, err := h.app.Client.GetSurveys(claims.OrgID, claims.AppID, &claims.Subject, &claims.Subject, surveyIDs, surveyTypes, "", &limit, &offset, nil, nil, nil, nil)
522+
publicStr := r.URL.Query().Get("public")
523+
524+
var public *bool
525+
526+
if publicStr != "" {
527+
valuePublic, err := strconv.ParseBool(publicStr)
528+
if err != nil {
529+
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
530+
}
531+
public = &valuePublic
532+
}
533+
534+
archivedStr := r.URL.Query().Get("archived")
535+
536+
var archived *bool
537+
538+
if archivedStr != "" {
539+
valueArchived, err := strconv.ParseBool(archivedStr)
540+
if err != nil {
541+
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
542+
}
543+
archived = &valueArchived
544+
}
545+
546+
completedStr := r.URL.Query().Get("completed")
547+
548+
var completed *bool
549+
550+
if completedStr != "" {
551+
valueCompleted, err := strconv.ParseBool(completedStr)
552+
if err != nil {
553+
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
554+
}
555+
completed = &valueCompleted
556+
}
557+
558+
var timeFilterItems model.SurveyTimeFilterRequest
559+
startsBeforeRaw := r.URL.Query().Get("starts_before")
560+
if startsBeforeRaw != "" {
561+
timeFilterItems.StartTimeBefore = &startsBeforeRaw
562+
}
563+
startsAfterRaw := r.URL.Query().Get("starts_after")
564+
if startsAfterRaw != "" {
565+
timeFilterItems.StartTimeAfter = &startsAfterRaw
566+
}
567+
endsBeforeRaw := r.URL.Query().Get("ends_before")
568+
if endsBeforeRaw != "" {
569+
timeFilterItems.EndTimeBefore = &endsBeforeRaw
570+
}
571+
endsAfterRaw := r.URL.Query().Get("ends_after")
572+
if endsAfterRaw != "" {
573+
timeFilterItems.EndTimeAfter = &endsAfterRaw
574+
}
575+
filter := surveyTimeFilter(&timeFilterItems)
576+
577+
resData, _, err := h.app.Client.GetSurveys(claims.OrgID, claims.AppID, &claims.Subject, &claims.Subject, surveyIDs, surveyTypes, "", &limit, &offset, filter, public, archived, completed)
524578
if err != nil {
525579
return l.HTTPResponseErrorAction(logutils.ActionGet, model.TypeSurvey, nil, err, http.StatusInternalServerError, true)
526580
}

driver/web/convertions_surveys.go

+29-29
Original file line numberDiff line numberDiff line change
@@ -69,35 +69,6 @@ func updateSurveyRequestToSurvey(item model.SurveyRequest, id string) model.Surv
6969
Public: item.Public, Archived: item.Archived, EstimatedCompletionTime: item.EstimatedCompletionTime}
7070
}
7171

72-
func surveyTimeFilter(item *model.SurveyTimeFilterRequest) *model.SurveyTimeFilter {
73-
74-
filter := model.SurveyTimeFilter{}
75-
76-
if item.StartTimeBefore != nil {
77-
beforeStartTime, _ := time.Parse(time.RFC3339, *item.StartTimeBefore)
78-
filter.StartTimeBefore = &beforeStartTime
79-
}
80-
if item.StartTimeAfter != nil {
81-
afterStartTime, _ := time.Parse(time.RFC3339, *item.StartTimeAfter)
82-
filter.StartTimeAfter = &afterStartTime
83-
}
84-
85-
if item.EndTimeBefore != nil {
86-
beforeEndTime, _ := time.Parse(time.RFC3339, *item.EndTimeBefore)
87-
filter.EndTimeBefore = &beforeEndTime
88-
}
89-
if item.EndTimeAfter != nil {
90-
afterEndTime, _ := time.Parse(time.RFC3339, *item.EndTimeAfter)
91-
filter.EndTimeAfter = &afterEndTime
92-
}
93-
94-
return &model.SurveyTimeFilter{
95-
StartTimeAfter: filter.StartTimeAfter,
96-
StartTimeBefore: filter.StartTimeBefore,
97-
EndTimeAfter: filter.EndTimeAfter,
98-
EndTimeBefore: filter.EndTimeBefore}
99-
}
100-
10172
func getSurveysResData(items []model.Survey, surveyResponses []model.SurveyResponse, completed *bool) []model.SurveysResponseData {
10273
var list []model.SurveysResponseData
10374

@@ -204,3 +175,32 @@ func sortIfpublicIsTrue(list []model.SurveysResponseData, public *bool) []model.
204175

205176
return result
206177
}
178+
179+
func surveyTimeFilter(item *model.SurveyTimeFilterRequest) *model.SurveyTimeFilter {
180+
181+
filter := model.SurveyTimeFilter{}
182+
183+
if item.StartTimeBefore != nil {
184+
beforeStartTime, _ := time.Parse(time.RFC3339, *item.StartTimeBefore)
185+
filter.StartTimeBefore = &beforeStartTime
186+
}
187+
if item.StartTimeAfter != nil {
188+
afterStartTime, _ := time.Parse(time.RFC3339, *item.StartTimeAfter)
189+
filter.StartTimeAfter = &afterStartTime
190+
}
191+
192+
if item.EndTimeBefore != nil {
193+
beforeEndTime, _ := time.Parse(time.RFC3339, *item.EndTimeBefore)
194+
filter.EndTimeBefore = &beforeEndTime
195+
}
196+
if item.EndTimeAfter != nil {
197+
afterEndTime, _ := time.Parse(time.RFC3339, *item.EndTimeAfter)
198+
filter.EndTimeAfter = &afterEndTime
199+
}
200+
201+
return &model.SurveyTimeFilter{
202+
StartTimeAfter: filter.StartTimeAfter,
203+
StartTimeBefore: filter.StartTimeBefore,
204+
EndTimeAfter: filter.EndTimeAfter,
205+
EndTimeBefore: filter.EndTimeBefore}
206+
}

0 commit comments

Comments
 (0)