summaryrefslogtreecommitdiff
path: root/internal/api/model/status.go
blob: faf88ae842e41ea5640c9074120ee24709a753f5 (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
/*
   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 model

// Status represents a mastodon-api Status type, as defined here: https://docs.joinmastodon.org/entities/status/
type Status struct {
	// ID of the status in the database.
	ID string `json:"id"`
	// The date when this status was created (ISO 8601 Datetime)
	CreatedAt string `json:"created_at"`
	// ID of the status being replied.
	InReplyToID string `json:"in_reply_to_id,omitempty"`
	// ID of the account being replied to.
	InReplyToAccountID string `json:"in_reply_to_account_id,omitempty"`
	// Is this status marked as sensitive content?
	Sensitive bool `json:"sensitive"`
	// Subject or summary line, below which status content is collapsed until expanded.
	SpoilerText string `json:"spoiler_text,omitempty"`
	// Visibility of this status.
	Visibility Visibility `json:"visibility"`
	// Primary language of this status. (ISO 639 Part 1 two-letter language code)
	Language string `json:"language"`
	// URI of the status used for federation.
	URI string `json:"uri"`
	// A link to the status's HTML representation.
	URL string `json:"url"`
	// How many replies this status has received.
	RepliesCount int `json:"replies_count"`
	// How many boosts this status has received.
	ReblogsCount int `json:"reblogs_count"`
	// How many favourites this status has received.
	FavouritesCount int `json:"favourites_count"`
	// Have you favourited this status?
	Favourited bool `json:"favourited"`
	// Have you boosted this status?
	Reblogged bool `json:"reblogged"`
	// Have you muted notifications for this status's conversation?
	Muted bool `json:"muted"`
	// Have you bookmarked this status?
	Bookmarked bool `json:"bookmarked"`
	// Have you pinned this status? Only appears if the status is pinnable.
	Pinned bool `json:"pinned"`
	// HTML-encoded status content.
	Content string `json:"content"`
	// The status being reblogged.
	Reblog *Status `json:"reblog,omitempty"`
	// The application used to post this status.
	Application *Application `json:"application"`
	// The account that authored this status.
	Account *Account `json:"account"`
	// Media that is attached to this status.
	MediaAttachments []Attachment `json:"media_attachments"`
	// Mentions of users within the status content.
	Mentions []Mention `json:"mentions"`
	// Hashtags used within the status content.
	Tags []Tag `json:"tags"`
	// Custom emoji to be used when rendering status content.
	Emojis []Emoji `json:"emojis"`
	// Preview card for links included within status content.
	Card *Card `json:"card"`
	// The poll attached to the status.
	Poll *Poll `json:"poll"`
	// Plain-text source of a status. Returned instead of content when status is deleted,
	// so the user may redraft from the source text without the client having to reverse-engineer
	// the original text from the HTML content.
	Text string `json:"text"`
}

// StatusCreateRequest represents a mastodon-api status POST request, as defined here: https://docs.joinmastodon.org/methods/statuses/
// It should be used at the path https://mastodon.example/api/v1/statuses
type StatusCreateRequest struct {
	// Text content of the status. If media_ids is provided, this becomes optional. Attaching a poll is optional while status is provided.
	Status string `form:"status"`
	// Array of Attachment ids to be attached as media. If provided, status becomes optional, and poll cannot be used.
	MediaIDs []string `form:"media_ids"`
	// Poll to include with this status.
	Poll *PollRequest `form:"poll"`
	// ID of the status being replied to, if status is a reply
	InReplyToID string `form:"in_reply_to_id"`
	// Mark status and attached media as sensitive?
	Sensitive bool `form:"sensitive"`
	// Text to be shown as a warning or subject before the actual content. Statuses are generally collapsed behind this field.
	SpoilerText string `form:"spoiler_text"`
	// Visibility of the posted status. Enumerable oneOf public, unlisted, private, direct.
	Visibility Visibility `form:"visibility"`
	// ISO 8601 Datetime at which to schedule a status. Providing this paramter will cause ScheduledStatus to be returned instead of Status. Must be at least 5 minutes in the future.
	ScheduledAt string `form:"scheduled_at"`
	// ISO 639 language code for this status.
	Language string `form:"language"`
}

// Visibility denotes the visibility of this status to other users
type Visibility string

const (
	// VisibilityPublic means visible to everyone
	VisibilityPublic Visibility = "public"
	// VisibilityUnlisted means visible to everyone but only on home timelines or in lists
	VisibilityUnlisted Visibility = "unlisted"
	// VisibilityPrivate means visible to followers only
	VisibilityPrivate Visibility = "private"
	// VisibilityDirect means visible only to tagged recipients
	VisibilityDirect Visibility = "direct"
)

type AdvancedStatusCreateForm struct {
	StatusCreateRequest
	AdvancedVisibilityFlagsForm
}

type AdvancedVisibilityFlagsForm struct {
	// The gotosocial visibility model
	VisibilityAdvanced *string `form:"visibility_advanced"`
	// This status will be federated beyond the local timeline(s)
	Federated *bool `form:"federated"`
	// This status can be boosted/reblogged
	Boostable *bool `form:"boostable"`
	// This status can be replied to
	Replyable *bool `form:"replyable"`
	// This status can be liked/faved
	Likeable *bool `form:"likeable"`
}