mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 04:42:31 -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