mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 22:42:24 -05:00 
			
		
		
		
	[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 <tobi.smethurst@protonmail.com> Co-committed-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
		
					parent
					
						
							
								d3c67ad642
							
						
					
				
			
			
				commit
				
					
						3fedff3a5a
					
				
			
		
					 9 changed files with 451 additions and 43 deletions
				
			
		|  | @ -22,8 +22,8 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"code.superseriousbusiness.org/gotosocial/internal/log" | 	"code.superseriousbusiness.org/gotosocial/internal/log" | ||||||
| 
 | 
 | ||||||
| 	oldmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy" | 	newmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy/new" | ||||||
| 	"code.superseriousbusiness.org/gotosocial/internal/gtsmodel" | 	oldmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240620074530_interaction_policy/old" | ||||||
| 
 | 
 | ||||||
| 	"github.com/uptrace/bun" | 	"github.com/uptrace/bun" | ||||||
| ) | ) | ||||||
|  | @ -161,49 +161,45 @@ func init() { | ||||||
| 				return err | 				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 | 			// For each status found in this way, update | ||||||
| 			// to new version of interaction policy. | 			// to new version of interaction policy. | ||||||
| 			for _, oldStatus := range oldStatuses { | 			for _, oldStatus := range oldStatuses { | ||||||
| 				// Start with default policy for this visibility. | 				// Start with default policy for this visibility. | ||||||
| 				v := visibilityMapping[oldStatus.Visibility] | 				policy := newmodel.DefaultInteractionPolicyFor(newmodel.Visibility(oldStatus.Visibility)) | ||||||
| 				policy := gtsmodel.DefaultInteractionPolicyFor(v) |  | ||||||
| 
 | 
 | ||||||
| 				if !*oldStatus.Likeable { | 				if !*oldStatus.Likeable { | ||||||
| 					// Only author can like. | 					// Only author can like. | ||||||
| 					policy.CanLike = gtsmodel.PolicyRules{ | 					policy.CanLike = newmodel.PolicyRules{ | ||||||
| 						Always: gtsmodel.PolicyValues{ | 						Always: newmodel.PolicyValues{ | ||||||
| 							gtsmodel.PolicyValueAuthor, | 							newmodel.PolicyValueAuthor, | ||||||
| 						}, | 						}, | ||||||
| 						WithApproval: make(gtsmodel.PolicyValues, 0), | 						WithApproval: make(newmodel.PolicyValues, 0), | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if !*oldStatus.Replyable { | 				if !*oldStatus.Replyable { | ||||||
| 					// Only author + mentioned can Reply. | 					// Only author + mentioned can Reply. | ||||||
| 					policy.CanReply = gtsmodel.PolicyRules{ | 					policy.CanReply = newmodel.PolicyRules{ | ||||||
| 						Always: gtsmodel.PolicyValues{ | 						Always: newmodel.PolicyValues{ | ||||||
| 							gtsmodel.PolicyValueAuthor, | 							newmodel.PolicyValueAuthor, | ||||||
| 							gtsmodel.PolicyValueMentioned, | 							newmodel.PolicyValueMentioned, | ||||||
| 						}, | 						}, | ||||||
| 						WithApproval: make(gtsmodel.PolicyValues, 0), | 						WithApproval: make(newmodel.PolicyValues, 0), | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if !*oldStatus.Boostable { | 				if !*oldStatus.Boostable { | ||||||
| 					// Only author can Announce. | 					// Only author can Announce. | ||||||
| 					policy.CanAnnounce = gtsmodel.PolicyRules{ | 					policy.CanAnnounce = newmodel.PolicyRules{ | ||||||
| 						Always: gtsmodel.PolicyValues{ | 						Always: newmodel.PolicyValues{ | ||||||
| 							gtsmodel.PolicyValueAuthor, | 							newmodel.PolicyValueAuthor, | ||||||
| 						}, | 						}, | ||||||
| 						WithApproval: make(gtsmodel.PolicyValues, 0), | 						WithApproval: make(newmodel.PolicyValues, 0), | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				// Update status with the new interaction policy. | 				// Update status with the new interaction policy. | ||||||
| 				newStatus := >smodel.Status{ | 				newStatus := &newmodel.Status{ | ||||||
| 					ID:                oldStatus.ID, | 					ID:                oldStatus.ID, | ||||||
| 					InteractionPolicy: policy, | 					InteractionPolicy: policy, | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  | } | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  | ) | ||||||
|  | @ -40,11 +40,8 @@ type Status struct { | ||||||
| 	InReplyToID              string     `bun:"type:CHAR(26),nullzero"` | 	InReplyToID              string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	InReplyToURI             string     `bun:",nullzero"` | 	InReplyToURI             string     `bun:",nullzero"` | ||||||
| 	InReplyToAccountID       string     `bun:"type:CHAR(26),nullzero"` | 	InReplyToAccountID       string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	InReplyTo                *Status    `bun:"-"` |  | ||||||
| 	BoostOfID                string     `bun:"type:CHAR(26),nullzero"` | 	BoostOfID                string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	BoostOfURI               string     `bun:"-"` |  | ||||||
| 	BoostOfAccountID         string     `bun:"type:CHAR(26),nullzero"` | 	BoostOfAccountID         string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	BoostOf                  *Status    `bun:"-"` |  | ||||||
| 	ThreadID                 string     `bun:"type:CHAR(26),nullzero"` | 	ThreadID                 string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	PollID                   string     `bun:"type:CHAR(26),nullzero"` | 	PollID                   string     `bun:"type:CHAR(26),nullzero"` | ||||||
| 	ContentWarning           string     `bun:",nullzero"` | 	ContentWarning           string     `bun:",nullzero"` | ||||||
|  | @ -60,23 +57,14 @@ type Status struct { | ||||||
| 	Likeable                 *bool      `bun:",notnull"` | 	Likeable                 *bool      `bun:",notnull"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Visibility represents the visibility granularity of a status. |  | ||||||
| type Visibility string | type Visibility string | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	// VisibilityNone means nobody can see this. |  | ||||||
| 	// It's only used for web status visibility. |  | ||||||
| 	VisibilityNone          Visibility = "none" | 	VisibilityNone          Visibility = "none" | ||||||
| 	// VisibilityPublic means this status will be visible to everyone on all timelines. |  | ||||||
| 	VisibilityPublic        Visibility = "public" | 	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" | 	VisibilityUnlocked      Visibility = "unlocked" | ||||||
| 	// VisibilityFollowersOnly means this status is viewable to followers only. |  | ||||||
| 	VisibilityFollowersOnly Visibility = "followers_only" | 	VisibilityFollowersOnly Visibility = "followers_only" | ||||||
| 	// VisibilityMutualsOnly means this status is visible to mutual followers only. |  | ||||||
| 	VisibilityMutualsOnly   Visibility = "mutuals_only" | 	VisibilityMutualsOnly   Visibility = "mutuals_only" | ||||||
| 	// VisibilityDirect means this status is visible only to mentioned recipients. |  | ||||||
| 	VisibilityDirect        Visibility = "direct" | 	VisibilityDirect        Visibility = "direct" | ||||||
| 	// VisibilityDefault is used when no other setting can be found. |  | ||||||
| 	VisibilityDefault       Visibility = VisibilityUnlocked | 	VisibilityDefault       Visibility = VisibilityUnlocked | ||||||
| ) | ) | ||||||
|  | @ -20,8 +20,7 @@ package migrations | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 
 | 
 | ||||||
| 	"code.superseriousbusiness.org/gotosocial/internal/gtsmodel" | 	gtsmodel "code.superseriousbusiness.org/gotosocial/internal/db/bundb/migrations/20240809134448_interaction_requests_client_api" | ||||||
| 	"code.superseriousbusiness.org/gotosocial/internal/typeutils" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/uptrace/bun" | 	"github.com/uptrace/bun" | ||||||
| ) | ) | ||||||
|  | @ -93,7 +92,7 @@ func init() { | ||||||
| 			// For each currently pending status, check whether it's a reply or | 			// For each currently pending status, check whether it's a reply or | ||||||
| 			// a boost, and insert a corresponding interaction request into the db. | 			// a boost, and insert a corresponding interaction request into the db. | ||||||
| 			for _, pendingStatus := range pendingStatuses { | 			for _, pendingStatus := range pendingStatuses { | ||||||
| 				req := typeutils.StatusToInteractionRequest(pendingStatus) | 				req := gtsmodel.StatusToInteractionReq(pendingStatus) | ||||||
| 				if _, err := tx. | 				if _, err := tx. | ||||||
| 					NewInsert(). | 					NewInsert(). | ||||||
| 					Model(req). | 					Model(req). | ||||||
|  | @ -121,7 +120,7 @@ func init() { | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			for _, pendingFave := range pendingFaves { | 			for _, pendingFave := range pendingFaves { | ||||||
| 				req := typeutils.StatusFaveToInteractionRequest(pendingFave) | 				req := gtsmodel.StatusFaveToInteractionRequest(pendingFave) | ||||||
| 
 | 
 | ||||||
| 				if _, err := tx. | 				if _, err := tx. | ||||||
| 					NewInsert(). | 					NewInsert(). | ||||||
|  |  | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | package gtsmodel | ||||||
|  | 
 | ||||||
|  | type PolicyValue string | ||||||
|  | 
 | ||||||
|  | type PolicyValues []PolicyValue | ||||||
|  | 
 | ||||||
|  | type InteractionPolicy struct { | ||||||
|  | 	CanLike     PolicyRules | ||||||
|  | 	CanReply    PolicyRules | ||||||
|  | 	CanAnnounce PolicyRules | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type PolicyRules struct { | ||||||
|  | 	Always       PolicyValues | ||||||
|  | 	WithApproval PolicyValues | ||||||
|  | } | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  | ) | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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 <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | 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, | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue