diff --git a/Makefile b/Makefile index c7ee5a3..966a72a 100644 --- a/Makefile +++ b/Makefile @@ -5,16 +5,28 @@ BINDIR ?= $(GOPATH)/bin # for dockerized protobuf tools DOCKER := $(shell which docker) -HTTPS_GIT := github.com/onsonr/sonr.git +HTTPS_GIT := github.com/onsonr/hway.git -all: test + +all: install test build: go.sum - GOOS=js GOARCH=wasm go build -o static/wasm/app.wasm ./cmd/motr/main.go + GOOS=js GOARCH=wasm go build -o build/app.wasm ./cmd/main.go + +install: go.sum + go install -mod=readonly ./cmd/hway ######################################## ### Tools & dependencies ######################################## +pkl-gen: + @go install github.com/apple/pkl-go/cmd/pkl-gen-go@latest + @pkl-gen-go ./pkl/App.pkl + +sqlc-gen: + @go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest + @go install github.com/apple/pkl-go/cmd/pkl-gen-go@latest + @cd internal && sqlc generate go-mod-cache: go.sum @echo "--> Download go modules to local cache" @@ -29,39 +41,17 @@ draw-deps: go install github.com/RobotsAndPencils/goviz@latest @goviz -i ./cmd/sonrd -d 2 | dot -Tpng -o dependency-graph.png -install-deps: - echo "Installing dependencies" - @go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest - @go install github.com/a-h/templ/cmd/templ@latest - @go install github.com/go-task/task/v3/cmd/task@latest - clean: rm -rf .aider* rm -rf static rm -rf .out + rm -rf hway.db + rm -rf snapcraft-local.yaml build/ rm -rf build distclean: clean rm -rf vendor/ -######################################## -### Testing -######################################## - -test: test-unit -test-all: test-race test-cover test-system - -test-unit: - @VERSION=$(VERSION) go test -mod=readonly -tags='ledger test_ledger_mock' ./... - -test-race: - @VERSION=$(VERSION) go test -mod=readonly -race -tags='ledger test_ledger_mock' ./... - -test-cover: - @go test -mod=readonly -timeout 30m -race -coverprofile=coverage.txt -covermode=atomic -tags='ledger test_ledger_mock' ./... - -benchmark: - @go test -mod=readonly -bench=. ./... ############################################################################### ### help ### @@ -71,6 +61,8 @@ help: @echo "Usage: make " @echo "" @echo "Available targets:" + @echo " install : Install the binary" + @echo " local-image : Install the docker image" @echo " proto-gen : Generate code from proto files" @echo " testnet : Local devnet with IBC" @echo " sh-testnet : Shell local devnet" diff --git a/app/vault.go b/app/vault.go index 77e65e4..0533349 100644 --- a/app/vault.go +++ b/app/vault.go @@ -7,7 +7,7 @@ import ( echomiddleware "github.com/labstack/echo/v4/middleware" "github.com/onsonr/sonr/internal/config/motr" "github.com/onsonr/sonr/internal/database/motrorm" - "github.com/onsonr/sonr/vault/context" + "github.com/onsonr/motr/pkg/context" ) type Vault = *echo.Echo diff --git a/cmd/motr/main.go b/cmd/main.go similarity index 100% rename from cmd/motr/main.go rename to cmd/main.go diff --git a/go.mod b/go.mod index ba49ad3..e06553a 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,30 @@ module github.com/onsonr/motr go 1.23.4 + +require ( + github.com/a-h/templ v0.3.819 + github.com/apple/pkl-go v0.9.0 + github.com/ipfs/boxo v0.26.0 + github.com/labstack/echo/v4 v4.13.3 + github.com/ncruces/go-sqlite3 v0.21.3 + github.com/onsonr/sonr v0.6.1 +) + +require ( + github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/julianday v1.0.0 // indirect + github.com/tetratelabs/wazero v1.8.2 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.8.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..73a4412 --- /dev/null +++ b/go.sum @@ -0,0 +1,55 @@ +github.com/a-h/templ v0.3.819 h1:KDJ5jTFN15FyJnmSmo2gNirIqt7hfvBD2VXVDTySckM= +github.com/a-h/templ v0.3.819/go.mod h1:iDJKJktpttVKdWoTkRNNLcllRI+BlpopJc+8au3gOUo= +github.com/apple/pkl-go v0.9.0 h1:aA4Bh+WQ797p8nEnQhHzCahVuQP2HJ40ffSQWlAR5es= +github.com/apple/pkl-go v0.9.0/go.mod h1:5Hwil5tyZGrOekh7JXLZJvIAcGHb4gT19lnv4WEiKeI= +github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4= +github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8= +github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-sqlite3 v0.21.3 h1:hHkfNQLcbnxPJZhC/RGw9SwP3bfkv/Y0xUHWsr1CdMQ= +github.com/ncruces/go-sqlite3 v0.21.3/go.mod h1:zxMOaSG5kFYVFK4xQa0pdwIszqxqJ0W0BxBgwdrNjuA= +github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= +github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= +github.com/onsonr/sonr v0.6.1 h1:pNP2BbOfe/3UN/bZSYNyf9F+nlIpZaqi2LJ6Ol0496w= +github.com/onsonr/sonr v0.6.1/go.mod h1:L4ywLeJemlGD2pmlIX/j3eEKEgu5o/yzgFjkHNr7dAk= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4= +github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/config/Config.pkl.go b/internal/config/Config.pkl.go new file mode 100644 index 0000000..19fb117 --- /dev/null +++ b/internal/config/Config.pkl.go @@ -0,0 +1,18 @@ +// Code generated from Pkl module `sonr.net.Motr`. DO NOT EDIT. +package config + +type Config struct { + IpfsGatewayUrl string `pkl:"ipfsGatewayUrl" json:"ipfsGatewayUrl,omitempty"` + + MotrToken string `pkl:"motrToken" json:"motrToken,omitempty"` + + MotrAddress string `pkl:"motrAddress" json:"motrAddress,omitempty"` + + SonrApiUrl string `pkl:"sonrApiUrl" json:"sonrApiUrl,omitempty"` + + SonrRpcUrl string `pkl:"sonrRpcUrl" json:"sonrRpcUrl,omitempty"` + + SonrChainId string `pkl:"sonrChainId" json:"sonrChainId,omitempty"` + + VaultSchema *Schema `pkl:"vaultSchema" json:"vaultSchema,omitempty"` +} diff --git a/internal/config/Environment.pkl.go b/internal/config/Environment.pkl.go new file mode 100644 index 0000000..734ca91 --- /dev/null +++ b/internal/config/Environment.pkl.go @@ -0,0 +1,14 @@ +// Code generated from Pkl module `sonr.net.Motr`. DO NOT EDIT. +package config + +type Environment struct { + IsDevelopment bool `pkl:"isDevelopment" json:"isDevelopment,omitempty"` + + CacheVersion string `pkl:"cacheVersion" json:"cacheVersion,omitempty"` + + HttpserverPath string `pkl:"httpserverPath" json:"httpserverPath,omitempty"` + + WasmExecPath string `pkl:"wasmExecPath" json:"wasmExecPath,omitempty"` + + WasmPath string `pkl:"wasmPath" json:"wasmPath,omitempty"` +} diff --git a/internal/config/Motr.pkl.go b/internal/config/Motr.pkl.go new file mode 100644 index 0000000..0cac00e --- /dev/null +++ b/internal/config/Motr.pkl.go @@ -0,0 +1,36 @@ +// Code generated from Pkl module `sonr.net.Motr`. DO NOT EDIT. +package config + +import ( + "context" + + "github.com/apple/pkl-go/pkl" +) + +type Motr struct { +} + +// LoadFromPath loads the pkl module at the given path and evaluates it into a Motr +func LoadFromPath(ctx context.Context, path string) (ret *Motr, err error) { + evaluator, err := pkl.NewEvaluator(ctx, pkl.PreconfiguredOptions) + if err != nil { + return nil, err + } + defer func() { + cerr := evaluator.Close() + if err == nil { + err = cerr + } + }() + ret, err = Load(ctx, evaluator, pkl.FileSource(path)) + return ret, err +} + +// Load loads the pkl module at the given source and evaluates it with the given evaluator into a Motr +func Load(ctx context.Context, evaluator pkl.Evaluator, source *pkl.ModuleSource) (*Motr, error) { + var ret Motr + if err := evaluator.EvaluateModule(ctx, source, &ret); err != nil { + return nil, err + } + return &ret, nil +} diff --git a/internal/config/Schema.pkl.go b/internal/config/Schema.pkl.go new file mode 100644 index 0000000..7c17e31 --- /dev/null +++ b/internal/config/Schema.pkl.go @@ -0,0 +1,22 @@ +// Code generated from Pkl module `sonr.net.Motr`. DO NOT EDIT. +package config + +type Schema struct { + Version int `pkl:"version"` + + Account string `pkl:"account" json:"account,omitempty"` + + Asset string `pkl:"asset" json:"asset,omitempty"` + + Chain string `pkl:"chain" json:"chain,omitempty"` + + Credential string `pkl:"credential" json:"credential,omitempty"` + + Jwk string `pkl:"jwk" json:"jwk,omitempty"` + + Grant string `pkl:"grant" json:"grant,omitempty"` + + Keyshare string `pkl:"keyshare" json:"keyshare,omitempty"` + + Profile string `pkl:"profile" json:"profile,omitempty"` +} diff --git a/internal/config/init.pkl.go b/internal/config/init.pkl.go new file mode 100644 index 0000000..290e991 --- /dev/null +++ b/internal/config/init.pkl.go @@ -0,0 +1,11 @@ +// Code generated from Pkl module `sonr.net.Motr`. DO NOT EDIT. +package config + +import "github.com/apple/pkl-go/pkl" + +func init() { + pkl.RegisterMapping("sonr.net.Motr", Motr{}) + pkl.RegisterMapping("sonr.net.Motr#Config", Config{}) + pkl.RegisterMapping("sonr.net.Motr#Schema", Schema{}) + pkl.RegisterMapping("sonr.net.Motr#Environment", Environment{}) +} diff --git a/internal/models/db.go b/internal/models/db.go new file mode 100644 index 0000000..e8b9935 --- /dev/null +++ b/internal/models/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package models + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/models/models.go b/internal/models/models.go new file mode 100644 index 0000000..418f717 --- /dev/null +++ b/internal/models/models.go @@ -0,0 +1,99 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package models + +import ( + "database/sql" + "time" +) + +type Account struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + Number int64 `json:"number"` + Sequence int64 `json:"sequence"` + Address string `json:"address"` + PublicKey string `json:"public_key"` + ChainID string `json:"chain_id"` + Controller string `json:"controller"` + IsSubsidiary bool `json:"is_subsidiary"` + IsValidator bool `json:"is_validator"` + IsDelegator bool `json:"is_delegator"` + IsAccountable bool `json:"is_accountable"` +} + +type Asset struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + Name string `json:"name"` + Symbol string `json:"symbol"` + Decimals int64 `json:"decimals"` + ChainID string `json:"chain_id"` + Channel string `json:"channel"` + AssetType string `json:"asset_type"` + CoingeckoID sql.NullString `json:"coingecko_id"` +} + +type Credential struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + Handle string `json:"handle"` + CredentialID string `json:"credential_id"` + AuthenticatorAttachment string `json:"authenticator_attachment"` + Origin string `json:"origin"` + Type string `json:"type"` + Transports string `json:"transports"` +} + +type Profile struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + Address string `json:"address"` + Handle string `json:"handle"` + Origin string `json:"origin"` + Name string `json:"name"` +} + +type Session struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + BrowserName string `json:"browser_name"` + BrowserVersion string `json:"browser_version"` + ClientIpaddr string `json:"client_ipaddr"` + Platform string `json:"platform"` + IsDesktop bool `json:"is_desktop"` + IsMobile bool `json:"is_mobile"` + IsTablet bool `json:"is_tablet"` + IsTv bool `json:"is_tv"` + IsBot bool `json:"is_bot"` + Challenge string `json:"challenge"` + IsHumanFirst bool `json:"is_human_first"` + IsHumanLast bool `json:"is_human_last"` + ProfileID int64 `json:"profile_id"` +} + +type Vault struct { + ID string `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt sql.NullTime `json:"deleted_at"` + Handle string `json:"handle"` + Origin string `json:"origin"` + Address string `json:"address"` + Cid string `json:"cid"` + Config string `json:"config"` + SessionID string `json:"session_id"` + RedirectUri string `json:"redirect_uri"` +} diff --git a/internal/models/querier.go b/internal/models/querier.go new file mode 100644 index 0000000..e774f75 --- /dev/null +++ b/internal/models/querier.go @@ -0,0 +1,34 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package models + +import ( + "context" +) + +type Querier interface { + CheckHandleExists(ctx context.Context, handle string) (bool, error) + CreateSession(ctx context.Context, arg CreateSessionParams) (Session, error) + GetChallengeBySessionID(ctx context.Context, id string) (string, error) + GetCredentialByID(ctx context.Context, credentialID string) (Credential, error) + GetCredentialsByHandle(ctx context.Context, handle string) ([]Credential, error) + GetHumanVerificationNumbers(ctx context.Context, id string) (GetHumanVerificationNumbersRow, error) + GetProfileByAddress(ctx context.Context, address string) (Profile, error) + GetProfileByHandle(ctx context.Context, handle string) (Profile, error) + GetProfileByID(ctx context.Context, id string) (Profile, error) + GetSessionByClientIP(ctx context.Context, clientIpaddr string) (Session, error) + GetSessionByID(ctx context.Context, id string) (Session, error) + GetVaultConfigByCID(ctx context.Context, cid string) (Vault, error) + GetVaultRedirectURIBySessionID(ctx context.Context, sessionID string) (string, error) + InsertCredential(ctx context.Context, arg InsertCredentialParams) (Credential, error) + InsertProfile(ctx context.Context, arg InsertProfileParams) (Profile, error) + SoftDeleteCredential(ctx context.Context, credentialID string) error + SoftDeleteProfile(ctx context.Context, address string) error + UpdateProfile(ctx context.Context, arg UpdateProfileParams) (Profile, error) + UpdateSessionHumanVerification(ctx context.Context, arg UpdateSessionHumanVerificationParams) (Session, error) + UpdateSessionWithProfileID(ctx context.Context, arg UpdateSessionWithProfileIDParams) (Session, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/models/query.sql.go b/internal/models/query.sql.go new file mode 100644 index 0000000..46436c4 --- /dev/null +++ b/internal/models/query.sql.go @@ -0,0 +1,581 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: query.sql + +package models + +import ( + "context" +) + +const checkHandleExists = `-- name: CheckHandleExists :one +SELECT COUNT(*) > 0 as handle_exists FROM profiles +WHERE handle = ? +AND deleted_at IS NULL +` + +func (q *Queries) CheckHandleExists(ctx context.Context, handle string) (bool, error) { + row := q.db.QueryRowContext(ctx, checkHandleExists, handle) + var handle_exists bool + err := row.Scan(&handle_exists) + return handle_exists, err +} + +const createSession = `-- name: CreateSession :one +INSERT INTO sessions ( + id, + browser_name, + browser_version, + client_ipaddr, + platform, + is_desktop, + is_mobile, + is_tablet, + is_tv, + is_bot, + challenge, + is_human_first, + is_human_last, + profile_id +) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) +RETURNING id, created_at, updated_at, deleted_at, browser_name, browser_version, client_ipaddr, platform, is_desktop, is_mobile, is_tablet, is_tv, is_bot, challenge, is_human_first, is_human_last, profile_id +` + +type CreateSessionParams struct { + ID string `json:"id"` + BrowserName string `json:"browser_name"` + BrowserVersion string `json:"browser_version"` + ClientIpaddr string `json:"client_ipaddr"` + Platform string `json:"platform"` + IsDesktop bool `json:"is_desktop"` + IsMobile bool `json:"is_mobile"` + IsTablet bool `json:"is_tablet"` + IsTv bool `json:"is_tv"` + IsBot bool `json:"is_bot"` + Challenge string `json:"challenge"` + IsHumanFirst bool `json:"is_human_first"` + IsHumanLast bool `json:"is_human_last"` + ProfileID int64 `json:"profile_id"` +} + +func (q *Queries) CreateSession(ctx context.Context, arg CreateSessionParams) (Session, error) { + row := q.db.QueryRowContext(ctx, createSession, + arg.ID, + arg.BrowserName, + arg.BrowserVersion, + arg.ClientIpaddr, + arg.Platform, + arg.IsDesktop, + arg.IsMobile, + arg.IsTablet, + arg.IsTv, + arg.IsBot, + arg.Challenge, + arg.IsHumanFirst, + arg.IsHumanLast, + arg.ProfileID, + ) + var i Session + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.BrowserName, + &i.BrowserVersion, + &i.ClientIpaddr, + &i.Platform, + &i.IsDesktop, + &i.IsMobile, + &i.IsTablet, + &i.IsTv, + &i.IsBot, + &i.Challenge, + &i.IsHumanFirst, + &i.IsHumanLast, + &i.ProfileID, + ) + return i, err +} + +const getChallengeBySessionID = `-- name: GetChallengeBySessionID :one +SELECT challenge FROM sessions +WHERE id = ? AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetChallengeBySessionID(ctx context.Context, id string) (string, error) { + row := q.db.QueryRowContext(ctx, getChallengeBySessionID, id) + var challenge string + err := row.Scan(&challenge) + return challenge, err +} + +const getCredentialByID = `-- name: GetCredentialByID :one +SELECT id, created_at, updated_at, deleted_at, handle, credential_id, authenticator_attachment, origin, type, transports FROM credentials +WHERE credential_id = ? +AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetCredentialByID(ctx context.Context, credentialID string) (Credential, error) { + row := q.db.QueryRowContext(ctx, getCredentialByID, credentialID) + var i Credential + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Handle, + &i.CredentialID, + &i.AuthenticatorAttachment, + &i.Origin, + &i.Type, + &i.Transports, + ) + return i, err +} + +const getCredentialsByHandle = `-- name: GetCredentialsByHandle :many +SELECT id, created_at, updated_at, deleted_at, handle, credential_id, authenticator_attachment, origin, type, transports FROM credentials +WHERE handle = ? +AND deleted_at IS NULL +` + +func (q *Queries) GetCredentialsByHandle(ctx context.Context, handle string) ([]Credential, error) { + rows, err := q.db.QueryContext(ctx, getCredentialsByHandle, handle) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Credential + for rows.Next() { + var i Credential + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Handle, + &i.CredentialID, + &i.AuthenticatorAttachment, + &i.Origin, + &i.Type, + &i.Transports, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getHumanVerificationNumbers = `-- name: GetHumanVerificationNumbers :one +SELECT is_human_first, is_human_last FROM sessions +WHERE id = ? AND deleted_at IS NULL +LIMIT 1 +` + +type GetHumanVerificationNumbersRow struct { + IsHumanFirst bool `json:"is_human_first"` + IsHumanLast bool `json:"is_human_last"` +} + +func (q *Queries) GetHumanVerificationNumbers(ctx context.Context, id string) (GetHumanVerificationNumbersRow, error) { + row := q.db.QueryRowContext(ctx, getHumanVerificationNumbers, id) + var i GetHumanVerificationNumbersRow + err := row.Scan(&i.IsHumanFirst, &i.IsHumanLast) + return i, err +} + +const getProfileByAddress = `-- name: GetProfileByAddress :one +SELECT id, created_at, updated_at, deleted_at, address, handle, origin, name FROM profiles +WHERE address = ? AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetProfileByAddress(ctx context.Context, address string) (Profile, error) { + row := q.db.QueryRowContext(ctx, getProfileByAddress, address) + var i Profile + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Address, + &i.Handle, + &i.Origin, + &i.Name, + ) + return i, err +} + +const getProfileByHandle = `-- name: GetProfileByHandle :one +SELECT id, created_at, updated_at, deleted_at, address, handle, origin, name FROM profiles +WHERE handle = ? +AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetProfileByHandle(ctx context.Context, handle string) (Profile, error) { + row := q.db.QueryRowContext(ctx, getProfileByHandle, handle) + var i Profile + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Address, + &i.Handle, + &i.Origin, + &i.Name, + ) + return i, err +} + +const getProfileByID = `-- name: GetProfileByID :one +SELECT id, created_at, updated_at, deleted_at, address, handle, origin, name FROM profiles +WHERE id = ? AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetProfileByID(ctx context.Context, id string) (Profile, error) { + row := q.db.QueryRowContext(ctx, getProfileByID, id) + var i Profile + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Address, + &i.Handle, + &i.Origin, + &i.Name, + ) + return i, err +} + +const getSessionByClientIP = `-- name: GetSessionByClientIP :one +SELECT id, created_at, updated_at, deleted_at, browser_name, browser_version, client_ipaddr, platform, is_desktop, is_mobile, is_tablet, is_tv, is_bot, challenge, is_human_first, is_human_last, profile_id FROM sessions +WHERE client_ipaddr = ? AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetSessionByClientIP(ctx context.Context, clientIpaddr string) (Session, error) { + row := q.db.QueryRowContext(ctx, getSessionByClientIP, clientIpaddr) + var i Session + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.BrowserName, + &i.BrowserVersion, + &i.ClientIpaddr, + &i.Platform, + &i.IsDesktop, + &i.IsMobile, + &i.IsTablet, + &i.IsTv, + &i.IsBot, + &i.Challenge, + &i.IsHumanFirst, + &i.IsHumanLast, + &i.ProfileID, + ) + return i, err +} + +const getSessionByID = `-- name: GetSessionByID :one +SELECT id, created_at, updated_at, deleted_at, browser_name, browser_version, client_ipaddr, platform, is_desktop, is_mobile, is_tablet, is_tv, is_bot, challenge, is_human_first, is_human_last, profile_id FROM sessions +WHERE id = ? AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetSessionByID(ctx context.Context, id string) (Session, error) { + row := q.db.QueryRowContext(ctx, getSessionByID, id) + var i Session + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.BrowserName, + &i.BrowserVersion, + &i.ClientIpaddr, + &i.Platform, + &i.IsDesktop, + &i.IsMobile, + &i.IsTablet, + &i.IsTv, + &i.IsBot, + &i.Challenge, + &i.IsHumanFirst, + &i.IsHumanLast, + &i.ProfileID, + ) + return i, err +} + +const getVaultConfigByCID = `-- name: GetVaultConfigByCID :one +SELECT id, created_at, updated_at, deleted_at, handle, origin, address, cid, config, session_id, redirect_uri FROM vaults +WHERE cid = ? +AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetVaultConfigByCID(ctx context.Context, cid string) (Vault, error) { + row := q.db.QueryRowContext(ctx, getVaultConfigByCID, cid) + var i Vault + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Handle, + &i.Origin, + &i.Address, + &i.Cid, + &i.Config, + &i.SessionID, + &i.RedirectUri, + ) + return i, err +} + +const getVaultRedirectURIBySessionID = `-- name: GetVaultRedirectURIBySessionID :one +SELECT redirect_uri FROM vaults +WHERE session_id = ? +AND deleted_at IS NULL +LIMIT 1 +` + +func (q *Queries) GetVaultRedirectURIBySessionID(ctx context.Context, sessionID string) (string, error) { + row := q.db.QueryRowContext(ctx, getVaultRedirectURIBySessionID, sessionID) + var redirect_uri string + err := row.Scan(&redirect_uri) + return redirect_uri, err +} + +const insertCredential = `-- name: InsertCredential :one +INSERT INTO credentials ( + handle, + credential_id, + origin, + type, + transports +) VALUES (?, ?, ?, ?, ?) +RETURNING id, created_at, updated_at, deleted_at, handle, credential_id, authenticator_attachment, origin, type, transports +` + +type InsertCredentialParams struct { + Handle string `json:"handle"` + CredentialID string `json:"credential_id"` + Origin string `json:"origin"` + Type string `json:"type"` + Transports string `json:"transports"` +} + +func (q *Queries) InsertCredential(ctx context.Context, arg InsertCredentialParams) (Credential, error) { + row := q.db.QueryRowContext(ctx, insertCredential, + arg.Handle, + arg.CredentialID, + arg.Origin, + arg.Type, + arg.Transports, + ) + var i Credential + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Handle, + &i.CredentialID, + &i.AuthenticatorAttachment, + &i.Origin, + &i.Type, + &i.Transports, + ) + return i, err +} + +const insertProfile = `-- name: InsertProfile :one +INSERT INTO profiles ( + address, + handle, + origin, + name +) VALUES (?, ?, ?, ?) +RETURNING id, created_at, updated_at, deleted_at, address, handle, origin, name +` + +type InsertProfileParams struct { + Address string `json:"address"` + Handle string `json:"handle"` + Origin string `json:"origin"` + Name string `json:"name"` +} + +func (q *Queries) InsertProfile(ctx context.Context, arg InsertProfileParams) (Profile, error) { + row := q.db.QueryRowContext(ctx, insertProfile, + arg.Address, + arg.Handle, + arg.Origin, + arg.Name, + ) + var i Profile + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Address, + &i.Handle, + &i.Origin, + &i.Name, + ) + return i, err +} + +const softDeleteCredential = `-- name: SoftDeleteCredential :exec +UPDATE credentials +SET deleted_at = CURRENT_TIMESTAMP +WHERE credential_id = ? +` + +func (q *Queries) SoftDeleteCredential(ctx context.Context, credentialID string) error { + _, err := q.db.ExecContext(ctx, softDeleteCredential, credentialID) + return err +} + +const softDeleteProfile = `-- name: SoftDeleteProfile :exec +UPDATE profiles +SET deleted_at = CURRENT_TIMESTAMP +WHERE address = ? +` + +func (q *Queries) SoftDeleteProfile(ctx context.Context, address string) error { + _, err := q.db.ExecContext(ctx, softDeleteProfile, address) + return err +} + +const updateProfile = `-- name: UpdateProfile :one +UPDATE profiles +SET + name = ?, + handle = ?, + updated_at = CURRENT_TIMESTAMP +WHERE address = ? +AND deleted_at IS NULL +RETURNING id, created_at, updated_at, deleted_at, address, handle, origin, name +` + +type UpdateProfileParams struct { + Name string `json:"name"` + Handle string `json:"handle"` + Address string `json:"address"` +} + +func (q *Queries) UpdateProfile(ctx context.Context, arg UpdateProfileParams) (Profile, error) { + row := q.db.QueryRowContext(ctx, updateProfile, arg.Name, arg.Handle, arg.Address) + var i Profile + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.Address, + &i.Handle, + &i.Origin, + &i.Name, + ) + return i, err +} + +const updateSessionHumanVerification = `-- name: UpdateSessionHumanVerification :one +UPDATE sessions +SET + is_human_first = ?, + is_human_last = ?, + updated_at = CURRENT_TIMESTAMP +WHERE id = ? +RETURNING id, created_at, updated_at, deleted_at, browser_name, browser_version, client_ipaddr, platform, is_desktop, is_mobile, is_tablet, is_tv, is_bot, challenge, is_human_first, is_human_last, profile_id +` + +type UpdateSessionHumanVerificationParams struct { + IsHumanFirst bool `json:"is_human_first"` + IsHumanLast bool `json:"is_human_last"` + ID string `json:"id"` +} + +func (q *Queries) UpdateSessionHumanVerification(ctx context.Context, arg UpdateSessionHumanVerificationParams) (Session, error) { + row := q.db.QueryRowContext(ctx, updateSessionHumanVerification, arg.IsHumanFirst, arg.IsHumanLast, arg.ID) + var i Session + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.BrowserName, + &i.BrowserVersion, + &i.ClientIpaddr, + &i.Platform, + &i.IsDesktop, + &i.IsMobile, + &i.IsTablet, + &i.IsTv, + &i.IsBot, + &i.Challenge, + &i.IsHumanFirst, + &i.IsHumanLast, + &i.ProfileID, + ) + return i, err +} + +const updateSessionWithProfileID = `-- name: UpdateSessionWithProfileID :one +UPDATE sessions +SET + profile_id = ?, + updated_at = CURRENT_TIMESTAMP +WHERE id = ? +RETURNING id, created_at, updated_at, deleted_at, browser_name, browser_version, client_ipaddr, platform, is_desktop, is_mobile, is_tablet, is_tv, is_bot, challenge, is_human_first, is_human_last, profile_id +` + +type UpdateSessionWithProfileIDParams struct { + ProfileID int64 `json:"profile_id"` + ID string `json:"id"` +} + +func (q *Queries) UpdateSessionWithProfileID(ctx context.Context, arg UpdateSessionWithProfileIDParams) (Session, error) { + row := q.db.QueryRowContext(ctx, updateSessionWithProfileID, arg.ProfileID, arg.ID) + var i Session + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.DeletedAt, + &i.BrowserName, + &i.BrowserVersion, + &i.ClientIpaddr, + &i.Platform, + &i.IsDesktop, + &i.IsMobile, + &i.IsTablet, + &i.IsTv, + &i.IsBot, + &i.Challenge, + &i.IsHumanFirst, + &i.IsHumanLast, + &i.ProfileID, + ) + return i, err +} diff --git a/embed/codec.go b/pkg/spawn/codec.go similarity index 96% rename from embed/codec.go rename to pkg/spawn/codec.go index 839bd0f..839f880 100644 --- a/embed/codec.go +++ b/pkg/spawn/codec.go @@ -4,7 +4,7 @@ import ( "encoding/json" "github.com/ipfs/boxo/files" - "github.com/onsonr/sonr/internal/config/motr" + motr "github.com/onsonr/motr/internal/config" ) const SchemaVersion = 1 diff --git a/embed/index.html b/pkg/spawn/index.html similarity index 100% rename from embed/index.html rename to pkg/spawn/index.html diff --git a/embed/main.js b/pkg/spawn/main.js similarity index 100% rename from embed/main.js rename to pkg/spawn/main.js diff --git a/embed/sw.js b/pkg/spawn/sw.js similarity index 100% rename from embed/sw.js rename to pkg/spawn/sw.js diff --git a/embed/utils.go b/pkg/spawn/utils.go similarity index 100% rename from embed/utils.go rename to pkg/spawn/utils.go diff --git a/embed/webworker.go b/pkg/spawn/webworker.go similarity index 100% rename from embed/webworker.go rename to pkg/spawn/webworker.go