1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package model
5
6import (
7	"net/http"
8	"strings"
9)
10
11const (
12	ComplianceStatusCreated  = "created"
13	ComplianceStatusRunning  = "running"
14	ComplianceStatusFinished = "finished"
15	ComplianceStatusFailed   = "failed"
16	ComplianceStatusRemoved  = "removed"
17
18	ComplianceTypeDaily = "daily"
19	ComplianceTypeAdhoc = "adhoc"
20)
21
22type Compliance struct {
23	Id       string `json:"id"`
24	CreateAt int64  `json:"create_at"`
25	UserId   string `json:"user_id"`
26	Status   string `json:"status"`
27	Count    int    `json:"count"`
28	Desc     string `json:"desc"`
29	Type     string `json:"type"`
30	StartAt  int64  `json:"start_at"`
31	EndAt    int64  `json:"end_at"`
32	Keywords string `json:"keywords"`
33	Emails   string `json:"emails"`
34}
35
36type Compliances []Compliance
37
38// ComplianceExportCursor is used for paginated iteration of posts
39// for compliance export.
40// We need to keep track of the last post ID in addition to the last post
41// CreateAt to break ties when two posts have the same CreateAt.
42type ComplianceExportCursor struct {
43	LastChannelsQueryPostCreateAt       int64
44	LastChannelsQueryPostID             string
45	ChannelsQueryCompleted              bool
46	LastDirectMessagesQueryPostCreateAt int64
47	LastDirectMessagesQueryPostID       string
48	DirectMessagesQueryCompleted        bool
49}
50
51func (c *Compliance) PreSave() {
52	if c.Id == "" {
53		c.Id = NewId()
54	}
55
56	if c.Status == "" {
57		c.Status = ComplianceStatusCreated
58	}
59
60	c.Count = 0
61	c.Emails = NormalizeEmail(c.Emails)
62	c.Keywords = strings.ToLower(c.Keywords)
63
64	c.CreateAt = GetMillis()
65}
66
67func (c *Compliance) DeepCopy() *Compliance {
68	copy := *c
69	return &copy
70}
71
72func (c *Compliance) JobName() string {
73	jobName := c.Type
74	if c.Type == ComplianceTypeDaily {
75		jobName += "-" + c.Desc
76	}
77
78	jobName += "-" + c.Id
79
80	return jobName
81}
82
83func (c *Compliance) IsValid() *AppError {
84	if !IsValidId(c.Id) {
85		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.id.app_error", nil, "", http.StatusBadRequest)
86	}
87
88	if c.CreateAt == 0 {
89		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.create_at.app_error", nil, "", http.StatusBadRequest)
90	}
91
92	if len(c.Desc) > 512 || c.Desc == "" {
93		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.desc.app_error", nil, "", http.StatusBadRequest)
94	}
95
96	if c.StartAt == 0 {
97		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.start_at.app_error", nil, "", http.StatusBadRequest)
98	}
99
100	if c.EndAt == 0 {
101		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.end_at.app_error", nil, "", http.StatusBadRequest)
102	}
103
104	if c.EndAt <= c.StartAt {
105		return NewAppError("Compliance.IsValid", "model.compliance.is_valid.start_end_at.app_error", nil, "", http.StatusBadRequest)
106	}
107
108	return nil
109}
110