| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    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 | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	ID string `pg:"type:CHAR(26),pk,notnull"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// 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"` | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 	// Database IDs of any mentions in this status | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	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? | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	AccountID string `pg:"type:CHAR(26),notnull"` | 
					
						
							| 
									
										
										
										
											2021-06-17 18:02:33 +02:00
										 |  |  | 	// AP uri of the owner of this status | 
					
						
							|  |  |  | 	AccountURI string | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// id of the status this status is a reply to | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	InReplyToID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-06-17 18:02:33 +02:00
										 |  |  | 	// AP uri of the status this status is a reply to | 
					
						
							|  |  |  | 	InReplyToURI string | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// id of the account that this status replies to | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	InReplyToAccountID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// id of the status this status is a boost of | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	BoostOfID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-07-11 16:22:21 +02:00
										 |  |  | 	// id of the account that owns the boosted status | 
					
						
							|  |  |  | 	BoostOfAccountID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// 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? | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	CreatedWithApplicationID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// 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!. | 
					
						
							| 
									
										
										
										
											2021-05-21 15:48:26 +02:00
										 |  |  | 	ActivityStreamsType string | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// Original text of the status without formatting | 
					
						
							|  |  |  | 	Text string | 
					
						
							| 
									
										
										
										
											2021-05-17 19:06:58 +02:00
										 |  |  | 	// Has this status been pinned by its owner? | 
					
						
							|  |  |  | 	Pinned bool | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2021-05-15 11:58:11 +02:00
										 |  |  | 		INTERNAL MODEL NON-DATABASE FIELDS | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		These are for convenience while passing the status around internally, | 
					
						
							|  |  |  | 		but these fields should *never* be put in the db. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-15 11:58:11 +02:00
										 |  |  | 	// Account that created this status | 
					
						
							| 
									
										
										
										
											2021-05-27 16:06:24 +02:00
										 |  |  | 	GTSAuthorAccount *Account `pg:"-"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// 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:"-"` | 
					
						
							| 
									
										
										
										
											2021-05-08 15:16:24 +02:00
										 |  |  | 	// Status being boosted | 
					
						
							|  |  |  | 	GTSBoostedStatus *Status `pg:"-"` | 
					
						
							|  |  |  | 	// Account of the boosted status | 
					
						
							|  |  |  | 	GTSBoostedAccount *Account `pg:"-"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Visibility represents the visibility granularity of a status. | 
					
						
							|  |  |  | type Visibility string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityPublic means this status will be visible to everyone on all timelines. | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	VisibilityPublic Visibility = "public" | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityUnlocked means this status will be visible to everyone, but will only show on home timeline to followers, and in lists. | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	VisibilityUnlocked Visibility = "unlocked" | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityFollowersOnly means this status is viewable to followers only. | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	VisibilityFollowersOnly Visibility = "followers_only" | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityMutualsOnly means this status is visible to mutual followers only. | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	VisibilityMutualsOnly Visibility = "mutuals_only" | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityDirect means this status is visible only to mentioned recipients | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	VisibilityDirect Visibility = "direct" | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// VisibilityDefault is used when no other setting can be found | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	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"` | 
					
						
							|  |  |  | } |