2023-03-12 16:00:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// GoToSocial  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) GoToSocial Authors admin@gotosocial.org  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// SPDX-License-Identifier: AGPL-3.0-or-later  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// 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/>.  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  gtsmodel  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-10 13:32:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Status represents a user-created 'post' or 'status' in the database, either remote or local  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Status  struct  {  
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ID                        string              ` validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique" `                               // id of this item in the database 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-20 17:41:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									CreatedAt                 time . Time           ` validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp" `                        // when was item created 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									UpdatedAt                 time . Time           ` validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp" `                        // when was item last updated 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-25 13:16:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PinnedAt                  time . Time           ` validate:"-" bun:"type:timestamptz,nullzero" `                                                          // Status was pinned by owning account at this time. 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									URI                       string              ` validate:"required,url" bun:",unique,nullzero,notnull" `                                                // activitypub URI of this status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									URL                       string              ` validate:"url" bun:",nullzero" `                                                                        // web url for viewing this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Content                   string              ` validate:"-" bun:"" `                                                                                   // content of this status; likely html-formatted but not guaranteed 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AttachmentIDs             [ ] string            ` validate:"dive,ulid" bun:"attachments,array" `                                                          // Database IDs of any media attachments associated with this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Attachments               [ ] * MediaAttachment  ` validate:"-" bun:"attached_media,rel:has-many" `                                                        // Attachments corresponding to attachmentIDs 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TagIDs                    [ ] string            ` validate:"dive,ulid" bun:"tags,array" `                                                                 // Database IDs of any tags used in this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Tags                      [ ] * Tag              ` validate:"-" bun:"attached_tags,m2m:status_to_tags" `                                                   // Tags corresponding to tagIDs. https://bun.uptrace.dev/guide/relations.html#many-to-many-relation 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MentionIDs                [ ] string            ` validate:"dive,ulid" bun:"mentions,array" `                                                             // Database IDs of any mentions in this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Mentions                  [ ] * Mention          ` validate:"-" bun:"attached_mentions,rel:has-many" `                                                     // Mentions corresponding to mentionIDs 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EmojiIDs                  [ ] string            ` validate:"dive,ulid" bun:"emojis,array" `                                                               // Database IDs of any emojis used in this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Emojis                    [ ] * Emoji            ` validate:"-" bun:"attached_emojis,m2m:status_to_emojis" `                                               // Emojis corresponding to emojiIDs. https://bun.uptrace.dev/guide/relations.html#many-to-many-relation 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Local                     * bool               ` validate:"-" bun:",nullzero,notnull,default:false" `                                                    // is this status from a local account? 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AccountID                 string              ` validate:"required,ulid" bun:"type:CHAR(26),nullzero,notnull" `                                         // which account posted this status? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Account                   * Account            ` validate:"-" bun:"rel:belongs-to" `                                                                     // account corresponding to accountID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AccountURI                string              ` validate:"required,url" bun:",nullzero,notnull" `                                                       // activitypub uri of the owner of this status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InReplyToID               string              ` validate:"required_with=InReplyToURI InReplyToAccountID,omitempty,ulid" bun:"type:CHAR(26),nullzero" `  // id of the status this status replies to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InReplyToURI              string              ` validate:"required_with=InReplyToID InReplyToAccountID,omitempty,url" bun:",nullzero" `                 // activitypub uri of the status this status is a reply to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InReplyToAccountID        string              ` validate:"required_with=InReplyToID InReplyToURI,omitempty,ulid" bun:"type:CHAR(26),nullzero" `         // id of the account that this status replies to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InReplyTo                 * Status             ` validate:"-" bun:"-" `                                                                                  // status corresponding to inReplyToID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InReplyToAccount          * Account            ` validate:"-" bun:"rel:belongs-to" `                                                                     // account corresponding to inReplyToAccountID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BoostOfID                 string              ` validate:"required_with=BoostOfAccountID,omitempty,ulid" bun:"type:CHAR(26),nullzero" `                 // id of the status this status is a boost of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BoostOfAccountID          string              ` validate:"required_with=BoostOfID,omitempty,ulid" bun:"type:CHAR(26),nullzero" `                        // id of the account that owns the boosted status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BoostOf                   * Status             ` validate:"-" bun:"-" `                                                                                  // status that corresponds to boostOfID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BoostOfAccount            * Account            ` validate:"-" bun:"rel:belongs-to" `                                                                     // account that corresponds to boostOfAccountID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ContentWarning            string              ` validate:"-" bun:",nullzero" `                                                                          // cw string for this status 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Visibility                Visibility          ` validate:"oneof=public unlocked followers_only mutuals_only direct" bun:",nullzero,notnull" `           // visibility entry for this status 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Sensitive                 * bool               ` validate:"-" bun:",nullzero,notnull,default:false" `                                                    // mark the status as sensitive? 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 20:20:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Language                  string              ` validate:"-" bun:",nullzero" `                                                                          // what language is this status written in? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CreatedWithApplicationID  string              ` validate:"required_if=Local true,omitempty,ulid" bun:"type:CHAR(26),nullzero" `                         // Which application was used to create this status? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CreatedWithApplication    * Application        ` validate:"-" bun:"rel:belongs-to" `                                                                     // application corresponding to createdWithApplicationID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ActivityStreamsType       string              ` validate:"required" bun:",nullzero,notnull" `                                                           // 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-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Text                      string              ` validate:"-" bun:"" `                                                                                   // Original text of the status without formatting 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Federated                 * bool               ` validate:"-" bun:",notnull" `                                                                           // This status will be federated beyond the local timeline(s) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Boostable                 * bool               ` validate:"-" bun:",notnull" `                                                                           // This status can be boosted/reblogged 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Replyable                 * bool               ` validate:"-" bun:",notnull" `                                                                           // This status can be replied to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Likeable                  * bool               ` validate:"-" bun:",notnull" `                                                                           // This status can be liked/faved 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 12:26:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-05 12:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									The  below  functions  are  added  onto  the  gtsmodel  status  so  that  it  satisfies 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									the  Timelineable  interface  in  internal / timeline . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								* /  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  * Status )  GetID ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  s . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  * Status )  GetAccountID ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  s . AccountID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  * Status )  GetBoostOfID ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  s . BoostOfID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  * Status )  GetBoostOfAccountID ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  s . BoostOfAccountID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 12:26:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// StatusToTag is an intermediate struct to facilitate the many2many relationship between a status and one or more tags.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  StatusToTag  struct  {  
						 
					
						
							
								
									
										
										
										
											2021-08-30 13:38:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StatusID  string   ` validate:"ulid,required" bun:"type:CHAR(26),unique:statustag,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Status    * Status  ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TagID     string   ` validate:"ulid,required" bun:"type:CHAR(26),unique:statustag,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Tag       * Tag     ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 12:26:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 12:26:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// StatusToEmoji is an intermediate struct to facilitate the many2many relationship between a status and one or more emojis.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  StatusToEmoji  struct  {  
						 
					
						
							
								
									
										
										
										
											2021-08-30 13:38:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StatusID  string   ` validate:"ulid,required" bun:"type:CHAR(26),unique:statusemoji,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Status    * Status  ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EmojiID   string   ` validate:"ulid,required" bun:"type:CHAR(26),unique:statusemoji,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Emoji     * Emoji   ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
									
										
										
										
											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-08-02 19:06:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// VisibilityDirect means this status is visible only to mentioned recipients. 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									VisibilityDirect  Visibility  =  "direct" 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-02 19:06:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// VisibilityDefault is used when no other setting can be found. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisibilityDefault  Visibility  =  VisibilityUnlocked 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)