diff options
Diffstat (limited to 'internal/gtsmodel/interaction.go')
-rw-r--r-- | internal/gtsmodel/interaction.go | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/internal/gtsmodel/interaction.go b/internal/gtsmodel/interaction.go new file mode 100644 index 000000000..562b752eb --- /dev/null +++ b/internal/gtsmodel/interaction.go @@ -0,0 +1,93 @@ +// 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/>. + +package gtsmodel + +import "time" + +// Like / Reply / Announce +type InteractionType int + +const ( + // WARNING: DO NOT CHANGE THE ORDER OF THESE, + // as this will cause breakage of approvals! + // + // If you need to add new interaction types, + // add them *to the end* of the list. + + InteractionLike InteractionType = iota + InteractionReply + InteractionAnnounce +) + +// Stringifies this InteractionType in a +// manner suitable for serving via the API. +func (i InteractionType) String() string { + switch i { + case InteractionLike: + const text = "favourite" + return text + case InteractionReply: + const text = "reply" + return text + case InteractionAnnounce: + const text = "reblog" + return text + default: + panic("undefined InteractionType") + } +} + +// InteractionRequest represents one interaction (like, reply, fave) +// that is either accepted, rejected, or currently still awaiting +// acceptance or rejection by the target account. +type InteractionRequest struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created + StatusID string `bun:"type:CHAR(26),nullzero,notnull"` // ID of the interaction target status. + Status *Status `bun:"-"` // Not stored in DB. Status being interacted with. + TargetAccountID string `bun:"type:CHAR(26),nullzero,notnull"` // id of the account being interacted with + TargetAccount *Account `bun:"-"` // Not stored in DB. Account being interacted with. + InteractingAccountID string `bun:"type:CHAR(26),nullzero,notnull"` // id of the account requesting the interaction. + InteractingAccount *Account `bun:"-"` // Not stored in DB. Account corresponding to targetAccountID + InteractionURI string `bun:",nullzero,notnull,unique"` // URI of the interacting like, reply, or announce. Unique (only one interaction request allowed per interaction URI). + InteractionType InteractionType `bun:",notnull"` // One of Like, Reply, or Announce. + Like *StatusFave `bun:"-"` // Not stored in DB. Only set if InteractionType = InteractionLike. + Reply *Status `bun:"-"` // Not stored in DB. Only set if InteractionType = InteractionReply. + Announce *Status `bun:"-"` // Not stored in DB. Only set if InteractionType = InteractionAnnounce. + URI string `bun:",nullzero,unique"` // ActivityPub URI of the Accept (if accepted) or Reject (if rejected). Null/empty if currently neither accepted not rejected. + AcceptedAt time.Time `bun:"type:timestamptz,nullzero"` // If interaction request was accepted, time at which this occurred. + RejectedAt time.Time `bun:"type:timestamptz,nullzero"` // If interaction request was rejected, time at which this occurred. +} + +// IsHandled returns true if interaction +// request has been neither accepted or rejected. +func (ir *InteractionRequest) IsPending() bool { + return ir.URI == "" && ir.AcceptedAt.IsZero() && ir.RejectedAt.IsZero() +} + +// IsAccepted returns true if this +// interaction request has been accepted. +func (ir *InteractionRequest) IsAccepted() bool { + return ir.URI != "" && !ir.AcceptedAt.IsZero() +} + +// IsRejected returns true if this +// interaction request has been rejected. +func (ir *InteractionRequest) IsRejected() bool { + return ir.URI != "" && !ir.RejectedAt.IsZero() +} |