-
-
Notifications
You must be signed in to change notification settings - Fork 348
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* store first db schema * md linting *screams*
- Loading branch information
1 parent
09ef9e6
commit aee1932
Showing
28 changed files
with
1,114 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
GoToSocial | ||
Copyright (C) 2021 GoToSocial Authors [email protected] | ||
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" | ||
|
||
gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20211113114307_init" | ||
"github.com/uptrace/bun" | ||
) | ||
|
||
func init() { | ||
up := func(ctx context.Context, db *bun.DB) error { | ||
models := []interface{}{ | ||
>smodel.Account{}, | ||
>smodel.Application{}, | ||
>smodel.Block{}, | ||
>smodel.DomainBlock{}, | ||
>smodel.EmailDomainBlock{}, | ||
>smodel.Follow{}, | ||
>smodel.FollowRequest{}, | ||
>smodel.MediaAttachment{}, | ||
>smodel.Mention{}, | ||
>smodel.Status{}, | ||
>smodel.StatusToEmoji{}, | ||
>smodel.StatusToTag{}, | ||
>smodel.StatusFave{}, | ||
>smodel.StatusBookmark{}, | ||
>smodel.StatusMute{}, | ||
>smodel.Tag{}, | ||
>smodel.User{}, | ||
>smodel.Emoji{}, | ||
>smodel.Instance{}, | ||
>smodel.Notification{}, | ||
>smodel.RouterSession{}, | ||
>smodel.Token{}, | ||
>smodel.Client{}, | ||
} | ||
for _, i := range models { | ||
if _, err := db.NewCreateTable().Model(i).IfNotExists().Exec(ctx); err != nil { | ||
return err | ||
} | ||
} | ||
return nil | ||
} | ||
|
||
down := func(ctx context.Context, db *bun.DB) error { | ||
return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error { | ||
return nil | ||
}) | ||
} | ||
|
||
if err := Migrations.Register(up, down); err != nil { | ||
panic(err) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
A note on when we should set data structures linked to objects in the database to use the | ||
bun `nullzero` tag -- this should only be done if the member type is a pointer, or if the | ||
this primitive type is literally invalid with an empty value (e.g. media IDs which when | ||
empty signifies a null database value, compared to say an account note which when empty | ||
could mean either an empty note OR null database value). | ||
|
||
Obviously it is a little more complex than this in practice, but keep it in mind! |
99 changes: 99 additions & 0 deletions
99
internal/db/bundb/migrations/20211113114307_init/account.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* | ||
GoToSocial | ||
Copyright (C) 2021 GoToSocial Authors [email protected] | ||
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 | ||
|
||
import ( | ||
"crypto/rsa" | ||
"time" | ||
) | ||
|
||
// Account represents either a local or a remote fediverse account, gotosocial or otherwise (mastodon, pleroma, etc). | ||
type Account struct { | ||
ID string `validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database | ||
CreatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created | ||
UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated | ||
Username string `validate:"required" bun:",nullzero,notnull,unique:userdomain"` // Username of the account, should just be a string of [a-zA-Z0-9_]. Can be added to domain to create the full username in the form ``[username]@[domain]`` eg., ``[email protected]``. Username and domain should be unique *with* each other | ||
Domain string `validate:"omitempty,fqdn" bun:",nullzero,unique:userdomain"` // Domain of the account, will be null if this is a local account, otherwise something like ``example.org``. Should be unique with username. | ||
AvatarMediaAttachmentID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // Database ID of the media attachment, if present | ||
AvatarMediaAttachment *MediaAttachment `validate:"-" bun:"rel:belongs-to"` // MediaAttachment corresponding to avatarMediaAttachmentID | ||
AvatarRemoteURL string `validate:"omitempty,url" bun:",nullzero"` // For a non-local account, where can the header be fetched? | ||
HeaderMediaAttachmentID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // Database ID of the media attachment, if present | ||
HeaderMediaAttachment *MediaAttachment `validate:"-" bun:"rel:belongs-to"` // MediaAttachment corresponding to headerMediaAttachmentID | ||
HeaderRemoteURL string `validate:"omitempty,url" bun:",nullzero"` // For a non-local account, where can the header be fetched? | ||
DisplayName string `validate:"-" bun:""` // DisplayName for this account. Can be empty, then just the Username will be used for display purposes. | ||
Fields []Field `validate:"-"` // a key/value map of fields that this account has added to their profile | ||
Note string `validate:"-" bun:""` // A note that this account has on their profile (ie., the account's bio/description of themselves) | ||
Memorial bool `validate:"-" bun:",default:false"` // Is this a memorial account, ie., has the user passed away? | ||
AlsoKnownAs string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // This account is associated with x account id (TODO: migrate to be AlsoKnownAsID) | ||
MovedToAccountID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // This account has moved this account id in the database | ||
Bot bool `validate:"-" bun:",default:false"` // Does this account identify itself as a bot? | ||
Reason string `validate:"-" bun:""` // What reason was given for signing up when this account was created? | ||
Locked bool `validate:"-" bun:",default:true"` // Does this account need an approval for new followers? | ||
Discoverable bool `validate:"-" bun:",default:false"` // Should this account be shown in the instance's profile directory? | ||
Privacy Visibility `validate:"required_without=Domain,omitempty,oneof=public unlocked followers_only mutuals_only direct" bun:",nullzero"` // Default post privacy for this account | ||
Sensitive bool `validate:"-" bun:",default:false"` // Set posts from this account to sensitive by default? | ||
Language string `validate:"omitempty,bcp47_language_tag" bun:",nullzero,notnull,default:'en'"` // What language does this account post in? | ||
URI string `validate:"required,url" bun:",nullzero,notnull,unique"` // ActivityPub URI for this account. | ||
URL string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // Web URL for this account's profile | ||
LastWebfingeredAt time.Time `validate:"required_with=Domain" bun:"type:timestamptz,nullzero"` // Last time this account was refreshed/located with webfinger. | ||
InboxURI string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // Address of this account's ActivityPub inbox, for sending activity to | ||
OutboxURI string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // Address of this account's activitypub outbox | ||
FollowingURI string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // URI for getting the following list of this account | ||
FollowersURI string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // URI for getting the followers list of this account | ||
FeaturedCollectionURI string `validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique"` // URL for getting the featured collection list of this account | ||
ActorType string `validate:"oneof=Application Group Organization Person Service" bun:",nullzero,notnull"` // What type of activitypub actor is this account? | ||
PrivateKey *rsa.PrivateKey `validate:"required_without=Domain"` // Privatekey for validating activitypub requests, will only be defined for local accounts | ||
PublicKey *rsa.PublicKey `validate:"required"` // Publickey for encoding activitypub requests, will be defined for both local and remote accounts | ||
PublicKeyURI string `validate:"required,url" bun:",nullzero,notnull,unique"` // Web-reachable location of this account's public key | ||
SensitizedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero"` // When was this account set to have all its media shown as sensitive? | ||
SilencedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero"` // When was this account silenced (eg., statuses only visible to followers, not public)? | ||
SuspendedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero"` // When was this account suspended (eg., don't allow it to log in/post, don't accept media/posts from this account) | ||
HideCollections bool `validate:"-" bun:",default:false"` // Hide this account's collections | ||
SuspensionOrigin string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // id of the database entry that caused this account to become suspended -- can be an account ID or a domain block ID | ||
} | ||
|
||
// Field represents a key value field on an account, for things like pronouns, website, etc. | ||
// VerifiedAt is optional, to be used only if Value is a URL to a webpage that contains the | ||
// username of the user. | ||
type Field struct { | ||
Name string `validate:"required"` // Name of this field. | ||
Value string `validate:"required"` // Value of this field. | ||
VerifiedAt time.Time `validate:"-" bun:",nullzero"` // This field was verified at (optional). | ||
} | ||
|
||
// Relationship describes a requester's relationship with another account. | ||
type Relationship struct { | ||
ID string // The account id. | ||
Following bool // Are you following this user? | ||
ShowingReblogs bool // Are you receiving this user's boosts in your home timeline? | ||
Notifying bool // Have you enabled notifications for this user? | ||
FollowedBy bool // Are you followed by this user? | ||
Blocking bool // Are you blocking this user? | ||
BlockedBy bool // Is this user blocking you? | ||
Muting bool // Are you muting this user? | ||
MutingNotifications bool // Are you muting notifications from this user? | ||
Requested bool // Do you have a pending follow request for this user? | ||
DomainBlocking bool // Are you blocking this user's domain? | ||
Endorsed bool // Are you featuring this user on your profile? | ||
Note string // Your note on this account. | ||
} |
35 changes: 35 additions & 0 deletions
35
internal/db/bundb/migrations/20211113114307_init/application.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
GoToSocial | ||
Copyright (C) 2021 GoToSocial Authors [email protected] | ||
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" | ||
|
||
// Application represents an application that can perform actions on behalf of a user. | ||
// It is used to authorize tokens etc, and is associated with an oauth client id in the database. | ||
type Application struct { | ||
ID string `validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database | ||
CreatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created | ||
UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated | ||
Name string `validate:"required" bun:",notnull"` // name of the application given when it was created (eg., 'tusky') | ||
Website string `validate:"omitempty,url" bun:",nullzero"` // website for the application given when it was created (eg., 'https://tusky.app') | ||
RedirectURI string `validate:"required,uri" bun:",nullzero,notnull"` // redirect uri requested by the application for oauth2 flow | ||
ClientID string `validate:"required,ulid" bun:"type:CHAR(26),nullzero,notnull"` // id of the associated oauth client entity in the db | ||
ClientSecret string `validate:"required,uuid" bun:",nullzero,notnull"` // secret of the associated oauth client entity in the db | ||
Scopes string `validate:"required" bun:",notnull"` // scopes requested when this app was created | ||
} |
Oops, something went wrong.