summaryrefslogtreecommitdiff
path: root/internal/gtsmodel/status.go
blob: 84b3dfc7cb946cca2b6fc2b9d07518d5c09e4227 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
   GoToSocial
   Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Affero General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Affero General Public License for more details.

   You should have received a copy of the GNU Affero General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package gtsmodel

import "time"

// Status represents a user-created 'post' or 'status' in the database, either remote or local
type Status struct {
	// id of the status in the database
	ID string `pg:"type:CHAR(26),pk,notnull"`
	// uri at which this status is reachable
	URI string `pg:",unique"`
	// web url for viewing this status
	URL string `pg:",unique"`
	// the html-formatted content of this status
	Content string
	// Database IDs of any media attachments associated with this status
	Attachments []string `pg:",array"`
	// Database IDs of any tags used in this status
	Tags []string `pg:",array"`
	// Database IDs of any mentions in this status
	Mentions []string `pg:",array"`
	// Database IDs of any emojis used in this status
	Emojis []string `pg:",array"`
	// when was this status created?
	CreatedAt time.Time `pg:"type:timestamp,notnull,default:now()"`
	// when was this status updated?
	UpdatedAt time.Time `pg:"type:timestamp,notnull,default:now()"`
	// is this status from a local account?
	Local bool
	// which account posted this status?
	AccountID string `pg:"type:CHAR(26),notnull"`
	// AP uri of the owner of this status
	AccountURI string
	// id of the status this status is a reply to
	InReplyToID string `pg:"type:CHAR(26)"`
	// AP uri of the status this status is a reply to
	InReplyToURI string
	// id of the account that this status replies to
	InReplyToAccountID string `pg:"type:CHAR(26)"`
	// id of the status this status is a boost of
	BoostOfID string `pg:"type:CHAR(26)"`
	// id of the account that owns the boosted status
	BoostOfAccountID string `pg:"type:CHAR(26)"`
	// cw string for this status
	ContentWarning string
	// visibility entry for this status
	Visibility Visibility `pg:",notnull"`
	// mark the status as sensitive?
	Sensitive bool
	// what language is this status written in?
	Language string
	// Which application was used to create this status?
	CreatedWithApplicationID string `pg:"type:CHAR(26)"`
	// advanced visibility for this status
	VisibilityAdvanced *VisibilityAdvanced
	// What is the activitystreams type of this status? See: https://www.w3.org/TR/activitystreams-vocabulary/#object-types
	// Will probably almost always be Note but who knows!.
	ActivityStreamsType string
	// Original text of the status without formatting
	Text string
	// Has this status been pinned by its owner?
	Pinned bool

	/*
		INTERNAL MODEL NON-DATABASE FIELDS

		These are for convenience while passing the status around internally,
		but these fields should *never* be put in the db.
	*/

	// Account that created this status
	GTSAuthorAccount *Account `pg:"-"`
	// Mentions created in this status
	GTSMentions []*Mention `pg:"-"`
	// Hashtags used in this status
	GTSTags []*Tag `pg:"-"`
	// Emojis used in this status
	GTSEmojis []*Emoji `pg:"-"`
	// MediaAttachments used in this status
	GTSMediaAttachments []*MediaAttachment `pg:"-"`
	// Status being replied to
	GTSReplyToStatus *Status `pg:"-"`
	// Account being replied to
	GTSReplyToAccount *Account `pg:"-"`
	// Status being boosted
	GTSBoostedStatus *Status `pg:"-"`
	// Account of the boosted status
	GTSBoostedAccount *Account `pg:"-"`
}

// Visibility represents the visibility granularity of a status.
type Visibility string

const (
	// VisibilityPublic means this status will be visible to everyone on all timelines.
	VisibilityPublic Visibility = "public"
	// VisibilityUnlocked means this status will be visible to everyone, but will only show on home timeline to followers, and in lists.
	VisibilityUnlocked Visibility = "unlocked"
	// VisibilityFollowersOnly means this status is viewable to followers only.
	VisibilityFollowersOnly Visibility = "followers_only"
	// VisibilityMutualsOnly means this status is visible to mutual followers only.
	VisibilityMutualsOnly Visibility = "mutuals_only"
	// VisibilityDirect means this status is visible only to mentioned recipients
	VisibilityDirect Visibility = "direct"
	// VisibilityDefault is used when no other setting can be found
	VisibilityDefault Visibility = "public"
)

// VisibilityAdvanced denotes a set of flags that can be set on a status for fine-tuning visibility and interactivity of the status.
type VisibilityAdvanced struct {
	/*
		ADVANCED SETTINGS -- These should all default to TRUE.

		If PUBLIC is selected, they will all be overwritten to TRUE regardless of what is selected.
		If UNLOCKED is selected, any of them can be turned on or off in any combination.
		If FOLLOWERS-ONLY or MUTUALS-ONLY are selected, boostable will always be FALSE. The others can be turned on or off as desired.
		If DIRECT is selected, boostable will be FALSE, and all other flags will be TRUE.
	*/
	// This status will be federated beyond the local timeline(s)
	Federated bool `pg:"default:true"`
	// This status can be boosted/reblogged
	Boostable bool `pg:"default:true"`
	// This status can be replied to
	Replyable bool `pg:"default:true"`
	// This status can be liked/faved
	Likeable bool `pg:"default:true"`
}