summaryrefslogtreecommitdiff
path: root/shrine/models/ticket.go
blob: 363a987256ee532ff9cf1e2dd005427c9b22c314 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package models

import (
	"shrine/types/ticket"
	"shrine/utils/crypto"

	"gorm.io/gorm"
)

type TicketCategory struct {
	gorm.Model
	Ref         string `gorm:"size:12;uniqueIndex;not null"`
	Name        string `gorm:"size:100;not null;uniqueIndex"`
	Description string `gorm:"size:500"`
	SortOrder   uint   `gorm:"not null;default:0"`
}

type Ticket struct {
	gorm.Model
	Ref        string         `gorm:"size:12;uniqueIndex;not null"`
	UserID     uint           `gorm:"index;not null"`
	User       User           `gorm:"foreignKey:UserID"`
	CategoryID uint           `gorm:"index;not null"`
	Category   TicketCategory `gorm:"foreignKey:CategoryID"`
	AssigneeID *uint          `gorm:"index"`
	Assignee   *User          `gorm:"foreignKey:AssigneeID"`
	Subject    string         `gorm:"size:200;not null"`
	Priority   string         `gorm:"size:10;not null;default:low"`
	Status     string         `gorm:"size:20;not null;default:open"`
}

type TicketMessage struct {
	gorm.Model
	Ref      string `gorm:"size:12;uniqueIndex;not null"`
	TicketID uint   `gorm:"index;not null"`
	Ticket   Ticket `gorm:"foreignKey:TicketID"`
	SenderID uint   `gorm:"not null"`
	Sender   User   `gorm:"foreignKey:SenderID"`
	Body     string `gorm:"type:text;not null"`
	IsStaff  bool   `gorm:"not null;default:false"`
}

func (self *TicketCategory) BeforeCreate(tx *gorm.DB) error {
	if self.Ref == "" {
		self.Ref = crypto.Ref()
	}
	return nil
}

func (self *Ticket) BeforeCreate(tx *gorm.DB) error {
	if self.Ref == "" {
		self.Ref = crypto.Ref()
	}
	return nil
}

func (self *TicketMessage) BeforeCreate(tx *gorm.DB) error {
	if self.Ref == "" {
		self.Ref = crypto.Ref()
	}
	return nil
}

func (self *TicketCategory) ToResponse() ticket.CategoryResponse {
	return ticket.CategoryResponse{
		Ref:         self.Ref,
		Name:        self.Name,
		Description: self.Description,
		SortOrder:   self.SortOrder,
	}
}

func (self *Ticket) ToResponse() ticket.TicketResponse {
	response := ticket.TicketResponse{
		Ref:       self.Ref,
		Subject:   self.Subject,
		Category:  self.Category.ToResponse(),
		Priority:  self.Priority,
		Status:    self.Status,
		User:      self.User.ToSummary(),
		CreatedAt: self.CreatedAt,
		UpdatedAt: self.UpdatedAt,
	}

	if self.Assignee != nil {
		summary := self.Assignee.ToSummary()
		response.Assignee = &summary
	}

	return response
}

func (self *TicketMessage) ToResponse() ticket.MessageResponse {
	return ticket.MessageResponse{
		Ref:       self.Ref,
		Sender:    self.Sender.ToSummary(),
		Body:      self.Body,
		IsStaff:   self.IsStaff,
		CreatedAt: self.CreatedAt,
	}
}