mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 23:02:25 -05:00 
			
		
		
		
	Add migrations
This commit is contained in:
		
					parent
					
						
							
								365b575341
							
						
					
				
			
			
				commit
				
					
						6736da5178
					
				
			
		
					 4 changed files with 293 additions and 0 deletions
				
			
		|  | @ -0,0 +1,71 @@ | ||||||
|  | // 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 migrations | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"reflect" | ||||||
|  | 
 | ||||||
|  | 	"github.com/uptrace/bun" | ||||||
|  | 
 | ||||||
|  | 	gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20250324191140_add_preview_cards" | ||||||
|  | 	"github.com/superseriousbusiness/gotosocial/internal/log" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	up := func(ctx context.Context, db *bun.DB) error { | ||||||
|  | 		return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error { | ||||||
|  | 			statusType := reflect.TypeOf((*gtsmodel.Status)(nil)) | ||||||
|  | 
 | ||||||
|  | 			// Generate new Status.EditIDs column definition from bun. | ||||||
|  | 			colDef, err := getBunColumnDef(tx, statusType, "CardID") | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Add EditIDs column to Status table. | ||||||
|  | 			log.Info(ctx, "adding card id column to statuses table...") | ||||||
|  | 
 | ||||||
|  | 			_, err = tx.NewAddColumn(). | ||||||
|  | 				Model((*gtsmodel.Status)(nil)). | ||||||
|  | 				ColumnExpr(colDef). | ||||||
|  | 				Exec(ctx) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Create the main StatusEdits table. | ||||||
|  | 			_, err = tx.NewCreateTable(). | ||||||
|  | 				IfNotExists(). | ||||||
|  | 				Model((*gtsmodel.Card)(nil)). | ||||||
|  | 				Exec(ctx) | ||||||
|  | 			return err | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	down := func(ctx context.Context, db *bun.DB) error { | ||||||
|  | 		return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error { | ||||||
|  | 			// your logic here | ||||||
|  | 			return nil | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := Migrations.Register(up, down); err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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 contains types used *internally* by GoToSocial and added/removed/selected from the database. | ||||||
|  | // These types should never be serialized and/or sent out via public APIs, as they contain sensitive information. | ||||||
|  | // The annotation used on these structs is for handling them via the bun-db ORM. | ||||||
|  | // See here for more info on bun model annotations: https://bun.uptrace.dev/guide/models.html | ||||||
|  | package gtsmodel | ||||||
|  | 
 | ||||||
|  | type Card struct { | ||||||
|  | 	ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // Unique identity string. | ||||||
|  | 	// Location of linked resource. | ||||||
|  | 	// example: https://buzzfeed.com/some/fuckin/buzzfeed/article | ||||||
|  | 	URL string `bun:",nullzero"` | ||||||
|  | 	// Title of linked resource. | ||||||
|  | 	// example: Buzzfeed - Is Water Wet? | ||||||
|  | 	Title string `bun:",nullzero"` | ||||||
|  | 	// Description of preview. | ||||||
|  | 	// example: Is water wet? We're not sure. In this article, we ask an expert... | ||||||
|  | 	Description string `bun:",nullzero"` | ||||||
|  | 	// The type of the preview card. | ||||||
|  | 	// enum: | ||||||
|  | 	// - link | ||||||
|  | 	// - photo | ||||||
|  | 	// - video | ||||||
|  | 	// - rich | ||||||
|  | 	// example: link | ||||||
|  | 	Type string `bun:",nullzero"` | ||||||
|  | 	// The author of the original resource. | ||||||
|  | 	// example: weewee@buzzfeed.com | ||||||
|  | 	AuthorName string `bun:"author_name,nullzero"` | ||||||
|  | 	// A link to the author of the original resource. | ||||||
|  | 	// example: https://buzzfeed.com/authors/weewee | ||||||
|  | 	AuthorURL string `bun:"author_url,nullzero"` | ||||||
|  | 	// The provider of the original resource. | ||||||
|  | 	// example: Buzzfeed | ||||||
|  | 	ProviderName string `bun:"provider_name,nullzero"` | ||||||
|  | 	// A link to the provider of the original resource. | ||||||
|  | 	// example: https://buzzfeed.com | ||||||
|  | 	ProviderURL string `bun:"provider_url,nullzero"` | ||||||
|  | 	// HTML to be used for generating the preview card. | ||||||
|  | 	HTML string `bun:",nullzero"` | ||||||
|  | 	// Width of preview, in pixels. | ||||||
|  | 	Width int `bun:",nullzero"` | ||||||
|  | 	// Height of preview, in pixels. | ||||||
|  | 	Height int `bun:",nullzero"` | ||||||
|  | 	// Preview thumbnail. | ||||||
|  | 	// example: https://example.org/fileserver/preview/thumb.jpg | ||||||
|  | 	Image string `bun:",nullzero"` | ||||||
|  | 	// Used for photo embeds, instead of custom html. | ||||||
|  | 	EmbedURL string `bun:",nullzero"` | ||||||
|  | 	// A hash computed by the BlurHash algorithm, for generating colorful preview thumbnails when media has not been downloaded yet. | ||||||
|  | 	Blurhash string `bun:",nullzero"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,78 @@ | ||||||
|  | // 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 | ||||||
|  | 
 | ||||||
|  | // A policy URI is GoToSocial's internal representation of | ||||||
|  | // one ActivityPub URI for an Actor or a Collection of Actors, | ||||||
|  | // specific to the domain of enforcing interaction policies. | ||||||
|  | // | ||||||
|  | // A PolicyValue can be stored in the database either as one | ||||||
|  | // of the Value constants defined below (to save space), OR as | ||||||
|  | // a full-fledged ActivityPub URI. | ||||||
|  | // | ||||||
|  | // A PolicyValue should be translated to the canonical string | ||||||
|  | // value of the represented URI when federating an item, or | ||||||
|  | // from the canonical string value of the URI when receiving | ||||||
|  | // or retrieving an item. | ||||||
|  | // | ||||||
|  | // For example, if the PolicyValue `followers` was being | ||||||
|  | // federated outwards in an interaction policy attached to an | ||||||
|  | // item created by the actor `https://example.org/users/someone`, | ||||||
|  | // then it should be translated to their followers URI when sent, | ||||||
|  | // eg., `https://example.org/users/someone/followers`. | ||||||
|  | // | ||||||
|  | // Likewise, if GoToSocial receives an item with an interaction | ||||||
|  | // policy containing `https://example.org/users/someone/followers`, | ||||||
|  | // and the item was created by `https://example.org/users/someone`, | ||||||
|  | // then the followers URI would be converted to `followers` | ||||||
|  | // for internal storage. | ||||||
|  | type PolicyValue string | ||||||
|  | 
 | ||||||
|  | type PolicyValues []PolicyValue | ||||||
|  | 
 | ||||||
|  | // An InteractionPolicy determines which | ||||||
|  | // interactions will be accepted for an | ||||||
|  | // item, and according to what rules. | ||||||
|  | type InteractionPolicy struct { | ||||||
|  | 	// Conditions in which a Like | ||||||
|  | 	// interaction will be accepted | ||||||
|  | 	// for an item with this policy. | ||||||
|  | 	CanLike PolicyRules | ||||||
|  | 	// Conditions in which a Reply | ||||||
|  | 	// interaction will be accepted | ||||||
|  | 	// for an item with this policy. | ||||||
|  | 	CanReply PolicyRules | ||||||
|  | 	// Conditions in which an Announce | ||||||
|  | 	// interaction will be accepted | ||||||
|  | 	// for an item with this policy. | ||||||
|  | 	CanAnnounce PolicyRules | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PolicyRules represents the rules according | ||||||
|  | // to which a certain interaction is permitted | ||||||
|  | // to various Actor and Actor Collection URIs. | ||||||
|  | type PolicyRules struct { | ||||||
|  | 	// Always is for PolicyValues who are | ||||||
|  | 	// permitted to do an interaction | ||||||
|  | 	// without requiring approval. | ||||||
|  | 	Always PolicyValues | ||||||
|  | 	// WithApproval is for PolicyValues who | ||||||
|  | 	// are conditionally permitted to do | ||||||
|  | 	// an interaction, pending approval. | ||||||
|  | 	WithApproval PolicyValues | ||||||
|  | } | ||||||
|  | @ -0,0 +1,76 @@ | ||||||
|  | // 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" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Status represents a user-created 'post' or | ||||||
|  | // 'status' in the database, either remote or local | ||||||
|  | type Status 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 | ||||||
|  | 	UpdatedAt                time.Time          `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated | ||||||
|  | 	FetchedAt                time.Time          `bun:"type:timestamptz,nullzero"`                                   // when was item (remote) last fetched. | ||||||
|  | 	PinnedAt                 time.Time          `bun:"type:timestamptz,nullzero"`                                   // Status was pinned by owning account at this time. | ||||||
|  | 	URI                      string             `bun:",unique,nullzero,notnull"`                                    // activitypub URI of this status | ||||||
|  | 	URL                      string             `bun:",nullzero"`                                                   // web url for viewing this status | ||||||
|  | 	Content                  string             `bun:""`                                                            // content of this status; likely html-formatted but not guaranteed | ||||||
|  | 	AttachmentIDs            []string           `bun:"attachments,array"`                                           // Database IDs of any media attachments associated with this status | ||||||
|  | 	TagIDs                   []string           `bun:"tags,array"`                                                  // Database IDs of any tags used in this status | ||||||
|  | 	MentionIDs               []string           `bun:"mentions,array"`                                              // Database IDs of any mentions in this status | ||||||
|  | 	EmojiIDs                 []string           `bun:"emojis,array"`                                                // Database IDs of any emojis used in this status | ||||||
|  | 	Local                    *bool              `bun:",nullzero,notnull,default:false"`                             // is this status from a local account? | ||||||
|  | 	AccountID                string             `bun:"type:CHAR(26),nullzero,notnull"`                              // which account posted this status? | ||||||
|  | 	AccountURI               string             `bun:",nullzero,notnull"`                                           // activitypub uri of the owner of this status | ||||||
|  | 	InReplyToID              string             `bun:"type:CHAR(26),nullzero"`                                      // id of the status this status replies to | ||||||
|  | 	InReplyToURI             string             `bun:",nullzero"`                                                   // activitypub uri of the status this status is a reply to | ||||||
|  | 	InReplyToAccountID       string             `bun:"type:CHAR(26),nullzero"`                                      // id of the account that this status replies to | ||||||
|  | 	InReplyTo                *Status            `bun:"-"`                                                           // status corresponding to inReplyToID | ||||||
|  | 	BoostOfID                string             `bun:"type:CHAR(26),nullzero"`                                      // id of the status this status is a boost of | ||||||
|  | 	BoostOfURI               string             `bun:"-"`                                                           // URI of the status this status is a boost of; field not inserted in the db, just for dereferencing purposes. | ||||||
|  | 	BoostOfAccountID         string             `bun:"type:CHAR(26),nullzero"`                                      // id of the account that owns the boosted status | ||||||
|  | 	BoostOf                  *Status            `bun:"-"`                                                           // status that corresponds to boostOfID | ||||||
|  | 	ThreadID                 string             `bun:"type:CHAR(26),nullzero"`                                      // id of the thread to which this status belongs; only set for remote statuses if a local account is involved at some point in the thread, otherwise null | ||||||
|  | 	EditIDs                  []string           `bun:"edits,array"`                                                 // | ||||||
|  | 	PollID                   string             `bun:"type:CHAR(26),nullzero"`                                      // | ||||||
|  | 	ContentWarning           string             `bun:",nullzero"`                                                   // cw string for this status | ||||||
|  | 	Visibility               Visibility         `bun:",nullzero,notnull"`                                           // visibility entry for this status | ||||||
|  | 	Sensitive                *bool              `bun:",nullzero,notnull,default:false"`                             // mark the status as sensitive? | ||||||
|  | 	Language                 string             `bun:",nullzero"`                                                   // what language is this status written in? | ||||||
|  | 	CreatedWithApplicationID string             `bun:"type:CHAR(26),nullzero"`                                      // Which application was used to create this status? | ||||||
|  | 	ActivityStreamsType      string             `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!. | ||||||
|  | 	Text                     string             `bun:""`                                                            // Original text of the status without formatting | ||||||
|  | 	Federated                *bool              `bun:",notnull"`                                                    // This status will be federated beyond the local timeline(s) | ||||||
|  | 	InteractionPolicy        *InteractionPolicy `bun:""`                                                            // InteractionPolicy for this status. If null then the default InteractionPolicy should be assumed for this status's Visibility. Always null for boost wrappers. | ||||||
|  | 	PendingApproval          *bool              `bun:",nullzero,notnull,default:false"`                             // If true then status is a reply or boost wrapper that must be Approved by the reply-ee or boost-ee before being fully distributed. | ||||||
|  | 	PreApproved              bool               `bun:"-"`                                                           // If true, then status is a reply to or boost wrapper of a status on our instance, has permission to do the interaction, and an Accept should be sent out for it immediately. Field not stored in the DB. | ||||||
|  | 	ApprovedByURI            string             `bun:",nullzero"`                                                   // URI of an Accept Activity that approves the Announce or Create Activity that this status was/will be attached to. | ||||||
|  | 	CardID                   string             `bun:"type:CHAR(26),nullzero"`                                      // | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // enumType is the type we (at least, should) use | ||||||
|  | // for database enum types. it is the largest size | ||||||
|  | // supported by a PostgreSQL SMALLINT, since an | ||||||
|  | // SQLite SMALLINT is actually variable in size. | ||||||
|  | type enumType int16 | ||||||
|  | 
 | ||||||
|  | // Visibility represents the | ||||||
|  | // visibility granularity of a status. | ||||||
|  | type Visibility enumType | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue