diff --git a/domain/document/endpoint.go b/domain/document/endpoint.go index d35164c3..4cb5c041 100644 --- a/domain/document/endpoint.go +++ b/domain/document/endpoint.go @@ -17,6 +17,7 @@ import ( "io/ioutil" "net/http" "sort" + "strings" "github.com/documize/community/core/env" "github.com/documize/community/core/request" @@ -394,6 +395,8 @@ func (h *Handler) SearchDocuments(w http.ResponseWriter, r *http.Request) { return } + options.Keywords = strings.TrimSpace(options.Keywords) + results, err := h.Store.Search.Documents(ctx, options) if err != nil { h.Runtime.Log.Error(method, err) @@ -406,16 +409,40 @@ func (h *Handler) SearchDocuments(w http.ResponseWriter, r *http.Request) { } // Record user search history - go h.recordSearchActivity(ctx, results) + if len(results) > 0 { + go h.recordSearchActivity(ctx, results, options.Keywords) + } else { + ctx.Transaction, err = h.Runtime.Db.Beginx() + if err != nil { + h.Runtime.Log.Error(method, err) + return + } + + err = h.Store.Activity.RecordUserActivity(ctx, activity.UserActivity{ + LabelID: "", + DocumentID: "", + Metadata: options.Keywords, + SourceType: activity.SourceTypeSearch, + ActivityType: activity.TypeSearched}) + + if err != nil { + ctx.Transaction.Rollback() + h.Runtime.Log.Error(method, err) + } + + ctx.Transaction.Commit() + } h.Store.Audit.Record(ctx, audit.EventTypeSearch) response.WriteJSON(w, results) } -func (h *Handler) recordSearchActivity(ctx domain.RequestContext, q []search.QueryResult) { +// Record search request once per document. +func (h *Handler) recordSearchActivity(ctx domain.RequestContext, q []search.QueryResult, keywords string) { method := "recordSearchActivity" var err error + prev := make(map[string]bool) ctx.Transaction, err = h.Runtime.Db.Beginx() if err != nil { @@ -424,16 +451,22 @@ func (h *Handler) recordSearchActivity(ctx domain.RequestContext, q []search.Que } for i := range q { - err = h.Store.Activity.RecordUserActivity(ctx, activity.UserActivity{ - LabelID: q[i].SpaceID, - DocumentID: q[i].DocumentID, - SourceType: activity.SourceTypeSearch, - ActivityType: activity.TypeSearched}) + if _, isExisting := prev[q[i].DocumentID]; !isExisting { + err = h.Store.Activity.RecordUserActivity(ctx, activity.UserActivity{ + LabelID: q[i].SpaceID, + DocumentID: q[i].DocumentID, + Metadata: keywords, + SourceType: activity.SourceTypeSearch, + ActivityType: activity.TypeSearched}) - if err != nil { - ctx.Transaction.Rollback() - h.Runtime.Log.Error(method, err) + if err != nil { + ctx.Transaction.Rollback() + h.Runtime.Log.Error(method, err) + } + + prev[q[i].DocumentID] = true } + } ctx.Transaction.Commit() diff --git a/gui/app/pods/search/route.js b/gui/app/pods/search/route.js index caa4a689..379db063 100644 --- a/gui/app/pods/search/route.js +++ b/gui/app/pods/search/route.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -13,7 +13,14 @@ import Route from '@ember/routing/route'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Route.extend(AuthenticatedRouteMixin, { + queryParams: { + filter: { + replace: true, + refreshModel: false, + } + }, + activate() { this.get('browser').setTitle('Search'); - } -}); \ No newline at end of file + } +}); diff --git a/gui/app/pods/search/template.hbs b/gui/app/pods/search/template.hbs index 6e648b4c..9b04f7af 100644 --- a/gui/app/pods/search/template.hbs +++ b/gui/app/pods/search/template.hbs @@ -11,25 +11,30 @@