From 3fedff3a5aa7602069290c216ced5f63acd21357 Mon Sep 17 00:00:00 2001 From: tobi Date: Mon, 12 May 2025 16:22:45 +0000 Subject: [PATCH] [chore] Tidy up previous interaction policy migrations (#4171) This pull request tidies up some previous migrations by making sure there's a proper snapshot in the migrations folder of what interaction policies looked like at the time the migration was written, rather than using the moving target `internal/gtsmodel`. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4171 Co-authored-by: tobi Co-committed-by: tobi --- .../20240620074530_interaction_policy.go | 38 +++-- .../new/interactionpolicy.go | 143 ++++++++++++++++++ .../new/status.go | 68 +++++++++ .../{ => old}/status.go | 24 +-- ...9134448_interaction_requests_client_api.go | 7 +- .../interactionpolicy.go | 33 ++++ .../interactionreq.go | 41 +++++ .../status.go | 92 +++++++++++ .../statusfave.go | 48 ++++++ 9 files changed, 451 insertions(+), 43 deletions(-) create mode 100644 internal/db/bundb/migrations/20240620074530_interaction_policy/new/interactionpolicy.go create mode 100644 internal/db/bundb/migrations/20240620074530_interaction_policy/new/status.go rename internal/db/bundb/migrations/20240620074530_interaction_policy/{ => old}/status.go (74%) create mode 100644 internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionpolicy.go create mode 100644 internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionreq.go create mode 100644 internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/status.go create mode 100644 internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/statusfave.go diff --git a/internal/db/bundb/migrations/20240620074530_interaction_policy.go b/internal/db/bundb/migrations/20240620074530_interaction_policy.go index 33f2c184f..2cb389e6a 100644 --- a/internal/db/bundb/migrations/20240620074530_interaction_policy.go +++ b/internal/db/bundb/migrations/20240620074530_interaction_policy.go @@ -22,8 +22,8 @@ import ( "code.superseriousbusiness.org/gotosocial/internal/log" - oldmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy" - "code.superseriousbusiness.org/gotosocial/internal/gtsmodel" + newmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy/new" + oldmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy/old" "github.com/uptrace/bun" ) @@ -161,49 +161,45 @@ func init() { return err } - // Get the mapping of old enum string values to new integer values. - visibilityMapping := visibilityEnumMapping[oldmodel.Visibility]() - // For each status found in this way, update // to new version of interaction policy. for _, oldStatus := range oldStatuses { // Start with default policy for this visibility. - v := visibilityMapping[oldStatus.Visibility] - policy := gtsmodel.DefaultInteractionPolicyFor(v) + policy := newmodel.DefaultInteractionPolicyFor(newmodel.Visibility(oldStatus.Visibility)) if !*oldStatus.Likeable { // Only author can like. - policy.CanLike = gtsmodel.PolicyRules{ - Always: gtsmodel.PolicyValues{ - gtsmodel.PolicyValueAuthor, + policy.CanLike = newmodel.PolicyRules{ + Always: newmodel.PolicyValues{ + newmodel.PolicyValueAuthor, }, - WithApproval: make(gtsmodel.PolicyValues, 0), + WithApproval: make(newmodel.PolicyValues, 0), } } if !*oldStatus.Replyable { // Only author + mentioned can Reply. - policy.CanReply = gtsmodel.PolicyRules{ - Always: gtsmodel.PolicyValues{ - gtsmodel.PolicyValueAuthor, - gtsmodel.PolicyValueMentioned, + policy.CanReply = newmodel.PolicyRules{ + Always: newmodel.PolicyValues{ + newmodel.PolicyValueAuthor, + newmodel.PolicyValueMentioned, }, - WithApproval: make(gtsmodel.PolicyValues, 0), + WithApproval: make(newmodel.PolicyValues, 0), } } if !*oldStatus.Boostable { // Only author can Announce. - policy.CanAnnounce = gtsmodel.PolicyRules{ - Always: gtsmodel.PolicyValues{ - gtsmodel.PolicyValueAuthor, + policy.CanAnnounce = newmodel.PolicyRules{ + Always: newmodel.PolicyValues{ + newmodel.PolicyValueAuthor, }, - WithApproval: make(gtsmodel.PolicyValues, 0), + WithApproval: make(newmodel.PolicyValues, 0), } } // Update status with the new interaction policy. - newStatus := >smodel.Status{ + newStatus := &newmodel.Status{ ID: oldStatus.ID, InteractionPolicy: policy, } diff --git a/internal/db/bundb/migrations/20240620074530_interaction_policy/new/interactionpolicy.go b/internal/db/bundb/migrations/20240620074530_interaction_policy/new/interactionpolicy.go new file mode 100644 index 000000000..f6821628b --- /dev/null +++ b/internal/db/bundb/migrations/20240620074530_interaction_policy/new/interactionpolicy.go @@ -0,0 +1,143 @@ +// 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 . + +package gtsmodel + +type PolicyValue string + +const ( + PolicyValuePublic PolicyValue = "public" + PolicyValueFollowers PolicyValue = "followers" + PolicyValueFollowing PolicyValue = "following" + PolicyValueMutuals PolicyValue = "mutuals" + PolicyValueMentioned PolicyValue = "mentioned" + PolicyValueAuthor PolicyValue = "author" +) + +type PolicyValues []PolicyValue + +type InteractionPolicy struct { + CanLike PolicyRules + CanReply PolicyRules + CanAnnounce PolicyRules +} + +type PolicyRules struct { + Always PolicyValues + WithApproval PolicyValues +} + +func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy { + switch v { + case VisibilityPublic: + return DefaultInteractionPolicyPublic() + case VisibilityUnlocked: + return DefaultInteractionPolicyUnlocked() + case VisibilityFollowersOnly, VisibilityMutualsOnly: + return DefaultInteractionPolicyFollowersOnly() + case VisibilityDirect: + return DefaultInteractionPolicyDirect() + default: + panic("visibility " + v + " not recognized") + } +} + +var defaultPolicyPublic = &InteractionPolicy{ + CanLike: PolicyRules{ + Always: PolicyValues{ + PolicyValuePublic, + }, + WithApproval: make(PolicyValues, 0), + }, + CanReply: PolicyRules{ + Always: PolicyValues{ + PolicyValuePublic, + }, + WithApproval: make(PolicyValues, 0), + }, + CanAnnounce: PolicyRules{ + Always: PolicyValues{ + PolicyValuePublic, + }, + WithApproval: make(PolicyValues, 0), + }, +} + +func DefaultInteractionPolicyPublic() *InteractionPolicy { + return defaultPolicyPublic +} + +func DefaultInteractionPolicyUnlocked() *InteractionPolicy { + // Same as public (for now). + return defaultPolicyPublic +} + +var defaultPolicyFollowersOnly = &InteractionPolicy{ + CanLike: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + PolicyValueFollowers, + PolicyValueMentioned, + }, + WithApproval: make(PolicyValues, 0), + }, + CanReply: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + PolicyValueFollowers, + PolicyValueMentioned, + }, + WithApproval: make(PolicyValues, 0), + }, + CanAnnounce: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + }, + WithApproval: make(PolicyValues, 0), + }, +} + +func DefaultInteractionPolicyFollowersOnly() *InteractionPolicy { + return defaultPolicyFollowersOnly +} + +var defaultPolicyDirect = &InteractionPolicy{ + CanLike: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + PolicyValueMentioned, + }, + WithApproval: make(PolicyValues, 0), + }, + CanReply: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + PolicyValueMentioned, + }, + WithApproval: make(PolicyValues, 0), + }, + CanAnnounce: PolicyRules{ + Always: PolicyValues{ + PolicyValueAuthor, + }, + WithApproval: make(PolicyValues, 0), + }, +} + +func DefaultInteractionPolicyDirect() *InteractionPolicy { + return defaultPolicyDirect +} diff --git a/internal/db/bundb/migrations/20240620074530_interaction_policy/new/status.go b/internal/db/bundb/migrations/20240620074530_interaction_policy/new/status.go new file mode 100644 index 000000000..7ef223a39 --- /dev/null +++ b/internal/db/bundb/migrations/20240620074530_interaction_policy/new/status.go @@ -0,0 +1,68 @@ +// 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 . + +package gtsmodel + +import "time" + +type Status struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + FetchedAt time.Time `bun:"type:timestamptz,nullzero"` + PinnedAt time.Time `bun:"type:timestamptz,nullzero"` + URI string `bun:",unique,nullzero,notnull"` + URL string `bun:",nullzero"` + Content string `bun:""` + AttachmentIDs []string `bun:"attachments,array"` + TagIDs []string `bun:"tags,array"` + MentionIDs []string `bun:"mentions,array"` + EmojiIDs []string `bun:"emojis,array"` + Local *bool `bun:",nullzero,notnull,default:false"` + AccountID string `bun:"type:CHAR(26),nullzero,notnull"` + AccountURI string `bun:",nullzero,notnull"` + InReplyToID string `bun:"type:CHAR(26),nullzero"` + InReplyToURI string `bun:",nullzero"` + InReplyToAccountID string `bun:"type:CHAR(26),nullzero"` + BoostOfID string `bun:"type:CHAR(26),nullzero"` + BoostOfAccountID string `bun:"type:CHAR(26),nullzero"` + ThreadID string `bun:"type:CHAR(26),nullzero"` + PollID string `bun:"type:CHAR(26),nullzero"` + ContentWarning string `bun:",nullzero"` + Visibility string `bun:",nullzero,notnull"` + Sensitive *bool `bun:",nullzero,notnull,default:false"` + Language string `bun:",nullzero"` + CreatedWithApplicationID string `bun:"type:CHAR(26),nullzero"` + ActivityStreamsType string `bun:",nullzero,notnull"` + Text string `bun:""` + Federated *bool `bun:",notnull"` + InteractionPolicy *InteractionPolicy `bun:""` + PendingApproval *bool `bun:",nullzero,notnull,default:false"` + ApprovedByURI string `bun:",nullzero"` +} + +type Visibility string + +const ( + VisibilityNone Visibility = "none" + VisibilityPublic Visibility = "public" + VisibilityUnlocked Visibility = "unlocked" + VisibilityFollowersOnly Visibility = "followers_only" + VisibilityMutualsOnly Visibility = "mutuals_only" + VisibilityDirect Visibility = "direct" + VisibilityDefault Visibility = VisibilityUnlocked +) diff --git a/internal/db/bundb/migrations/20240620074530_interaction_policy/status.go b/internal/db/bundb/migrations/20240620074530_interaction_policy/old/status.go similarity index 74% rename from internal/db/bundb/migrations/20240620074530_interaction_policy/status.go rename to internal/db/bundb/migrations/20240620074530_interaction_policy/old/status.go index 615c81b66..bff2bddfa 100644 --- a/internal/db/bundb/migrations/20240620074530_interaction_policy/status.go +++ b/internal/db/bundb/migrations/20240620074530_interaction_policy/old/status.go @@ -40,11 +40,8 @@ type Status struct { InReplyToID string `bun:"type:CHAR(26),nullzero"` InReplyToURI string `bun:",nullzero"` InReplyToAccountID string `bun:"type:CHAR(26),nullzero"` - InReplyTo *Status `bun:"-"` BoostOfID string `bun:"type:CHAR(26),nullzero"` - BoostOfURI string `bun:"-"` BoostOfAccountID string `bun:"type:CHAR(26),nullzero"` - BoostOf *Status `bun:"-"` ThreadID string `bun:"type:CHAR(26),nullzero"` PollID string `bun:"type:CHAR(26),nullzero"` ContentWarning string `bun:",nullzero"` @@ -60,23 +57,14 @@ type Status struct { Likeable *bool `bun:",notnull"` } -// Visibility represents the visibility granularity of a status. type Visibility string const ( - // VisibilityNone means nobody can see this. - // It's only used for web status visibility. - VisibilityNone Visibility = "none" - // VisibilityPublic means this status will be visible to everyone on all timelines. - VisibilityPublic Visibility = "public" - // VisibilityUnlocked means this status will be visible to everyone, but will only show on home timeline to followers, and in lists. - VisibilityUnlocked Visibility = "unlocked" - // VisibilityFollowersOnly means this status is viewable to followers only. + VisibilityNone Visibility = "none" + VisibilityPublic Visibility = "public" + VisibilityUnlocked Visibility = "unlocked" VisibilityFollowersOnly Visibility = "followers_only" - // VisibilityMutualsOnly means this status is visible to mutual followers only. - VisibilityMutualsOnly Visibility = "mutuals_only" - // VisibilityDirect means this status is visible only to mentioned recipients. - VisibilityDirect Visibility = "direct" - // VisibilityDefault is used when no other setting can be found. - VisibilityDefault Visibility = VisibilityUnlocked + VisibilityMutualsOnly Visibility = "mutuals_only" + VisibilityDirect Visibility = "direct" + VisibilityDefault Visibility = VisibilityUnlocked ) diff --git a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api.go b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api.go index 391322f3e..79d0b01bf 100644 --- a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api.go +++ b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api.go @@ -20,8 +20,7 @@ package migrations import ( "context" - "code.superseriousbusiness.org/gotosocial/internal/gtsmodel" - "code.superseriousbusiness.org/gotosocial/internal/typeutils" + gtsmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api" "github.com/uptrace/bun" ) @@ -93,7 +92,7 @@ func init() { // For each currently pending status, check whether it's a reply or // a boost, and insert a corresponding interaction request into the db. for _, pendingStatus := range pendingStatuses { - req := typeutils.StatusToInteractionRequest(pendingStatus) + req := gtsmodel.StatusToInteractionReq(pendingStatus) if _, err := tx. NewInsert(). Model(req). @@ -121,7 +120,7 @@ func init() { } for _, pendingFave := range pendingFaves { - req := typeutils.StatusFaveToInteractionRequest(pendingFave) + req := gtsmodel.StatusFaveToInteractionRequest(pendingFave) if _, err := tx. NewInsert(). diff --git a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionpolicy.go b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionpolicy.go new file mode 100644 index 000000000..17444c4ed --- /dev/null +++ b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionpolicy.go @@ -0,0 +1,33 @@ +// 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 . + +package gtsmodel + +type PolicyValue string + +type PolicyValues []PolicyValue + +type InteractionPolicy struct { + CanLike PolicyRules + CanReply PolicyRules + CanAnnounce PolicyRules +} + +type PolicyRules struct { + Always PolicyValues + WithApproval PolicyValues +} diff --git a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionreq.go b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionreq.go new file mode 100644 index 000000000..99dbaaaf7 --- /dev/null +++ b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/interactionreq.go @@ -0,0 +1,41 @@ +// 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 . + +package gtsmodel + +import "time" + +type InteractionRequest struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + StatusID string `bun:"type:CHAR(26),nullzero,notnull"` + TargetAccountID string `bun:"type:CHAR(26),nullzero,notnull"` + InteractingAccountID string `bun:"type:CHAR(26),nullzero,notnull"` + InteractionURI string `bun:",nullzero,notnull,unique"` + InteractionType InteractionType `bun:",notnull"` + AcceptedAt time.Time `bun:"type:timestamptz,nullzero"` + RejectedAt time.Time `bun:"type:timestamptz,nullzero"` + URI string `bun:",nullzero,unique"` +} + +type InteractionType int + +const ( + InteractionLike InteractionType = iota + InteractionReply + InteractionAnnounce +) diff --git a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/status.go b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/status.go new file mode 100644 index 000000000..ba4a00d6d --- /dev/null +++ b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/status.go @@ -0,0 +1,92 @@ +// 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 . + +package gtsmodel + +import ( + "time" + + "code.superseriousbusiness.org/gotosocial/internal/id" +) + +type Status struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + FetchedAt time.Time `bun:"type:timestamptz,nullzero"` + PinnedAt time.Time `bun:"type:timestamptz,nullzero"` + URI string `bun:",unique,nullzero,notnull"` + URL string `bun:",nullzero"` + Content string `bun:""` + AttachmentIDs []string `bun:"attachments,array"` + TagIDs []string `bun:"tags,array"` + MentionIDs []string `bun:"mentions,array"` + EmojiIDs []string `bun:"emojis,array"` + Local *bool `bun:",nullzero,notnull,default:false"` + AccountID string `bun:"type:CHAR(26),nullzero,notnull"` + AccountURI string `bun:",nullzero,notnull"` + InReplyToID string `bun:"type:CHAR(26),nullzero"` + InReplyToURI string `bun:",nullzero"` + InReplyToAccountID string `bun:"type:CHAR(26),nullzero"` + BoostOfID string `bun:"type:CHAR(26),nullzero"` + BoostOfAccountID string `bun:"type:CHAR(26),nullzero"` + ThreadID string `bun:"type:CHAR(26),nullzero"` + PollID string `bun:"type:CHAR(26),nullzero"` + ContentWarning string `bun:",nullzero"` + Visibility string `bun:",nullzero,notnull"` + Sensitive *bool `bun:",nullzero,notnull,default:false"` + Language string `bun:",nullzero"` + CreatedWithApplicationID string `bun:"type:CHAR(26),nullzero"` + ActivityStreamsType string `bun:",nullzero,notnull"` + Text string `bun:""` + Federated *bool `bun:",notnull"` + InteractionPolicy *InteractionPolicy `bun:""` + PendingApproval *bool `bun:",nullzero,notnull,default:false"` + ApprovedByURI string `bun:",nullzero"` +} + +func StatusToInteractionReq(status *Status) *InteractionRequest { + reqID := id.NewULIDFromTime(status.CreatedAt) + + var ( + targetID string + targetAccountID string + interactionType InteractionType + ) + + if status.InReplyToID != "" { + // It's a reply. + targetID = status.InReplyToID + targetAccountID = status.InReplyToAccountID + interactionType = InteractionReply + } else { + // It's a boost. + targetID = status.BoostOfID + targetAccountID = status.BoostOfAccountID + interactionType = InteractionAnnounce + } + + return &InteractionRequest{ + ID: reqID, + CreatedAt: status.CreatedAt, + StatusID: targetID, + TargetAccountID: targetAccountID, + InteractingAccountID: status.AccountID, + InteractionURI: status.URI, + InteractionType: interactionType, + } +} diff --git a/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/statusfave.go b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/statusfave.go new file mode 100644 index 000000000..e25e47a87 --- /dev/null +++ b/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api/statusfave.go @@ -0,0 +1,48 @@ +// 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 . + +package gtsmodel + +import ( + "time" + + "code.superseriousbusiness.org/gotosocial/internal/id" +) + +type StatusFave struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` + AccountID string `bun:"type:CHAR(26),unique:statusfaveaccountstatus,nullzero,notnull"` + TargetAccountID string `bun:"type:CHAR(26),nullzero,notnull"` + StatusID string `bun:"type:CHAR(26),unique:statusfaveaccountstatus,nullzero,notnull"` + URI string `bun:",nullzero,notnull,unique"` + PendingApproval *bool `bun:",nullzero,notnull,default:false"` + ApprovedByURI string `bun:",nullzero"` +} + +func StatusFaveToInteractionRequest(fave *StatusFave) *InteractionRequest { + return &InteractionRequest{ + ID: id.NewULIDFromTime(fave.CreatedAt), + CreatedAt: fave.CreatedAt, + StatusID: fave.StatusID, + TargetAccountID: fave.TargetAccountID, + InteractingAccountID: fave.AccountID, + InteractionURI: fave.URI, + InteractionType: InteractionLike, + } +}