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 10:08:21 +02: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 10:08:21 +02: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 10:08:21 +02: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
)