feat(backend): start on fediverse auth support
This commit is contained in:
parent
bfa810fbb2
commit
17f6ac4d23
7 changed files with 354 additions and 36 deletions
76
backend/db/fediverse.go
Normal file
76
backend/db/fediverse.go
Normal file
|
@ -0,0 +1,76 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"emperror.dev/errors"
|
||||
"github.com/georgysavva/scany/pgxscan"
|
||||
"github.com/jackc/pgx/v4"
|
||||
"golang.org/x/oauth2"
|
||||
)
|
||||
|
||||
type FediverseApp struct {
|
||||
ID int64
|
||||
// Instance is the instance's base API url, excluding schema
|
||||
Instance string
|
||||
ClientID string
|
||||
ClientSecret string
|
||||
InstanceType string
|
||||
}
|
||||
|
||||
func (f FediverseApp) ClientConfig() *oauth2.Config {
|
||||
// if f.MastodonCompatible() {
|
||||
return &oauth2.Config{
|
||||
ClientID: f.ClientID,
|
||||
ClientSecret: f.ClientSecret,
|
||||
Endpoint: oauth2.Endpoint{
|
||||
AuthURL: "https://" + f.Instance + "/oauth/authorize",
|
||||
TokenURL: "https://" + f.Instance + "/oauth/token",
|
||||
AuthStyle: oauth2.AuthStyleInParams,
|
||||
},
|
||||
Scopes: []string{"read:accounts"},
|
||||
RedirectURL: os.Getenv("BASE_URL") + "/auth/login/mastodon",
|
||||
}
|
||||
// }
|
||||
|
||||
// TODO: misskey, assuming i can even find english API documentation, that is
|
||||
}
|
||||
|
||||
func (f FediverseApp) MastodonCompatible() bool {
|
||||
return f.InstanceType == "mastodon" || f.InstanceType == "pleroma" || f.InstanceType == "akkoma" || f.InstanceType == "pixelfed"
|
||||
}
|
||||
|
||||
const ErrNoInstanceApp = errors.Sentinel("instance doesn't have an app")
|
||||
|
||||
func (db *DB) FediverseApp(ctx context.Context, instance string) (fa FediverseApp, err error) {
|
||||
sql, args, err := sq.Select("*").From("fediverse_apps").Where("instance = ?", instance).ToSql()
|
||||
if err != nil {
|
||||
return fa, errors.Wrap(err, "building sql")
|
||||
}
|
||||
|
||||
err = pgxscan.Get(ctx, db, &fa, sql, args...)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == pgx.ErrNoRows {
|
||||
return fa, ErrNoInstanceApp
|
||||
}
|
||||
return fa, errors.Wrap(err, "executing query")
|
||||
}
|
||||
return fa, nil
|
||||
}
|
||||
|
||||
func (db *DB) CreateFediverseApp(ctx context.Context, instance, instanceType, clientID, clientSecret string) (fa FediverseApp, err error) {
|
||||
sql, args, err := sq.Insert("fediverse_apps").
|
||||
Columns("instance", "instance_type", "client_id", "client_secret").
|
||||
Values(instance, instanceType, clientID, clientSecret).
|
||||
Suffix("RETURNING *").ToSql()
|
||||
if err != nil {
|
||||
return fa, errors.Wrap(err, "building query")
|
||||
}
|
||||
|
||||
err = pgxscan.Get(ctx, db, &fa, sql, args...)
|
||||
if err != nil {
|
||||
return fa, errors.Wrap(err, "executing query")
|
||||
}
|
||||
return fa, nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue