summaryrefslogtreecommitdiffstats
path: root/store/sqlstore/compliance_store.go
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2017-09-25 09:11:25 -0500
committerJoram Wilander <jwawilander@gmail.com>2017-09-25 10:11:25 -0400
commit49fe5fbf3db56fc466b8997b182ee135d7a4365d (patch)
tree1252fea09aa3ce899e2e8edb1fb7b42900f50bca /store/sqlstore/compliance_store.go
parentb2c5b97601b61f5748b46e4e386134203111ebb0 (diff)
downloadchat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.tar.gz
chat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.tar.bz2
chat-49fe5fbf3db56fc466b8997b182ee135d7a4365d.zip
Move sql store code into store/sqlstore package (#7502)
* move sql store code into store/sqlstore package * move non-sql constants back up to store * fix api test * derp
Diffstat (limited to 'store/sqlstore/compliance_store.go')
-rw-r--r--store/sqlstore/compliance_store.go267
1 files changed, 267 insertions, 0 deletions
diff --git a/store/sqlstore/compliance_store.go b/store/sqlstore/compliance_store.go
new file mode 100644
index 000000000..95da94673
--- /dev/null
+++ b/store/sqlstore/compliance_store.go
@@ -0,0 +1,267 @@
+// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package sqlstore
+
+import (
+ "net/http"
+ "strconv"
+ "strings"
+
+ "github.com/mattermost/mattermost-server/model"
+ "github.com/mattermost/mattermost-server/store"
+)
+
+type SqlComplianceStore struct {
+ SqlStore
+}
+
+func NewSqlComplianceStore(sqlStore SqlStore) store.ComplianceStore {
+ s := &SqlComplianceStore{sqlStore}
+
+ for _, db := range sqlStore.GetAllConns() {
+ table := db.AddTableWithName(model.Compliance{}, "Compliances").SetKeys(false, "Id")
+ table.ColMap("Id").SetMaxSize(26)
+ table.ColMap("UserId").SetMaxSize(26)
+ table.ColMap("Status").SetMaxSize(64)
+ table.ColMap("Desc").SetMaxSize(512)
+ table.ColMap("Type").SetMaxSize(64)
+ table.ColMap("Keywords").SetMaxSize(512)
+ table.ColMap("Emails").SetMaxSize(1024)
+ }
+
+ return s
+}
+
+func (s SqlComplianceStore) CreateIndexesIfNotExists() {
+}
+
+func (s SqlComplianceStore) Save(compliance *model.Compliance) store.StoreChannel {
+
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ compliance.PreSave()
+ if result.Err = compliance.IsValid(); result.Err != nil {
+ storeChannel <- result
+ close(storeChannel)
+ return
+ }
+
+ if err := s.GetMaster().Insert(compliance); err != nil {
+ result.Err = model.NewAppError("SqlComplianceStore.Save", "store.sql_compliance.save.saving.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = compliance
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (us SqlComplianceStore) Update(compliance *model.Compliance) store.StoreChannel {
+
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ if result.Err = compliance.IsValid(); result.Err != nil {
+ storeChannel <- result
+ close(storeChannel)
+ return
+ }
+
+ if _, err := us.GetMaster().Update(compliance); err != nil {
+ result.Err = model.NewAppError("SqlComplianceStore.Update", "store.sql_compliance.save.saving.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = compliance
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (s SqlComplianceStore) GetAll(offset, limit int) store.StoreChannel {
+
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ query := "SELECT * FROM Compliances ORDER BY CreateAt DESC LIMIT :Limit OFFSET :Offset"
+
+ var compliances model.Compliances
+ if _, err := s.GetReplica().Select(&compliances, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
+ result.Err = model.NewAppError("SqlComplianceStore.Get", "store.sql_compliance.get.finding.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = compliances
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
+func (us SqlComplianceStore) Get(id string) store.StoreChannel {
+
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ if obj, err := us.GetReplica().Get(model.Compliance{}, id); err != nil {
+ result.Err = model.NewAppError("SqlComplianceStore.Get", "store.sql_compliance.get.finding.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else if obj == nil {
+ result.Err = model.NewAppError("SqlComplianceStore.Get", "store.sql_compliance.get.finding.app_error", nil, err.Error(), http.StatusNotFound)
+ } else {
+ result.Data = obj.(*model.Compliance)
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+
+ }()
+
+ return storeChannel
+}
+
+func (s SqlComplianceStore) ComplianceExport(job *model.Compliance) store.StoreChannel {
+ storeChannel := make(store.StoreChannel, 1)
+
+ go func() {
+ result := store.StoreResult{}
+
+ props := map[string]interface{}{"StartTime": job.StartAt, "EndTime": job.EndAt}
+
+ keywordQuery := ""
+ keywords := strings.Fields(strings.TrimSpace(strings.ToLower(strings.Replace(job.Keywords, ",", " ", -1))))
+ if len(keywords) > 0 {
+
+ keywordQuery = "AND ("
+
+ for index, keyword := range keywords {
+ if index >= 1 {
+ keywordQuery += " OR LOWER(Posts.Message) LIKE :Keyword" + strconv.Itoa(index)
+ } else {
+ keywordQuery += "LOWER(Posts.Message) LIKE :Keyword" + strconv.Itoa(index)
+ }
+
+ props["Keyword"+strconv.Itoa(index)] = "%" + keyword + "%"
+ }
+
+ keywordQuery += ")"
+ }
+
+ emailQuery := ""
+ emails := strings.Fields(strings.TrimSpace(strings.ToLower(strings.Replace(job.Emails, ",", " ", -1))))
+ if len(emails) > 0 {
+
+ emailQuery = "AND ("
+
+ for index, email := range emails {
+ if index >= 1 {
+ emailQuery += " OR Users.Email = :Email" + strconv.Itoa(index)
+ } else {
+ emailQuery += "Users.Email = :Email" + strconv.Itoa(index)
+ }
+
+ props["Email"+strconv.Itoa(index)] = email
+ }
+
+ emailQuery += ")"
+ }
+
+ query :=
+ `(SELECT
+ Teams.Name AS TeamName,
+ Teams.DisplayName AS TeamDisplayName,
+ Channels.Name AS ChannelName,
+ Channels.DisplayName AS ChannelDisplayName,
+ Users.Username AS UserUsername,
+ Users.Email AS UserEmail,
+ Users.Nickname AS UserNickname,
+ Posts.Id AS PostId,
+ Posts.CreateAt AS PostCreateAt,
+ Posts.UpdateAt AS PostUpdateAt,
+ Posts.DeleteAt AS PostDeleteAt,
+ Posts.RootId AS PostRootId,
+ Posts.ParentId AS PostParentId,
+ Posts.OriginalId AS PostOriginalId,
+ Posts.Message AS PostMessage,
+ Posts.Type AS PostType,
+ Posts.Props AS PostProps,
+ Posts.Hashtags AS PostHashtags,
+ Posts.FileIds AS PostFileIds
+ FROM
+ Teams,
+ Channels,
+ Users,
+ Posts
+ WHERE
+ Teams.Id = Channels.TeamId
+ AND Posts.ChannelId = Channels.Id
+ AND Posts.UserId = Users.Id
+ AND Posts.CreateAt > :StartTime
+ AND Posts.CreateAt <= :EndTime
+ ` + emailQuery + `
+ ` + keywordQuery + `)
+ UNION ALL
+ (SELECT
+ 'direct-messages' AS TeamName,
+ 'Direct Messages' AS TeamDisplayName,
+ Channels.Name AS ChannelName,
+ Channels.DisplayName AS ChannelDisplayName,
+ Users.Username AS UserUsername,
+ Users.Email AS UserEmail,
+ Users.Nickname AS UserNickname,
+ Posts.Id AS PostId,
+ Posts.CreateAt AS PostCreateAt,
+ Posts.UpdateAt AS PostUpdateAt,
+ Posts.DeleteAt AS PostDeleteAt,
+ Posts.RootId AS PostRootId,
+ Posts.ParentId AS PostParentId,
+ Posts.OriginalId AS PostOriginalId,
+ Posts.Message AS PostMessage,
+ Posts.Type AS PostType,
+ Posts.Props AS PostProps,
+ Posts.Hashtags AS PostHashtags,
+ Posts.FileIds AS PostFileIds
+ FROM
+ Channels,
+ Users,
+ Posts
+ WHERE
+ Channels.TeamId = ''
+ AND Posts.ChannelId = Channels.Id
+ AND Posts.UserId = Users.Id
+ AND Posts.CreateAt > :StartTime
+ AND Posts.CreateAt <= :EndTime
+ ` + emailQuery + `
+ ` + keywordQuery + `)
+ ORDER BY PostCreateAt
+ LIMIT 30000`
+
+ var cposts []*model.CompliancePost
+
+ if _, err := s.GetReplica().Select(&cposts, query, props); err != nil {
+ result.Err = model.NewAppError("SqlPostStore.ComplianceExport", "store.sql_post.compliance_export.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else {
+ result.Data = cposts
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}