From 61891d891a9bfe4adaa7d586563c30b687327172 Mon Sep 17 00:00:00 2001 From: DevMiner Date: Tue, 20 Aug 2024 22:43:26 +0200 Subject: [PATCH] refactor!: working WD-4 user discovery --- .dockerignore | 8 + .env | 21 +- .gitignore | 7 +- Dockerfile | 24 + compose.yml | 68 +- config/config.go | 45 +- ent/client.go | 446 ++- ent/ent.go | 14 +- ent/hook/hook.go | 24 +- ent/image/image.go | 5 + ent/image_create.go | 5 + ent/image_update.go | 26 + ent/instancemetadata.go | 429 +++ ent/instancemetadata/instancemetadata.go | 332 ++ ent/instancemetadata/where.go | 1396 +++++++ ent/instancemetadata_create.go | 1971 ++++++++++ ent/instancemetadata_delete.go | 88 + ent/instancemetadata_query.go | 845 +++++ ent/instancemetadata_update.go | 1626 ++++++++ ent/internal/schema.go | 2 +- ent/migrate/schema.go | 168 +- ent/mutation.go | 3314 ++++++++++++----- ent/predicate/predicate.go | 6 +- ent/runtime.go | 141 +- ent/schema/attachment.go | 16 +- ent/schema/follow.go | 4 +- ent/schema/image.go | 2 +- ent/schema/instance_metadata.go | 71 + ent/schema/server_metadata.go | 43 - ent/schema/user.go | 33 +- ent/servermetadata.go | 275 -- ent/servermetadata/servermetadata.go | 185 - ent/servermetadata/where.go | 513 --- ent/servermetadata_create.go | 1035 ----- ent/servermetadata_delete.go | 88 - ent/servermetadata_query.go | 688 ---- ent/servermetadata_update.go | 704 ---- ent/tx.go | 6 +- ent/user.go | 79 +- ent/user/user.go | 109 + ent/user/where.go | 312 +- ent/user_create.go | 221 +- ent/user_query.go | 353 +- ent/user_update.go | 572 ++- internal/api_schema/errors.go | 1 + internal/api_schema/users.go | 10 +- internal/entity/server_metadata.go | 96 + internal/entity/user.go | 88 +- internal/handlers/meta_handler/handler.go | 13 +- .../lysand_instance_metadata_get.go | 14 + .../lysand_server_metadata_get.go | 28 - .../handlers/user_handler/app_user_search.go | 51 + internal/handlers/user_handler/handler.go | 15 +- .../handlers/user_handler/lysand_user_get.go | 2 +- .../user_handler/wellknown_webfinger.go | 10 +- .../repo_impls/follow_repository_impl.go | 10 +- .../instance_metadata_repository_impl.go | 62 + internal/repository/repo_impls/manager.go | 54 +- .../repo_impls/note_repository_impl.go | 6 +- .../repo_impls/user_repository_impl.go | 160 +- internal/repository/repository.go | 9 + internal/service/service.go | 14 + .../service/svc_impls/Inbox_service_impl.go | 22 +- .../svc_impls/federation_service_impl.go | 158 +- .../service/svc_impls/follow_service_impl.go | 6 +- .../instance_metadata_service_impl.go | 52 + .../service/svc_impls/note_service_impl.go | 6 +- .../service/svc_impls/request_signer_impl.go | 63 + .../service/svc_impls/task_service_impl.go | 2 +- .../service/svc_impls/user_service_impl.go | 32 +- internal/tasks/federate_note.go | 4 + internal/utils/fiber.go | 32 + internal/utils/urls.go | 20 + .../val_impls/body_validator_impl.go | 83 +- .../val_impls/request_validator_impl.go | 39 +- main.go | 140 +- pkg/lysand/actor_user.go | 75 +- pkg/lysand/crypto.go | 51 - pkg/lysand/crypto/keys.go | 23 + pkg/lysand/crypto/sha256.go | 9 + pkg/lysand/crypto/verify.go | 29 + pkg/lysand/federation_client.go | 46 +- pkg/lysand/federation_headers.go | 19 +- pkg/lysand/instance_metadata.go | 111 + pkg/lysand/server_metadata.go | 64 - pkg/lysand/signature_data.go | 22 +- pkg/lysand/spki_public_key.go | 99 +- pkg/lysand/spki_public_key_test.go | 8 +- pkg/protoretry/client.go | 62 + pkg/taskqueue/client.go | 38 +- pkg/webfinger/webfinger.go | 52 +- 91 files changed, 12768 insertions(+), 5562 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 ent/instancemetadata.go create mode 100644 ent/instancemetadata/instancemetadata.go create mode 100644 ent/instancemetadata/where.go create mode 100644 ent/instancemetadata_create.go create mode 100644 ent/instancemetadata_delete.go create mode 100644 ent/instancemetadata_query.go create mode 100644 ent/instancemetadata_update.go create mode 100644 ent/schema/instance_metadata.go delete mode 100644 ent/schema/server_metadata.go delete mode 100644 ent/servermetadata.go delete mode 100644 ent/servermetadata/servermetadata.go delete mode 100644 ent/servermetadata/where.go delete mode 100644 ent/servermetadata_create.go delete mode 100644 ent/servermetadata_delete.go delete mode 100644 ent/servermetadata_query.go delete mode 100644 ent/servermetadata_update.go create mode 100644 internal/entity/server_metadata.go create mode 100644 internal/handlers/meta_handler/lysand_instance_metadata_get.go delete mode 100644 internal/handlers/meta_handler/lysand_server_metadata_get.go create mode 100644 internal/handlers/user_handler/app_user_search.go create mode 100644 internal/repository/repo_impls/instance_metadata_repository_impl.go create mode 100644 internal/service/svc_impls/instance_metadata_service_impl.go create mode 100644 internal/service/svc_impls/request_signer_impl.go create mode 100644 internal/utils/fiber.go create mode 100644 pkg/lysand/crypto/keys.go create mode 100644 pkg/lysand/crypto/sha256.go create mode 100644 pkg/lysand/crypto/verify.go create mode 100644 pkg/lysand/instance_metadata.go delete mode 100644 pkg/lysand/server_metadata.go create mode 100644 pkg/protoretry/client.go diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..22b4f12 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +*.pem +*.db +.env* +node_modules +compose.yml +Dockerfile +.dockerignore +.gitignore diff --git a/.env b/.env index ba031b0..89d45e7 100644 --- a/.env +++ b/.env @@ -1,14 +1,17 @@ -PUBLIC_ADDRESS="https://localhost" -INSTANCE_NAME="lysand-test" -INSTANCE_DESCRIPTION="Versia-Go Instance" +PORT=8443 -NATS_URI="nats://localhost:4222" +PUBLIC_ADDRESS=https://localhost +INSTANCE_NAME=lysand-test +INSTANCE_DESCRIPTION=Versia-Go Instance + +NATS_URI=nats://localhost:4222 +NATS_STREAM_NAME=versia-go # SQLite -DATABASE_URI="file:./versia-go.db?cache=shared&_fk=1" +DATABASE_URI=file:./versia-go.db?cache=shared&_fk=1 # PostgreSQL -# DATABASE_URI="postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable" +# DATABASE_URI=postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable -ENVIRONMENT="development" -OTLP_ENDPOINT="" -SENTRY_DSN="" +ENVIRONMENT=development +OTLP_ENDPOINT= +SENTRY_DSN= diff --git a/.gitignore b/.gitignore index 315f358..7ccda23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -cert.pem -key.pem +*.pem +*.crt *.db -.env.* \ No newline at end of file +.env.* +node_modules diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..81e3c18 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM golang:1.23-alpine AS builder +WORKDIR /build + +COPY ./go.mod . +COPY ./go.sum . +RUN go mod download + +COPY . . +RUN CGO_ENABLED=0 go build -o /build/versia-go + +FROM alpine:3 AS runner +WORKDIR /app + +RUN apk add curl --no-cache + +# Copy over some sources to get Sentry's source mapping working in Go +# https://docs.sentry.io/platforms/go/troubleshooting/#missing-stack-trace +COPY ./pkg /app/pkg +COPY ./internal /app/internal +COPY ./ent app/ent + +COPY --from=builder /build/versia-go /usr/local/bin/versia-go + +ENTRYPOINT [ "/usr/local/bin/versia-go" ] \ No newline at end of file diff --git a/compose.yml b/compose.yml index dab5c99..a4696d7 100644 --- a/compose.yml +++ b/compose.yml @@ -1,12 +1,18 @@ +x-versia: &versia-default + build: . + env_file: [ .env, .env.local ] + depends_on: + - nats + services: - db: - image: postgres:16.2-alpine - environment: - POSTGRES_DB: postgres - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - ports: - - "5432:5432" + # db: + # image: postgres:16.2-alpine + # environment: + # POSTGRES_DB: postgres + # POSTGRES_USER: postgres + # POSTGRES_PASSWORD: postgres + # ports: + # - "5432:5432" nats: image: nats:2.9.25-scratch @@ -14,3 +20,49 @@ services: - "4222:4222" - "8222:8222" command: "--js" + + versia-1: + <<: *versia-default + hostname: lysand-test.i.devminer.xyz + volumes: + - /etc/ssl/certs:/etc/ssl/certs:ro + - /etc/ca-certificates/extracted:/etc/ca-certificates/extracted + - type: bind + source: ./key.pem + target: /app/key.pem + - type: bind + source: ./cert.pem + target: /app/cert.pem + - type: bind + source: ./1.db + target: /app/test.db + environment: + PORT: 8443 + NATS_URI: nats://nats:4222 + PUBLIC_ADDRESS: https://lysand-test.i.devminer.xyz:8443 + NATS_STREAM_NAME: versia-go-1 + ports: + - "8443:8443" + + versia-2: + <<: *versia-default + hostname: lysand-test-2.i.devminer.xyz + volumes: + - /etc/ssl/certs:/etc/ssl/certs:ro + - /etc/ca-certificates/extracted:/etc/ca-certificates/extracted + - type: bind + source: ./key2.pem + target: /app/key.pem + - type: bind + source: ./cert2.pem + target: /app/cert.pem + - type: bind + source: ./2.db + target: /app/test.db + environment: + PORT: 8444 + NATS_URI: nats://nats:4222 + PUBLIC_ADDRESS: https://lysand-test-2.i.devminer.xyz:8444 + NATS_STREAM_NAME: versia-go-2 + ports: + - "8444:8444" diff --git a/config/config.go b/config/config.go index 00d9f83..5836d3e 100644 --- a/config/config.go +++ b/config/config.go @@ -3,6 +3,7 @@ package config import ( "net/url" "os" + "strconv" "git.devminer.xyz/devminer/unitel" "github.com/joho/godotenv" @@ -10,11 +11,18 @@ import ( ) type Config struct { - PublicAddress *url.URL + Port int + + PublicAddress *url.URL + Host string + SharedInboxURL *url.URL + InstanceName string InstanceDescription *string - NATSURI string + NATSURI string + NATSStreamName string + DatabaseURI string Telemetry unitel.Opts @@ -33,12 +41,18 @@ func Load() { } C = Config{ - PublicAddress: publicAddress, + Port: getEnvInt("PORT", 80), + + PublicAddress: publicAddress, + Host: publicAddress.Host, + SharedInboxURL: publicAddress.ResolveReference(&url.URL{Path: "/api/inbox"}), + InstanceName: os.Getenv("INSTANCE_NAME"), InstanceDescription: optionalEnvStr("INSTANCE_DESCRIPTION"), - NATSURI: os.Getenv("NATS_URI"), - DatabaseURI: os.Getenv("DATABASE_URI"), + NATSURI: os.Getenv("NATS_URI"), + NATSStreamName: getEnvStr("NATS_STREAM_NAME", "versia-go"), + DatabaseURI: os.Getenv("DATABASE_URI"), Telemetry: unitel.ParseOpts("versia-go"), } @@ -53,3 +67,24 @@ func optionalEnvStr(key string) *string { } return &value } + +func getEnvStr(key, default_ string) string { + if value, ok := os.LookupEnv(key); ok { + return value + } + + return default_ +} + +func getEnvInt(key string, default_ int) int { + if value, ok := os.LookupEnv(key); ok { + parsed, err := strconv.Atoi(value) + if err != nil { + panic(err) + } + + return parsed + } + + return default_ +} diff --git a/ent/client.go b/ent/client.go index 7e546e7..692b7f1 100644 --- a/ent/client.go +++ b/ent/client.go @@ -19,8 +19,8 @@ import ( "github.com/lysand-org/versia-go/ent/attachment" "github.com/lysand-org/versia-go/ent/follow" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" - "github.com/lysand-org/versia-go/ent/servermetadata" "github.com/lysand-org/versia-go/ent/user" ) @@ -35,10 +35,10 @@ type Client struct { Follow *FollowClient // Image is the client for interacting with the Image builders. Image *ImageClient + // InstanceMetadata is the client for interacting with the InstanceMetadata builders. + InstanceMetadata *InstanceMetadataClient // Note is the client for interacting with the Note builders. Note *NoteClient - // ServerMetadata is the client for interacting with the ServerMetadata builders. - ServerMetadata *ServerMetadataClient // User is the client for interacting with the User builders. User *UserClient } @@ -55,8 +55,8 @@ func (c *Client) init() { c.Attachment = NewAttachmentClient(c.config) c.Follow = NewFollowClient(c.config) c.Image = NewImageClient(c.config) + c.InstanceMetadata = NewInstanceMetadataClient(c.config) c.Note = NewNoteClient(c.config) - c.ServerMetadata = NewServerMetadataClient(c.config) c.User = NewUserClient(c.config) } @@ -148,14 +148,14 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) { cfg := c.config cfg.driver = tx return &Tx{ - ctx: ctx, - config: cfg, - Attachment: NewAttachmentClient(cfg), - Follow: NewFollowClient(cfg), - Image: NewImageClient(cfg), - Note: NewNoteClient(cfg), - ServerMetadata: NewServerMetadataClient(cfg), - User: NewUserClient(cfg), + ctx: ctx, + config: cfg, + Attachment: NewAttachmentClient(cfg), + Follow: NewFollowClient(cfg), + Image: NewImageClient(cfg), + InstanceMetadata: NewInstanceMetadataClient(cfg), + Note: NewNoteClient(cfg), + User: NewUserClient(cfg), }, nil } @@ -173,14 +173,14 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) cfg := c.config cfg.driver = &txDriver{tx: tx, drv: c.driver} return &Tx{ - ctx: ctx, - config: cfg, - Attachment: NewAttachmentClient(cfg), - Follow: NewFollowClient(cfg), - Image: NewImageClient(cfg), - Note: NewNoteClient(cfg), - ServerMetadata: NewServerMetadataClient(cfg), - User: NewUserClient(cfg), + ctx: ctx, + config: cfg, + Attachment: NewAttachmentClient(cfg), + Follow: NewFollowClient(cfg), + Image: NewImageClient(cfg), + InstanceMetadata: NewInstanceMetadataClient(cfg), + Note: NewNoteClient(cfg), + User: NewUserClient(cfg), }, nil } @@ -210,7 +210,7 @@ func (c *Client) Close() error { // In order to add hooks to a specific client, call: `client.Node.Use(...)`. func (c *Client) Use(hooks ...Hook) { for _, n := range []interface{ Use(...Hook) }{ - c.Attachment, c.Follow, c.Image, c.Note, c.ServerMetadata, c.User, + c.Attachment, c.Follow, c.Image, c.InstanceMetadata, c.Note, c.User, } { n.Use(hooks...) } @@ -220,7 +220,7 @@ func (c *Client) Use(hooks ...Hook) { // In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`. func (c *Client) Intercept(interceptors ...Interceptor) { for _, n := range []interface{ Intercept(...Interceptor) }{ - c.Attachment, c.Follow, c.Image, c.Note, c.ServerMetadata, c.User, + c.Attachment, c.Follow, c.Image, c.InstanceMetadata, c.Note, c.User, } { n.Intercept(interceptors...) } @@ -235,10 +235,10 @@ func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) { return c.Follow.mutate(ctx, m) case *ImageMutation: return c.Image.mutate(ctx, m) + case *InstanceMetadataMutation: + return c.InstanceMetadata.mutate(ctx, m) case *NoteMutation: return c.Note.mutate(ctx, m) - case *ServerMetadataMutation: - return c.ServerMetadata.mutate(ctx, m) case *UserMutation: return c.User.mutate(ctx, m) default: @@ -693,6 +693,187 @@ func (c *ImageClient) mutate(ctx context.Context, m *ImageMutation) (Value, erro } } +// InstanceMetadataClient is a client for the InstanceMetadata schema. +type InstanceMetadataClient struct { + config +} + +// NewInstanceMetadataClient returns a client for the InstanceMetadata from the given config. +func NewInstanceMetadataClient(c config) *InstanceMetadataClient { + return &InstanceMetadataClient{config: c} +} + +// Use adds a list of mutation hooks to the hooks stack. +// A call to `Use(f, g, h)` equals to `instancemetadata.Hooks(f(g(h())))`. +func (c *InstanceMetadataClient) Use(hooks ...Hook) { + c.hooks.InstanceMetadata = append(c.hooks.InstanceMetadata, hooks...) +} + +// Intercept adds a list of query interceptors to the interceptors stack. +// A call to `Intercept(f, g, h)` equals to `instancemetadata.Intercept(f(g(h())))`. +func (c *InstanceMetadataClient) Intercept(interceptors ...Interceptor) { + c.inters.InstanceMetadata = append(c.inters.InstanceMetadata, interceptors...) +} + +// Create returns a builder for creating a InstanceMetadata entity. +func (c *InstanceMetadataClient) Create() *InstanceMetadataCreate { + mutation := newInstanceMetadataMutation(c.config, OpCreate) + return &InstanceMetadataCreate{config: c.config, hooks: c.Hooks(), mutation: mutation} +} + +// CreateBulk returns a builder for creating a bulk of InstanceMetadata entities. +func (c *InstanceMetadataClient) CreateBulk(builders ...*InstanceMetadataCreate) *InstanceMetadataCreateBulk { + return &InstanceMetadataCreateBulk{config: c.config, builders: builders} +} + +// MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates +// a builder and applies setFunc on it. +func (c *InstanceMetadataClient) MapCreateBulk(slice any, setFunc func(*InstanceMetadataCreate, int)) *InstanceMetadataCreateBulk { + rv := reflect.ValueOf(slice) + if rv.Kind() != reflect.Slice { + return &InstanceMetadataCreateBulk{err: fmt.Errorf("calling to InstanceMetadataClient.MapCreateBulk with wrong type %T, need slice", slice)} + } + builders := make([]*InstanceMetadataCreate, rv.Len()) + for i := 0; i < rv.Len(); i++ { + builders[i] = c.Create() + setFunc(builders[i], i) + } + return &InstanceMetadataCreateBulk{config: c.config, builders: builders} +} + +// Update returns an update builder for InstanceMetadata. +func (c *InstanceMetadataClient) Update() *InstanceMetadataUpdate { + mutation := newInstanceMetadataMutation(c.config, OpUpdate) + return &InstanceMetadataUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation} +} + +// UpdateOne returns an update builder for the given entity. +func (c *InstanceMetadataClient) UpdateOne(im *InstanceMetadata) *InstanceMetadataUpdateOne { + mutation := newInstanceMetadataMutation(c.config, OpUpdateOne, withInstanceMetadata(im)) + return &InstanceMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} +} + +// UpdateOneID returns an update builder for the given id. +func (c *InstanceMetadataClient) UpdateOneID(id uuid.UUID) *InstanceMetadataUpdateOne { + mutation := newInstanceMetadataMutation(c.config, OpUpdateOne, withInstanceMetadataID(id)) + return &InstanceMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} +} + +// Delete returns a delete builder for InstanceMetadata. +func (c *InstanceMetadataClient) Delete() *InstanceMetadataDelete { + mutation := newInstanceMetadataMutation(c.config, OpDelete) + return &InstanceMetadataDelete{config: c.config, hooks: c.Hooks(), mutation: mutation} +} + +// DeleteOne returns a builder for deleting the given entity. +func (c *InstanceMetadataClient) DeleteOne(im *InstanceMetadata) *InstanceMetadataDeleteOne { + return c.DeleteOneID(im.ID) +} + +// DeleteOneID returns a builder for deleting the given entity by its id. +func (c *InstanceMetadataClient) DeleteOneID(id uuid.UUID) *InstanceMetadataDeleteOne { + builder := c.Delete().Where(instancemetadata.ID(id)) + builder.mutation.id = &id + builder.mutation.op = OpDeleteOne + return &InstanceMetadataDeleteOne{builder} +} + +// Query returns a query builder for InstanceMetadata. +func (c *InstanceMetadataClient) Query() *InstanceMetadataQuery { + return &InstanceMetadataQuery{ + config: c.config, + ctx: &QueryContext{Type: TypeInstanceMetadata}, + inters: c.Interceptors(), + } +} + +// Get returns a InstanceMetadata entity by its id. +func (c *InstanceMetadataClient) Get(ctx context.Context, id uuid.UUID) (*InstanceMetadata, error) { + return c.Query().Where(instancemetadata.ID(id)).Only(ctx) +} + +// GetX is like Get, but panics if an error occurs. +func (c *InstanceMetadataClient) GetX(ctx context.Context, id uuid.UUID) *InstanceMetadata { + obj, err := c.Get(ctx, id) + if err != nil { + panic(err) + } + return obj +} + +// QueryUsers queries the users edge of a InstanceMetadata. +func (c *InstanceMetadataClient) QueryUsers(im *InstanceMetadata) *UserQuery { + query := (&UserClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := im.ID + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, id), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.UsersTable, instancemetadata.UsersPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(im.driver.Dialect(), step) + return fromV, nil + } + return query +} + +// QueryModerators queries the moderators edge of a InstanceMetadata. +func (c *InstanceMetadataClient) QueryModerators(im *InstanceMetadata) *UserQuery { + query := (&UserClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := im.ID + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, id), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.ModeratorsTable, instancemetadata.ModeratorsPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(im.driver.Dialect(), step) + return fromV, nil + } + return query +} + +// QueryAdmins queries the admins edge of a InstanceMetadata. +func (c *InstanceMetadataClient) QueryAdmins(im *InstanceMetadata) *UserQuery { + query := (&UserClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := im.ID + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, id), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.AdminsTable, instancemetadata.AdminsPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(im.driver.Dialect(), step) + return fromV, nil + } + return query +} + +// Hooks returns the client hooks. +func (c *InstanceMetadataClient) Hooks() []Hook { + return c.hooks.InstanceMetadata +} + +// Interceptors returns the client interceptors. +func (c *InstanceMetadataClient) Interceptors() []Interceptor { + return c.inters.InstanceMetadata +} + +func (c *InstanceMetadataClient) mutate(ctx context.Context, m *InstanceMetadataMutation) (Value, error) { + switch m.Op() { + case OpCreate: + return (&InstanceMetadataCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) + case OpUpdate: + return (&InstanceMetadataUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) + case OpUpdateOne: + return (&InstanceMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) + case OpDelete, OpDeleteOne: + return (&InstanceMetadataDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx) + default: + return nil, fmt.Errorf("ent: unknown InstanceMetadata mutation op: %q", m.Op()) + } +} + // NoteClient is a client for the Note schema. type NoteClient struct { config @@ -874,171 +1055,6 @@ func (c *NoteClient) mutate(ctx context.Context, m *NoteMutation) (Value, error) } } -// ServerMetadataClient is a client for the ServerMetadata schema. -type ServerMetadataClient struct { - config -} - -// NewServerMetadataClient returns a client for the ServerMetadata from the given config. -func NewServerMetadataClient(c config) *ServerMetadataClient { - return &ServerMetadataClient{config: c} -} - -// Use adds a list of mutation hooks to the hooks stack. -// A call to `Use(f, g, h)` equals to `servermetadata.Hooks(f(g(h())))`. -func (c *ServerMetadataClient) Use(hooks ...Hook) { - c.hooks.ServerMetadata = append(c.hooks.ServerMetadata, hooks...) -} - -// Intercept adds a list of query interceptors to the interceptors stack. -// A call to `Intercept(f, g, h)` equals to `servermetadata.Intercept(f(g(h())))`. -func (c *ServerMetadataClient) Intercept(interceptors ...Interceptor) { - c.inters.ServerMetadata = append(c.inters.ServerMetadata, interceptors...) -} - -// Create returns a builder for creating a ServerMetadata entity. -func (c *ServerMetadataClient) Create() *ServerMetadataCreate { - mutation := newServerMetadataMutation(c.config, OpCreate) - return &ServerMetadataCreate{config: c.config, hooks: c.Hooks(), mutation: mutation} -} - -// CreateBulk returns a builder for creating a bulk of ServerMetadata entities. -func (c *ServerMetadataClient) CreateBulk(builders ...*ServerMetadataCreate) *ServerMetadataCreateBulk { - return &ServerMetadataCreateBulk{config: c.config, builders: builders} -} - -// MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates -// a builder and applies setFunc on it. -func (c *ServerMetadataClient) MapCreateBulk(slice any, setFunc func(*ServerMetadataCreate, int)) *ServerMetadataCreateBulk { - rv := reflect.ValueOf(slice) - if rv.Kind() != reflect.Slice { - return &ServerMetadataCreateBulk{err: fmt.Errorf("calling to ServerMetadataClient.MapCreateBulk with wrong type %T, need slice", slice)} - } - builders := make([]*ServerMetadataCreate, rv.Len()) - for i := 0; i < rv.Len(); i++ { - builders[i] = c.Create() - setFunc(builders[i], i) - } - return &ServerMetadataCreateBulk{config: c.config, builders: builders} -} - -// Update returns an update builder for ServerMetadata. -func (c *ServerMetadataClient) Update() *ServerMetadataUpdate { - mutation := newServerMetadataMutation(c.config, OpUpdate) - return &ServerMetadataUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation} -} - -// UpdateOne returns an update builder for the given entity. -func (c *ServerMetadataClient) UpdateOne(sm *ServerMetadata) *ServerMetadataUpdateOne { - mutation := newServerMetadataMutation(c.config, OpUpdateOne, withServerMetadata(sm)) - return &ServerMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} -} - -// UpdateOneID returns an update builder for the given id. -func (c *ServerMetadataClient) UpdateOneID(id uuid.UUID) *ServerMetadataUpdateOne { - mutation := newServerMetadataMutation(c.config, OpUpdateOne, withServerMetadataID(id)) - return &ServerMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} -} - -// Delete returns a delete builder for ServerMetadata. -func (c *ServerMetadataClient) Delete() *ServerMetadataDelete { - mutation := newServerMetadataMutation(c.config, OpDelete) - return &ServerMetadataDelete{config: c.config, hooks: c.Hooks(), mutation: mutation} -} - -// DeleteOne returns a builder for deleting the given entity. -func (c *ServerMetadataClient) DeleteOne(sm *ServerMetadata) *ServerMetadataDeleteOne { - return c.DeleteOneID(sm.ID) -} - -// DeleteOneID returns a builder for deleting the given entity by its id. -func (c *ServerMetadataClient) DeleteOneID(id uuid.UUID) *ServerMetadataDeleteOne { - builder := c.Delete().Where(servermetadata.ID(id)) - builder.mutation.id = &id - builder.mutation.op = OpDeleteOne - return &ServerMetadataDeleteOne{builder} -} - -// Query returns a query builder for ServerMetadata. -func (c *ServerMetadataClient) Query() *ServerMetadataQuery { - return &ServerMetadataQuery{ - config: c.config, - ctx: &QueryContext{Type: TypeServerMetadata}, - inters: c.Interceptors(), - } -} - -// Get returns a ServerMetadata entity by its id. -func (c *ServerMetadataClient) Get(ctx context.Context, id uuid.UUID) (*ServerMetadata, error) { - return c.Query().Where(servermetadata.ID(id)).Only(ctx) -} - -// GetX is like Get, but panics if an error occurs. -func (c *ServerMetadataClient) GetX(ctx context.Context, id uuid.UUID) *ServerMetadata { - obj, err := c.Get(ctx, id) - if err != nil { - panic(err) - } - return obj -} - -// QueryFollower queries the follower edge of a ServerMetadata. -func (c *ServerMetadataClient) QueryFollower(sm *ServerMetadata) *UserQuery { - query := (&UserClient{config: c.config}).Query() - query.path = func(context.Context) (fromV *sql.Selector, _ error) { - id := sm.ID - step := sqlgraph.NewStep( - sqlgraph.From(servermetadata.Table, servermetadata.FieldID, id), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, servermetadata.FollowerTable, servermetadata.FollowerColumn), - ) - fromV = sqlgraph.Neighbors(sm.driver.Dialect(), step) - return fromV, nil - } - return query -} - -// QueryFollowee queries the followee edge of a ServerMetadata. -func (c *ServerMetadataClient) QueryFollowee(sm *ServerMetadata) *UserQuery { - query := (&UserClient{config: c.config}).Query() - query.path = func(context.Context) (fromV *sql.Selector, _ error) { - id := sm.ID - step := sqlgraph.NewStep( - sqlgraph.From(servermetadata.Table, servermetadata.FieldID, id), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, servermetadata.FolloweeTable, servermetadata.FolloweeColumn), - ) - fromV = sqlgraph.Neighbors(sm.driver.Dialect(), step) - return fromV, nil - } - return query -} - -// Hooks returns the client hooks. -func (c *ServerMetadataClient) Hooks() []Hook { - return c.hooks.ServerMetadata -} - -// Interceptors returns the client interceptors. -func (c *ServerMetadataClient) Interceptors() []Interceptor { - return c.inters.ServerMetadata -} - -func (c *ServerMetadataClient) mutate(ctx context.Context, m *ServerMetadataMutation) (Value, error) { - switch m.Op() { - case OpCreate: - return (&ServerMetadataCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) - case OpUpdate: - return (&ServerMetadataUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) - case OpUpdateOne: - return (&ServerMetadataUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) - case OpDelete, OpDeleteOne: - return (&ServerMetadataDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx) - default: - return nil, fmt.Errorf("ent: unknown ServerMetadata mutation op: %q", m.Op()) - } -} - // UserClient is a client for the User schema. type UserClient struct { config @@ -1211,6 +1227,54 @@ func (c *UserClient) QueryMentionedNotes(u *User) *NoteQuery { return query } +// QueryServers queries the servers edge of a User. +func (c *UserClient) QueryServers(u *User) *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := u.ID + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, id), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.ServersTable, user.ServersPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) + return fromV, nil + } + return query +} + +// QueryModeratedServers queries the moderatedServers edge of a User. +func (c *UserClient) QueryModeratedServers(u *User) *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := u.ID + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, id), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.ModeratedServersTable, user.ModeratedServersPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) + return fromV, nil + } + return query +} + +// QueryAdministeredServers queries the administeredServers edge of a User. +func (c *UserClient) QueryAdministeredServers(u *User) *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: c.config}).Query() + query.path = func(context.Context) (fromV *sql.Selector, _ error) { + id := u.ID + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, id), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.AdministeredServersTable, user.AdministeredServersPrimaryKey...), + ) + fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) + return fromV, nil + } + return query +} + // Hooks returns the client hooks. func (c *UserClient) Hooks() []Hook { return c.hooks.User @@ -1239,9 +1303,9 @@ func (c *UserClient) mutate(ctx context.Context, m *UserMutation) (Value, error) // hooks and interceptors per client, for fast access. type ( hooks struct { - Attachment, Follow, Image, Note, ServerMetadata, User []ent.Hook + Attachment, Follow, Image, InstanceMetadata, Note, User []ent.Hook } inters struct { - Attachment, Follow, Image, Note, ServerMetadata, User []ent.Interceptor + Attachment, Follow, Image, InstanceMetadata, Note, User []ent.Interceptor } ) diff --git a/ent/ent.go b/ent/ent.go index 50b840a..5cd0aad 100644 --- a/ent/ent.go +++ b/ent/ent.go @@ -15,8 +15,8 @@ import ( "github.com/lysand-org/versia-go/ent/attachment" "github.com/lysand-org/versia-go/ent/follow" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" - "github.com/lysand-org/versia-go/ent/servermetadata" "github.com/lysand-org/versia-go/ent/user" ) @@ -78,12 +78,12 @@ var ( func checkColumn(table, column string) error { initCheck.Do(func() { columnCheck = sql.NewColumnCheck(map[string]func(string) bool{ - attachment.Table: attachment.ValidColumn, - follow.Table: follow.ValidColumn, - image.Table: image.ValidColumn, - note.Table: note.ValidColumn, - servermetadata.Table: servermetadata.ValidColumn, - user.Table: user.ValidColumn, + attachment.Table: attachment.ValidColumn, + follow.Table: follow.ValidColumn, + image.Table: image.ValidColumn, + instancemetadata.Table: instancemetadata.ValidColumn, + note.Table: note.ValidColumn, + user.Table: user.ValidColumn, }) }) return columnCheck(table, column) diff --git a/ent/hook/hook.go b/ent/hook/hook.go index 5acd047..29f372c 100644 --- a/ent/hook/hook.go +++ b/ent/hook/hook.go @@ -45,6 +45,18 @@ func (f ImageFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ImageMutation", m) } +// The InstanceMetadataFunc type is an adapter to allow the use of ordinary +// function as InstanceMetadata mutator. +type InstanceMetadataFunc func(context.Context, *ent.InstanceMetadataMutation) (ent.Value, error) + +// Mutate calls f(ctx, m). +func (f InstanceMetadataFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) { + if mv, ok := m.(*ent.InstanceMetadataMutation); ok { + return f(ctx, mv) + } + return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.InstanceMetadataMutation", m) +} + // The NoteFunc type is an adapter to allow the use of ordinary // function as Note mutator. type NoteFunc func(context.Context, *ent.NoteMutation) (ent.Value, error) @@ -57,18 +69,6 @@ func (f NoteFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.NoteMutation", m) } -// The ServerMetadataFunc type is an adapter to allow the use of ordinary -// function as ServerMetadata mutator. -type ServerMetadataFunc func(context.Context, *ent.ServerMetadataMutation) (ent.Value, error) - -// Mutate calls f(ctx, m). -func (f ServerMetadataFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) { - if mv, ok := m.(*ent.ServerMetadataMutation); ok { - return f(ctx, mv) - } - return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ServerMetadataMutation", m) -} - // The UserFunc type is an adapter to allow the use of ordinary // function as User mutator. type UserFunc func(context.Context, *ent.UserMutation) (ent.Value, error) diff --git a/ent/image/image.go b/ent/image/image.go index fa328aa..c83cb2a 100644 --- a/ent/image/image.go +++ b/ent/image/image.go @@ -36,6 +36,11 @@ func ValidColumn(column string) bool { return false } +var ( + // URLValidator is a validator for the "url" field. It is called by the builders before save. + URLValidator func(string) error +) + // OrderOption defines the ordering options for the Image queries. type OrderOption func(*sql.Selector) diff --git a/ent/image_create.go b/ent/image_create.go index 729046e..0cdc40a 100644 --- a/ent/image_create.go +++ b/ent/image_create.go @@ -70,6 +70,11 @@ func (ic *ImageCreate) check() error { if _, ok := ic.mutation.URL(); !ok { return &ValidationError{Name: "url", err: errors.New(`ent: missing required field "Image.url"`)} } + if v, ok := ic.mutation.URL(); ok { + if err := image.URLValidator(v); err != nil { + return &ValidationError{Name: "url", err: fmt.Errorf(`ent: validator failed for field "Image.url": %w`, err)} + } + } if _, ok := ic.mutation.MimeType(); !ok { return &ValidationError{Name: "mimeType", err: errors.New(`ent: missing required field "Image.mimeType"`)} } diff --git a/ent/image_update.go b/ent/image_update.go index 85ed67d..1bdf3b1 100644 --- a/ent/image_update.go +++ b/ent/image_update.go @@ -87,7 +87,20 @@ func (iu *ImageUpdate) ExecX(ctx context.Context) { } } +// check runs all checks and user-defined validators on the builder. +func (iu *ImageUpdate) check() error { + if v, ok := iu.mutation.URL(); ok { + if err := image.URLValidator(v); err != nil { + return &ValidationError{Name: "url", err: fmt.Errorf(`ent: validator failed for field "Image.url": %w`, err)} + } + } + return nil +} + func (iu *ImageUpdate) sqlSave(ctx context.Context) (n int, err error) { + if err := iu.check(); err != nil { + return n, err + } _spec := sqlgraph.NewUpdateSpec(image.Table, image.Columns, sqlgraph.NewFieldSpec(image.FieldID, field.TypeInt)) if ps := iu.mutation.predicates; len(ps) > 0 { _spec.Predicate = func(selector *sql.Selector) { @@ -195,7 +208,20 @@ func (iuo *ImageUpdateOne) ExecX(ctx context.Context) { } } +// check runs all checks and user-defined validators on the builder. +func (iuo *ImageUpdateOne) check() error { + if v, ok := iuo.mutation.URL(); ok { + if err := image.URLValidator(v); err != nil { + return &ValidationError{Name: "url", err: fmt.Errorf(`ent: validator failed for field "Image.url": %w`, err)} + } + } + return nil +} + func (iuo *ImageUpdateOne) sqlSave(ctx context.Context) (_node *Image, err error) { + if err := iuo.check(); err != nil { + return _node, err + } _spec := sqlgraph.NewUpdateSpec(image.Table, image.Columns, sqlgraph.NewFieldSpec(image.FieldID, field.TypeInt)) id, ok := iuo.mutation.ID() if !ok { diff --git a/ent/instancemetadata.go b/ent/instancemetadata.go new file mode 100644 index 0000000..612436a --- /dev/null +++ b/ent/instancemetadata.go @@ -0,0 +1,429 @@ +// Code generated by ent, DO NOT EDIT. + +package ent + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "entgo.io/ent" + "entgo.io/ent/dialect/sql" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/pkg/lysand" +) + +// InstanceMetadata is the model entity for the InstanceMetadata schema. +type InstanceMetadata struct { + config `json:"-"` + // ID of the ent. + ID uuid.UUID `json:"id,omitempty"` + // IsRemote holds the value of the "isRemote" field. + IsRemote bool `json:"isRemote,omitempty"` + // URI holds the value of the "uri" field. + URI string `json:"uri,omitempty"` + // Extensions holds the value of the "extensions" field. + Extensions lysand.Extensions `json:"extensions,omitempty"` + // CreatedAt holds the value of the "created_at" field. + CreatedAt time.Time `json:"created_at,omitempty"` + // UpdatedAt holds the value of the "updated_at" field. + UpdatedAt time.Time `json:"updated_at,omitempty"` + // Name holds the value of the "name" field. + Name string `json:"name,omitempty"` + // Description holds the value of the "description" field. + Description *string `json:"description,omitempty"` + // Host holds the value of the "host" field. + Host string `json:"host,omitempty"` + // PublicKey holds the value of the "publicKey" field. + PublicKey []byte `json:"publicKey,omitempty"` + // PublicKeyAlgorithm holds the value of the "publicKeyAlgorithm" field. + PublicKeyAlgorithm string `json:"publicKeyAlgorithm,omitempty"` + // PrivateKey holds the value of the "privateKey" field. + PrivateKey []byte `json:"privateKey,omitempty"` + // SoftwareName holds the value of the "softwareName" field. + SoftwareName string `json:"softwareName,omitempty"` + // SoftwareVersion holds the value of the "softwareVersion" field. + SoftwareVersion string `json:"softwareVersion,omitempty"` + // SharedInboxURI holds the value of the "sharedInboxURI" field. + SharedInboxURI string `json:"sharedInboxURI,omitempty"` + // ModeratorsURI holds the value of the "moderatorsURI" field. + ModeratorsURI *string `json:"moderatorsURI,omitempty"` + // AdminsURI holds the value of the "adminsURI" field. + AdminsURI *string `json:"adminsURI,omitempty"` + // LogoEndpoint holds the value of the "logoEndpoint" field. + LogoEndpoint *string `json:"logoEndpoint,omitempty"` + // LogoMimeType holds the value of the "logoMimeType" field. + LogoMimeType *string `json:"logoMimeType,omitempty"` + // BannerEndpoint holds the value of the "bannerEndpoint" field. + BannerEndpoint *string `json:"bannerEndpoint,omitempty"` + // BannerMimeType holds the value of the "bannerMimeType" field. + BannerMimeType *string `json:"bannerMimeType,omitempty"` + // SupportedVersions holds the value of the "supportedVersions" field. + SupportedVersions []string `json:"supportedVersions,omitempty"` + // SupportedExtensions holds the value of the "supportedExtensions" field. + SupportedExtensions []string `json:"supportedExtensions,omitempty"` + // Edges holds the relations/edges for other nodes in the graph. + // The values are being populated by the InstanceMetadataQuery when eager-loading is set. + Edges InstanceMetadataEdges `json:"edges"` + selectValues sql.SelectValues +} + +// InstanceMetadataEdges holds the relations/edges for other nodes in the graph. +type InstanceMetadataEdges struct { + // Users holds the value of the users edge. + Users []*User `json:"users,omitempty"` + // Moderators holds the value of the moderators edge. + Moderators []*User `json:"moderators,omitempty"` + // Admins holds the value of the admins edge. + Admins []*User `json:"admins,omitempty"` + // loadedTypes holds the information for reporting if a + // type was loaded (or requested) in eager-loading or not. + loadedTypes [3]bool +} + +// UsersOrErr returns the Users value or an error if the edge +// was not loaded in eager-loading. +func (e InstanceMetadataEdges) UsersOrErr() ([]*User, error) { + if e.loadedTypes[0] { + return e.Users, nil + } + return nil, &NotLoadedError{edge: "users"} +} + +// ModeratorsOrErr returns the Moderators value or an error if the edge +// was not loaded in eager-loading. +func (e InstanceMetadataEdges) ModeratorsOrErr() ([]*User, error) { + if e.loadedTypes[1] { + return e.Moderators, nil + } + return nil, &NotLoadedError{edge: "moderators"} +} + +// AdminsOrErr returns the Admins value or an error if the edge +// was not loaded in eager-loading. +func (e InstanceMetadataEdges) AdminsOrErr() ([]*User, error) { + if e.loadedTypes[2] { + return e.Admins, nil + } + return nil, &NotLoadedError{edge: "admins"} +} + +// scanValues returns the types for scanning values from sql.Rows. +func (*InstanceMetadata) scanValues(columns []string) ([]any, error) { + values := make([]any, len(columns)) + for i := range columns { + switch columns[i] { + case instancemetadata.FieldExtensions, instancemetadata.FieldPublicKey, instancemetadata.FieldPrivateKey, instancemetadata.FieldSupportedVersions, instancemetadata.FieldSupportedExtensions: + values[i] = new([]byte) + case instancemetadata.FieldIsRemote: + values[i] = new(sql.NullBool) + case instancemetadata.FieldURI, instancemetadata.FieldName, instancemetadata.FieldDescription, instancemetadata.FieldHost, instancemetadata.FieldPublicKeyAlgorithm, instancemetadata.FieldSoftwareName, instancemetadata.FieldSoftwareVersion, instancemetadata.FieldSharedInboxURI, instancemetadata.FieldModeratorsURI, instancemetadata.FieldAdminsURI, instancemetadata.FieldLogoEndpoint, instancemetadata.FieldLogoMimeType, instancemetadata.FieldBannerEndpoint, instancemetadata.FieldBannerMimeType: + values[i] = new(sql.NullString) + case instancemetadata.FieldCreatedAt, instancemetadata.FieldUpdatedAt: + values[i] = new(sql.NullTime) + case instancemetadata.FieldID: + values[i] = new(uuid.UUID) + default: + values[i] = new(sql.UnknownType) + } + } + return values, nil +} + +// assignValues assigns the values that were returned from sql.Rows (after scanning) +// to the InstanceMetadata fields. +func (im *InstanceMetadata) assignValues(columns []string, values []any) error { + if m, n := len(values), len(columns); m < n { + return fmt.Errorf("mismatch number of scan values: %d != %d", m, n) + } + for i := range columns { + switch columns[i] { + case instancemetadata.FieldID: + if value, ok := values[i].(*uuid.UUID); !ok { + return fmt.Errorf("unexpected type %T for field id", values[i]) + } else if value != nil { + im.ID = *value + } + case instancemetadata.FieldIsRemote: + if value, ok := values[i].(*sql.NullBool); !ok { + return fmt.Errorf("unexpected type %T for field isRemote", values[i]) + } else if value.Valid { + im.IsRemote = value.Bool + } + case instancemetadata.FieldURI: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field uri", values[i]) + } else if value.Valid { + im.URI = value.String + } + case instancemetadata.FieldExtensions: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field extensions", values[i]) + } else if value != nil && len(*value) > 0 { + if err := json.Unmarshal(*value, &im.Extensions); err != nil { + return fmt.Errorf("unmarshal field extensions: %w", err) + } + } + case instancemetadata.FieldCreatedAt: + if value, ok := values[i].(*sql.NullTime); !ok { + return fmt.Errorf("unexpected type %T for field created_at", values[i]) + } else if value.Valid { + im.CreatedAt = value.Time + } + case instancemetadata.FieldUpdatedAt: + if value, ok := values[i].(*sql.NullTime); !ok { + return fmt.Errorf("unexpected type %T for field updated_at", values[i]) + } else if value.Valid { + im.UpdatedAt = value.Time + } + case instancemetadata.FieldName: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field name", values[i]) + } else if value.Valid { + im.Name = value.String + } + case instancemetadata.FieldDescription: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field description", values[i]) + } else if value.Valid { + im.Description = new(string) + *im.Description = value.String + } + case instancemetadata.FieldHost: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field host", values[i]) + } else if value.Valid { + im.Host = value.String + } + case instancemetadata.FieldPublicKey: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field publicKey", values[i]) + } else if value != nil { + im.PublicKey = *value + } + case instancemetadata.FieldPublicKeyAlgorithm: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field publicKeyAlgorithm", values[i]) + } else if value.Valid { + im.PublicKeyAlgorithm = value.String + } + case instancemetadata.FieldPrivateKey: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field privateKey", values[i]) + } else if value != nil { + im.PrivateKey = *value + } + case instancemetadata.FieldSoftwareName: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field softwareName", values[i]) + } else if value.Valid { + im.SoftwareName = value.String + } + case instancemetadata.FieldSoftwareVersion: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field softwareVersion", values[i]) + } else if value.Valid { + im.SoftwareVersion = value.String + } + case instancemetadata.FieldSharedInboxURI: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field sharedInboxURI", values[i]) + } else if value.Valid { + im.SharedInboxURI = value.String + } + case instancemetadata.FieldModeratorsURI: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field moderatorsURI", values[i]) + } else if value.Valid { + im.ModeratorsURI = new(string) + *im.ModeratorsURI = value.String + } + case instancemetadata.FieldAdminsURI: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field adminsURI", values[i]) + } else if value.Valid { + im.AdminsURI = new(string) + *im.AdminsURI = value.String + } + case instancemetadata.FieldLogoEndpoint: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field logoEndpoint", values[i]) + } else if value.Valid { + im.LogoEndpoint = new(string) + *im.LogoEndpoint = value.String + } + case instancemetadata.FieldLogoMimeType: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field logoMimeType", values[i]) + } else if value.Valid { + im.LogoMimeType = new(string) + *im.LogoMimeType = value.String + } + case instancemetadata.FieldBannerEndpoint: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field bannerEndpoint", values[i]) + } else if value.Valid { + im.BannerEndpoint = new(string) + *im.BannerEndpoint = value.String + } + case instancemetadata.FieldBannerMimeType: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field bannerMimeType", values[i]) + } else if value.Valid { + im.BannerMimeType = new(string) + *im.BannerMimeType = value.String + } + case instancemetadata.FieldSupportedVersions: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field supportedVersions", values[i]) + } else if value != nil && len(*value) > 0 { + if err := json.Unmarshal(*value, &im.SupportedVersions); err != nil { + return fmt.Errorf("unmarshal field supportedVersions: %w", err) + } + } + case instancemetadata.FieldSupportedExtensions: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field supportedExtensions", values[i]) + } else if value != nil && len(*value) > 0 { + if err := json.Unmarshal(*value, &im.SupportedExtensions); err != nil { + return fmt.Errorf("unmarshal field supportedExtensions: %w", err) + } + } + default: + im.selectValues.Set(columns[i], values[i]) + } + } + return nil +} + +// Value returns the ent.Value that was dynamically selected and assigned to the InstanceMetadata. +// This includes values selected through modifiers, order, etc. +func (im *InstanceMetadata) Value(name string) (ent.Value, error) { + return im.selectValues.Get(name) +} + +// QueryUsers queries the "users" edge of the InstanceMetadata entity. +func (im *InstanceMetadata) QueryUsers() *UserQuery { + return NewInstanceMetadataClient(im.config).QueryUsers(im) +} + +// QueryModerators queries the "moderators" edge of the InstanceMetadata entity. +func (im *InstanceMetadata) QueryModerators() *UserQuery { + return NewInstanceMetadataClient(im.config).QueryModerators(im) +} + +// QueryAdmins queries the "admins" edge of the InstanceMetadata entity. +func (im *InstanceMetadata) QueryAdmins() *UserQuery { + return NewInstanceMetadataClient(im.config).QueryAdmins(im) +} + +// Update returns a builder for updating this InstanceMetadata. +// Note that you need to call InstanceMetadata.Unwrap() before calling this method if this InstanceMetadata +// was returned from a transaction, and the transaction was committed or rolled back. +func (im *InstanceMetadata) Update() *InstanceMetadataUpdateOne { + return NewInstanceMetadataClient(im.config).UpdateOne(im) +} + +// Unwrap unwraps the InstanceMetadata entity that was returned from a transaction after it was closed, +// so that all future queries will be executed through the driver which created the transaction. +func (im *InstanceMetadata) Unwrap() *InstanceMetadata { + _tx, ok := im.config.driver.(*txDriver) + if !ok { + panic("ent: InstanceMetadata is not a transactional entity") + } + im.config.driver = _tx.drv + return im +} + +// String implements the fmt.Stringer. +func (im *InstanceMetadata) String() string { + var builder strings.Builder + builder.WriteString("InstanceMetadata(") + builder.WriteString(fmt.Sprintf("id=%v, ", im.ID)) + builder.WriteString("isRemote=") + builder.WriteString(fmt.Sprintf("%v", im.IsRemote)) + builder.WriteString(", ") + builder.WriteString("uri=") + builder.WriteString(im.URI) + builder.WriteString(", ") + builder.WriteString("extensions=") + builder.WriteString(fmt.Sprintf("%v", im.Extensions)) + builder.WriteString(", ") + builder.WriteString("created_at=") + builder.WriteString(im.CreatedAt.Format(time.ANSIC)) + builder.WriteString(", ") + builder.WriteString("updated_at=") + builder.WriteString(im.UpdatedAt.Format(time.ANSIC)) + builder.WriteString(", ") + builder.WriteString("name=") + builder.WriteString(im.Name) + builder.WriteString(", ") + if v := im.Description; v != nil { + builder.WriteString("description=") + builder.WriteString(*v) + } + builder.WriteString(", ") + builder.WriteString("host=") + builder.WriteString(im.Host) + builder.WriteString(", ") + builder.WriteString("publicKey=") + builder.WriteString(fmt.Sprintf("%v", im.PublicKey)) + builder.WriteString(", ") + builder.WriteString("publicKeyAlgorithm=") + builder.WriteString(im.PublicKeyAlgorithm) + builder.WriteString(", ") + builder.WriteString("privateKey=") + builder.WriteString(fmt.Sprintf("%v", im.PrivateKey)) + builder.WriteString(", ") + builder.WriteString("softwareName=") + builder.WriteString(im.SoftwareName) + builder.WriteString(", ") + builder.WriteString("softwareVersion=") + builder.WriteString(im.SoftwareVersion) + builder.WriteString(", ") + builder.WriteString("sharedInboxURI=") + builder.WriteString(im.SharedInboxURI) + builder.WriteString(", ") + if v := im.ModeratorsURI; v != nil { + builder.WriteString("moderatorsURI=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := im.AdminsURI; v != nil { + builder.WriteString("adminsURI=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := im.LogoEndpoint; v != nil { + builder.WriteString("logoEndpoint=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := im.LogoMimeType; v != nil { + builder.WriteString("logoMimeType=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := im.BannerEndpoint; v != nil { + builder.WriteString("bannerEndpoint=") + builder.WriteString(*v) + } + builder.WriteString(", ") + if v := im.BannerMimeType; v != nil { + builder.WriteString("bannerMimeType=") + builder.WriteString(*v) + } + builder.WriteString(", ") + builder.WriteString("supportedVersions=") + builder.WriteString(fmt.Sprintf("%v", im.SupportedVersions)) + builder.WriteString(", ") + builder.WriteString("supportedExtensions=") + builder.WriteString(fmt.Sprintf("%v", im.SupportedExtensions)) + builder.WriteByte(')') + return builder.String() +} + +// InstanceMetadataSlice is a parsable slice of InstanceMetadata. +type InstanceMetadataSlice []*InstanceMetadata diff --git a/ent/instancemetadata/instancemetadata.go b/ent/instancemetadata/instancemetadata.go new file mode 100644 index 0000000..d8db7eb --- /dev/null +++ b/ent/instancemetadata/instancemetadata.go @@ -0,0 +1,332 @@ +// Code generated by ent, DO NOT EDIT. + +package instancemetadata + +import ( + "time" + + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/pkg/lysand" +) + +const ( + // Label holds the string label denoting the instancemetadata type in the database. + Label = "instance_metadata" + // FieldID holds the string denoting the id field in the database. + FieldID = "id" + // FieldIsRemote holds the string denoting the isremote field in the database. + FieldIsRemote = "is_remote" + // FieldURI holds the string denoting the uri field in the database. + FieldURI = "uri" + // FieldExtensions holds the string denoting the extensions field in the database. + FieldExtensions = "extensions" + // FieldCreatedAt holds the string denoting the created_at field in the database. + FieldCreatedAt = "created_at" + // FieldUpdatedAt holds the string denoting the updated_at field in the database. + FieldUpdatedAt = "updated_at" + // FieldName holds the string denoting the name field in the database. + FieldName = "name" + // FieldDescription holds the string denoting the description field in the database. + FieldDescription = "description" + // FieldHost holds the string denoting the host field in the database. + FieldHost = "host" + // FieldPublicKey holds the string denoting the publickey field in the database. + FieldPublicKey = "public_key" + // FieldPublicKeyAlgorithm holds the string denoting the publickeyalgorithm field in the database. + FieldPublicKeyAlgorithm = "public_key_algorithm" + // FieldPrivateKey holds the string denoting the privatekey field in the database. + FieldPrivateKey = "private_key" + // FieldSoftwareName holds the string denoting the softwarename field in the database. + FieldSoftwareName = "software_name" + // FieldSoftwareVersion holds the string denoting the softwareversion field in the database. + FieldSoftwareVersion = "software_version" + // FieldSharedInboxURI holds the string denoting the sharedinboxuri field in the database. + FieldSharedInboxURI = "shared_inbox_uri" + // FieldModeratorsURI holds the string denoting the moderatorsuri field in the database. + FieldModeratorsURI = "moderators_uri" + // FieldAdminsURI holds the string denoting the adminsuri field in the database. + FieldAdminsURI = "admins_uri" + // FieldLogoEndpoint holds the string denoting the logoendpoint field in the database. + FieldLogoEndpoint = "logo_endpoint" + // FieldLogoMimeType holds the string denoting the logomimetype field in the database. + FieldLogoMimeType = "logo_mime_type" + // FieldBannerEndpoint holds the string denoting the bannerendpoint field in the database. + FieldBannerEndpoint = "banner_endpoint" + // FieldBannerMimeType holds the string denoting the bannermimetype field in the database. + FieldBannerMimeType = "banner_mime_type" + // FieldSupportedVersions holds the string denoting the supportedversions field in the database. + FieldSupportedVersions = "supported_versions" + // FieldSupportedExtensions holds the string denoting the supportedextensions field in the database. + FieldSupportedExtensions = "supported_extensions" + // EdgeUsers holds the string denoting the users edge name in mutations. + EdgeUsers = "users" + // EdgeModerators holds the string denoting the moderators edge name in mutations. + EdgeModerators = "moderators" + // EdgeAdmins holds the string denoting the admins edge name in mutations. + EdgeAdmins = "admins" + // Table holds the table name of the instancemetadata in the database. + Table = "instance_metadata" + // UsersTable is the table that holds the users relation/edge. The primary key declared below. + UsersTable = "instance_metadata_users" + // UsersInverseTable is the table name for the User entity. + // It exists in this package in order to avoid circular dependency with the "user" package. + UsersInverseTable = "users" + // ModeratorsTable is the table that holds the moderators relation/edge. The primary key declared below. + ModeratorsTable = "instance_metadata_moderators" + // ModeratorsInverseTable is the table name for the User entity. + // It exists in this package in order to avoid circular dependency with the "user" package. + ModeratorsInverseTable = "users" + // AdminsTable is the table that holds the admins relation/edge. The primary key declared below. + AdminsTable = "instance_metadata_admins" + // AdminsInverseTable is the table name for the User entity. + // It exists in this package in order to avoid circular dependency with the "user" package. + AdminsInverseTable = "users" +) + +// Columns holds all SQL columns for instancemetadata fields. +var Columns = []string{ + FieldID, + FieldIsRemote, + FieldURI, + FieldExtensions, + FieldCreatedAt, + FieldUpdatedAt, + FieldName, + FieldDescription, + FieldHost, + FieldPublicKey, + FieldPublicKeyAlgorithm, + FieldPrivateKey, + FieldSoftwareName, + FieldSoftwareVersion, + FieldSharedInboxURI, + FieldModeratorsURI, + FieldAdminsURI, + FieldLogoEndpoint, + FieldLogoMimeType, + FieldBannerEndpoint, + FieldBannerMimeType, + FieldSupportedVersions, + FieldSupportedExtensions, +} + +var ( + // UsersPrimaryKey and UsersColumn2 are the table columns denoting the + // primary key for the users relation (M2M). + UsersPrimaryKey = []string{"instance_metadata_id", "user_id"} + // ModeratorsPrimaryKey and ModeratorsColumn2 are the table columns denoting the + // primary key for the moderators relation (M2M). + ModeratorsPrimaryKey = []string{"instance_metadata_id", "user_id"} + // AdminsPrimaryKey and AdminsColumn2 are the table columns denoting the + // primary key for the admins relation (M2M). + AdminsPrimaryKey = []string{"instance_metadata_id", "user_id"} +) + +// ValidColumn reports if the column name is valid (part of the table columns). +func ValidColumn(column string) bool { + for i := range Columns { + if column == Columns[i] { + return true + } + } + return false +} + +var ( + // URIValidator is a validator for the "uri" field. It is called by the builders before save. + URIValidator func(string) error + // DefaultExtensions holds the default value on creation for the "extensions" field. + DefaultExtensions lysand.Extensions + // DefaultCreatedAt holds the default value on creation for the "created_at" field. + DefaultCreatedAt func() time.Time + // DefaultUpdatedAt holds the default value on creation for the "updated_at" field. + DefaultUpdatedAt func() time.Time + // UpdateDefaultUpdatedAt holds the default value on update for the "updated_at" field. + UpdateDefaultUpdatedAt func() time.Time + // NameValidator is a validator for the "name" field. It is called by the builders before save. + NameValidator func(string) error + // HostValidator is a validator for the "host" field. It is called by the builders before save. + HostValidator func(string) error + // SoftwareNameValidator is a validator for the "softwareName" field. It is called by the builders before save. + SoftwareNameValidator func(string) error + // SoftwareVersionValidator is a validator for the "softwareVersion" field. It is called by the builders before save. + SoftwareVersionValidator func(string) error + // SharedInboxURIValidator is a validator for the "sharedInboxURI" field. It is called by the builders before save. + SharedInboxURIValidator func(string) error + // ModeratorsURIValidator is a validator for the "moderatorsURI" field. It is called by the builders before save. + ModeratorsURIValidator func(string) error + // AdminsURIValidator is a validator for the "adminsURI" field. It is called by the builders before save. + AdminsURIValidator func(string) error + // LogoEndpointValidator is a validator for the "logoEndpoint" field. It is called by the builders before save. + LogoEndpointValidator func(string) error + // LogoMimeTypeValidator is a validator for the "logoMimeType" field. It is called by the builders before save. + LogoMimeTypeValidator func(string) error + // BannerEndpointValidator is a validator for the "bannerEndpoint" field. It is called by the builders before save. + BannerEndpointValidator func(string) error + // BannerMimeTypeValidator is a validator for the "bannerMimeType" field. It is called by the builders before save. + BannerMimeTypeValidator func(string) error + // DefaultSupportedVersions holds the default value on creation for the "supportedVersions" field. + DefaultSupportedVersions []string + // DefaultSupportedExtensions holds the default value on creation for the "supportedExtensions" field. + DefaultSupportedExtensions []string + // DefaultID holds the default value on creation for the "id" field. + DefaultID func() uuid.UUID +) + +// OrderOption defines the ordering options for the InstanceMetadata queries. +type OrderOption func(*sql.Selector) + +// ByID orders the results by the id field. +func ByID(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldID, opts...).ToFunc() +} + +// ByIsRemote orders the results by the isRemote field. +func ByIsRemote(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldIsRemote, opts...).ToFunc() +} + +// ByURI orders the results by the uri field. +func ByURI(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldURI, opts...).ToFunc() +} + +// ByCreatedAt orders the results by the created_at field. +func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldCreatedAt, opts...).ToFunc() +} + +// ByUpdatedAt orders the results by the updated_at field. +func ByUpdatedAt(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldUpdatedAt, opts...).ToFunc() +} + +// ByName orders the results by the name field. +func ByName(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldName, opts...).ToFunc() +} + +// ByDescription orders the results by the description field. +func ByDescription(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldDescription, opts...).ToFunc() +} + +// ByHost orders the results by the host field. +func ByHost(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldHost, opts...).ToFunc() +} + +// ByPublicKeyAlgorithm orders the results by the publicKeyAlgorithm field. +func ByPublicKeyAlgorithm(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldPublicKeyAlgorithm, opts...).ToFunc() +} + +// BySoftwareName orders the results by the softwareName field. +func BySoftwareName(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldSoftwareName, opts...).ToFunc() +} + +// BySoftwareVersion orders the results by the softwareVersion field. +func BySoftwareVersion(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldSoftwareVersion, opts...).ToFunc() +} + +// BySharedInboxURI orders the results by the sharedInboxURI field. +func BySharedInboxURI(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldSharedInboxURI, opts...).ToFunc() +} + +// ByModeratorsURI orders the results by the moderatorsURI field. +func ByModeratorsURI(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldModeratorsURI, opts...).ToFunc() +} + +// ByAdminsURI orders the results by the adminsURI field. +func ByAdminsURI(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldAdminsURI, opts...).ToFunc() +} + +// ByLogoEndpoint orders the results by the logoEndpoint field. +func ByLogoEndpoint(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldLogoEndpoint, opts...).ToFunc() +} + +// ByLogoMimeType orders the results by the logoMimeType field. +func ByLogoMimeType(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldLogoMimeType, opts...).ToFunc() +} + +// ByBannerEndpoint orders the results by the bannerEndpoint field. +func ByBannerEndpoint(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldBannerEndpoint, opts...).ToFunc() +} + +// ByBannerMimeType orders the results by the bannerMimeType field. +func ByBannerMimeType(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldBannerMimeType, opts...).ToFunc() +} + +// ByUsersCount orders the results by users count. +func ByUsersCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newUsersStep(), opts...) + } +} + +// ByUsers orders the results by users terms. +func ByUsers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newUsersStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} + +// ByModeratorsCount orders the results by moderators count. +func ByModeratorsCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newModeratorsStep(), opts...) + } +} + +// ByModerators orders the results by moderators terms. +func ByModerators(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newModeratorsStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} + +// ByAdminsCount orders the results by admins count. +func ByAdminsCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newAdminsStep(), opts...) + } +} + +// ByAdmins orders the results by admins terms. +func ByAdmins(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newAdminsStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} +func newUsersStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(UsersInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, UsersTable, UsersPrimaryKey...), + ) +} +func newModeratorsStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(ModeratorsInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, ModeratorsTable, ModeratorsPrimaryKey...), + ) +} +func newAdminsStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(AdminsInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, AdminsTable, AdminsPrimaryKey...), + ) +} diff --git a/ent/instancemetadata/where.go b/ent/instancemetadata/where.go new file mode 100644 index 0000000..cd5651a --- /dev/null +++ b/ent/instancemetadata/where.go @@ -0,0 +1,1396 @@ +// Code generated by ent, DO NOT EDIT. + +package instancemetadata + +import ( + "time" + + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/ent/predicate" +) + +// ID filters vertices based on their ID field. +func ID(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldID, id)) +} + +// IDEQ applies the EQ predicate on the ID field. +func IDEQ(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldID, id)) +} + +// IDNEQ applies the NEQ predicate on the ID field. +func IDNEQ(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldID, id)) +} + +// IDIn applies the In predicate on the ID field. +func IDIn(ids ...uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldID, ids...)) +} + +// IDNotIn applies the NotIn predicate on the ID field. +func IDNotIn(ids ...uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldID, ids...)) +} + +// IDGT applies the GT predicate on the ID field. +func IDGT(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldID, id)) +} + +// IDGTE applies the GTE predicate on the ID field. +func IDGTE(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldID, id)) +} + +// IDLT applies the LT predicate on the ID field. +func IDLT(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldID, id)) +} + +// IDLTE applies the LTE predicate on the ID field. +func IDLTE(id uuid.UUID) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldID, id)) +} + +// IsRemote applies equality check predicate on the "isRemote" field. It's identical to IsRemoteEQ. +func IsRemote(v bool) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldIsRemote, v)) +} + +// URI applies equality check predicate on the "uri" field. It's identical to URIEQ. +func URI(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldURI, v)) +} + +// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. +func CreatedAt(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldCreatedAt, v)) +} + +// UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ. +func UpdatedAt(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldUpdatedAt, v)) +} + +// Name applies equality check predicate on the "name" field. It's identical to NameEQ. +func Name(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldName, v)) +} + +// Description applies equality check predicate on the "description" field. It's identical to DescriptionEQ. +func Description(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldDescription, v)) +} + +// Host applies equality check predicate on the "host" field. It's identical to HostEQ. +func Host(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldHost, v)) +} + +// PublicKey applies equality check predicate on the "publicKey" field. It's identical to PublicKeyEQ. +func PublicKey(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPublicKey, v)) +} + +// PublicKeyAlgorithm applies equality check predicate on the "publicKeyAlgorithm" field. It's identical to PublicKeyAlgorithmEQ. +func PublicKeyAlgorithm(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPublicKeyAlgorithm, v)) +} + +// PrivateKey applies equality check predicate on the "privateKey" field. It's identical to PrivateKeyEQ. +func PrivateKey(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPrivateKey, v)) +} + +// SoftwareName applies equality check predicate on the "softwareName" field. It's identical to SoftwareNameEQ. +func SoftwareName(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSoftwareName, v)) +} + +// SoftwareVersion applies equality check predicate on the "softwareVersion" field. It's identical to SoftwareVersionEQ. +func SoftwareVersion(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSoftwareVersion, v)) +} + +// SharedInboxURI applies equality check predicate on the "sharedInboxURI" field. It's identical to SharedInboxURIEQ. +func SharedInboxURI(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSharedInboxURI, v)) +} + +// ModeratorsURI applies equality check predicate on the "moderatorsURI" field. It's identical to ModeratorsURIEQ. +func ModeratorsURI(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldModeratorsURI, v)) +} + +// AdminsURI applies equality check predicate on the "adminsURI" field. It's identical to AdminsURIEQ. +func AdminsURI(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldAdminsURI, v)) +} + +// LogoEndpoint applies equality check predicate on the "logoEndpoint" field. It's identical to LogoEndpointEQ. +func LogoEndpoint(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldLogoEndpoint, v)) +} + +// LogoMimeType applies equality check predicate on the "logoMimeType" field. It's identical to LogoMimeTypeEQ. +func LogoMimeType(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldLogoMimeType, v)) +} + +// BannerEndpoint applies equality check predicate on the "bannerEndpoint" field. It's identical to BannerEndpointEQ. +func BannerEndpoint(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldBannerEndpoint, v)) +} + +// BannerMimeType applies equality check predicate on the "bannerMimeType" field. It's identical to BannerMimeTypeEQ. +func BannerMimeType(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldBannerMimeType, v)) +} + +// IsRemoteEQ applies the EQ predicate on the "isRemote" field. +func IsRemoteEQ(v bool) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldIsRemote, v)) +} + +// IsRemoteNEQ applies the NEQ predicate on the "isRemote" field. +func IsRemoteNEQ(v bool) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldIsRemote, v)) +} + +// URIEQ applies the EQ predicate on the "uri" field. +func URIEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldURI, v)) +} + +// URINEQ applies the NEQ predicate on the "uri" field. +func URINEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldURI, v)) +} + +// URIIn applies the In predicate on the "uri" field. +func URIIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldURI, vs...)) +} + +// URINotIn applies the NotIn predicate on the "uri" field. +func URINotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldURI, vs...)) +} + +// URIGT applies the GT predicate on the "uri" field. +func URIGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldURI, v)) +} + +// URIGTE applies the GTE predicate on the "uri" field. +func URIGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldURI, v)) +} + +// URILT applies the LT predicate on the "uri" field. +func URILT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldURI, v)) +} + +// URILTE applies the LTE predicate on the "uri" field. +func URILTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldURI, v)) +} + +// URIContains applies the Contains predicate on the "uri" field. +func URIContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldURI, v)) +} + +// URIHasPrefix applies the HasPrefix predicate on the "uri" field. +func URIHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldURI, v)) +} + +// URIHasSuffix applies the HasSuffix predicate on the "uri" field. +func URIHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldURI, v)) +} + +// URIEqualFold applies the EqualFold predicate on the "uri" field. +func URIEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldURI, v)) +} + +// URIContainsFold applies the ContainsFold predicate on the "uri" field. +func URIContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldURI, v)) +} + +// CreatedAtEQ applies the EQ predicate on the "created_at" field. +func CreatedAtEQ(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldCreatedAt, v)) +} + +// CreatedAtNEQ applies the NEQ predicate on the "created_at" field. +func CreatedAtNEQ(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldCreatedAt, v)) +} + +// CreatedAtIn applies the In predicate on the "created_at" field. +func CreatedAtIn(vs ...time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldCreatedAt, vs...)) +} + +// CreatedAtNotIn applies the NotIn predicate on the "created_at" field. +func CreatedAtNotIn(vs ...time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldCreatedAt, vs...)) +} + +// CreatedAtGT applies the GT predicate on the "created_at" field. +func CreatedAtGT(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldCreatedAt, v)) +} + +// CreatedAtGTE applies the GTE predicate on the "created_at" field. +func CreatedAtGTE(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldCreatedAt, v)) +} + +// CreatedAtLT applies the LT predicate on the "created_at" field. +func CreatedAtLT(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldCreatedAt, v)) +} + +// CreatedAtLTE applies the LTE predicate on the "created_at" field. +func CreatedAtLTE(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldCreatedAt, v)) +} + +// UpdatedAtEQ applies the EQ predicate on the "updated_at" field. +func UpdatedAtEQ(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldUpdatedAt, v)) +} + +// UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field. +func UpdatedAtNEQ(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldUpdatedAt, v)) +} + +// UpdatedAtIn applies the In predicate on the "updated_at" field. +func UpdatedAtIn(vs ...time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldUpdatedAt, vs...)) +} + +// UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field. +func UpdatedAtNotIn(vs ...time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldUpdatedAt, vs...)) +} + +// UpdatedAtGT applies the GT predicate on the "updated_at" field. +func UpdatedAtGT(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldUpdatedAt, v)) +} + +// UpdatedAtGTE applies the GTE predicate on the "updated_at" field. +func UpdatedAtGTE(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldUpdatedAt, v)) +} + +// UpdatedAtLT applies the LT predicate on the "updated_at" field. +func UpdatedAtLT(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldUpdatedAt, v)) +} + +// UpdatedAtLTE applies the LTE predicate on the "updated_at" field. +func UpdatedAtLTE(v time.Time) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldUpdatedAt, v)) +} + +// NameEQ applies the EQ predicate on the "name" field. +func NameEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldName, v)) +} + +// NameNEQ applies the NEQ predicate on the "name" field. +func NameNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldName, v)) +} + +// NameIn applies the In predicate on the "name" field. +func NameIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldName, vs...)) +} + +// NameNotIn applies the NotIn predicate on the "name" field. +func NameNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldName, vs...)) +} + +// NameGT applies the GT predicate on the "name" field. +func NameGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldName, v)) +} + +// NameGTE applies the GTE predicate on the "name" field. +func NameGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldName, v)) +} + +// NameLT applies the LT predicate on the "name" field. +func NameLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldName, v)) +} + +// NameLTE applies the LTE predicate on the "name" field. +func NameLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldName, v)) +} + +// NameContains applies the Contains predicate on the "name" field. +func NameContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldName, v)) +} + +// NameHasPrefix applies the HasPrefix predicate on the "name" field. +func NameHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldName, v)) +} + +// NameHasSuffix applies the HasSuffix predicate on the "name" field. +func NameHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldName, v)) +} + +// NameEqualFold applies the EqualFold predicate on the "name" field. +func NameEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldName, v)) +} + +// NameContainsFold applies the ContainsFold predicate on the "name" field. +func NameContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldName, v)) +} + +// DescriptionEQ applies the EQ predicate on the "description" field. +func DescriptionEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldDescription, v)) +} + +// DescriptionNEQ applies the NEQ predicate on the "description" field. +func DescriptionNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldDescription, v)) +} + +// DescriptionIn applies the In predicate on the "description" field. +func DescriptionIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldDescription, vs...)) +} + +// DescriptionNotIn applies the NotIn predicate on the "description" field. +func DescriptionNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldDescription, vs...)) +} + +// DescriptionGT applies the GT predicate on the "description" field. +func DescriptionGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldDescription, v)) +} + +// DescriptionGTE applies the GTE predicate on the "description" field. +func DescriptionGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldDescription, v)) +} + +// DescriptionLT applies the LT predicate on the "description" field. +func DescriptionLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldDescription, v)) +} + +// DescriptionLTE applies the LTE predicate on the "description" field. +func DescriptionLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldDescription, v)) +} + +// DescriptionContains applies the Contains predicate on the "description" field. +func DescriptionContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldDescription, v)) +} + +// DescriptionHasPrefix applies the HasPrefix predicate on the "description" field. +func DescriptionHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldDescription, v)) +} + +// DescriptionHasSuffix applies the HasSuffix predicate on the "description" field. +func DescriptionHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldDescription, v)) +} + +// DescriptionIsNil applies the IsNil predicate on the "description" field. +func DescriptionIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldDescription)) +} + +// DescriptionNotNil applies the NotNil predicate on the "description" field. +func DescriptionNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldDescription)) +} + +// DescriptionEqualFold applies the EqualFold predicate on the "description" field. +func DescriptionEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldDescription, v)) +} + +// DescriptionContainsFold applies the ContainsFold predicate on the "description" field. +func DescriptionContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldDescription, v)) +} + +// HostEQ applies the EQ predicate on the "host" field. +func HostEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldHost, v)) +} + +// HostNEQ applies the NEQ predicate on the "host" field. +func HostNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldHost, v)) +} + +// HostIn applies the In predicate on the "host" field. +func HostIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldHost, vs...)) +} + +// HostNotIn applies the NotIn predicate on the "host" field. +func HostNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldHost, vs...)) +} + +// HostGT applies the GT predicate on the "host" field. +func HostGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldHost, v)) +} + +// HostGTE applies the GTE predicate on the "host" field. +func HostGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldHost, v)) +} + +// HostLT applies the LT predicate on the "host" field. +func HostLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldHost, v)) +} + +// HostLTE applies the LTE predicate on the "host" field. +func HostLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldHost, v)) +} + +// HostContains applies the Contains predicate on the "host" field. +func HostContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldHost, v)) +} + +// HostHasPrefix applies the HasPrefix predicate on the "host" field. +func HostHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldHost, v)) +} + +// HostHasSuffix applies the HasSuffix predicate on the "host" field. +func HostHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldHost, v)) +} + +// HostEqualFold applies the EqualFold predicate on the "host" field. +func HostEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldHost, v)) +} + +// HostContainsFold applies the ContainsFold predicate on the "host" field. +func HostContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldHost, v)) +} + +// PublicKeyEQ applies the EQ predicate on the "publicKey" field. +func PublicKeyEQ(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPublicKey, v)) +} + +// PublicKeyNEQ applies the NEQ predicate on the "publicKey" field. +func PublicKeyNEQ(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldPublicKey, v)) +} + +// PublicKeyIn applies the In predicate on the "publicKey" field. +func PublicKeyIn(vs ...[]byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldPublicKey, vs...)) +} + +// PublicKeyNotIn applies the NotIn predicate on the "publicKey" field. +func PublicKeyNotIn(vs ...[]byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldPublicKey, vs...)) +} + +// PublicKeyGT applies the GT predicate on the "publicKey" field. +func PublicKeyGT(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldPublicKey, v)) +} + +// PublicKeyGTE applies the GTE predicate on the "publicKey" field. +func PublicKeyGTE(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldPublicKey, v)) +} + +// PublicKeyLT applies the LT predicate on the "publicKey" field. +func PublicKeyLT(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldPublicKey, v)) +} + +// PublicKeyLTE applies the LTE predicate on the "publicKey" field. +func PublicKeyLTE(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldPublicKey, v)) +} + +// PublicKeyAlgorithmEQ applies the EQ predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmNEQ applies the NEQ predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmIn applies the In predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldPublicKeyAlgorithm, vs...)) +} + +// PublicKeyAlgorithmNotIn applies the NotIn predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldPublicKeyAlgorithm, vs...)) +} + +// PublicKeyAlgorithmGT applies the GT predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmGTE applies the GTE predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmLT applies the LT predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmLTE applies the LTE predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmContains applies the Contains predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmHasPrefix applies the HasPrefix predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmHasSuffix applies the HasSuffix predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmEqualFold applies the EqualFold predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmContainsFold applies the ContainsFold predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldPublicKeyAlgorithm, v)) +} + +// PrivateKeyEQ applies the EQ predicate on the "privateKey" field. +func PrivateKeyEQ(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldPrivateKey, v)) +} + +// PrivateKeyNEQ applies the NEQ predicate on the "privateKey" field. +func PrivateKeyNEQ(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldPrivateKey, v)) +} + +// PrivateKeyIn applies the In predicate on the "privateKey" field. +func PrivateKeyIn(vs ...[]byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldPrivateKey, vs...)) +} + +// PrivateKeyNotIn applies the NotIn predicate on the "privateKey" field. +func PrivateKeyNotIn(vs ...[]byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldPrivateKey, vs...)) +} + +// PrivateKeyGT applies the GT predicate on the "privateKey" field. +func PrivateKeyGT(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldPrivateKey, v)) +} + +// PrivateKeyGTE applies the GTE predicate on the "privateKey" field. +func PrivateKeyGTE(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldPrivateKey, v)) +} + +// PrivateKeyLT applies the LT predicate on the "privateKey" field. +func PrivateKeyLT(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldPrivateKey, v)) +} + +// PrivateKeyLTE applies the LTE predicate on the "privateKey" field. +func PrivateKeyLTE(v []byte) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldPrivateKey, v)) +} + +// PrivateKeyIsNil applies the IsNil predicate on the "privateKey" field. +func PrivateKeyIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldPrivateKey)) +} + +// PrivateKeyNotNil applies the NotNil predicate on the "privateKey" field. +func PrivateKeyNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldPrivateKey)) +} + +// SoftwareNameEQ applies the EQ predicate on the "softwareName" field. +func SoftwareNameEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSoftwareName, v)) +} + +// SoftwareNameNEQ applies the NEQ predicate on the "softwareName" field. +func SoftwareNameNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldSoftwareName, v)) +} + +// SoftwareNameIn applies the In predicate on the "softwareName" field. +func SoftwareNameIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldSoftwareName, vs...)) +} + +// SoftwareNameNotIn applies the NotIn predicate on the "softwareName" field. +func SoftwareNameNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldSoftwareName, vs...)) +} + +// SoftwareNameGT applies the GT predicate on the "softwareName" field. +func SoftwareNameGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldSoftwareName, v)) +} + +// SoftwareNameGTE applies the GTE predicate on the "softwareName" field. +func SoftwareNameGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldSoftwareName, v)) +} + +// SoftwareNameLT applies the LT predicate on the "softwareName" field. +func SoftwareNameLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldSoftwareName, v)) +} + +// SoftwareNameLTE applies the LTE predicate on the "softwareName" field. +func SoftwareNameLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldSoftwareName, v)) +} + +// SoftwareNameContains applies the Contains predicate on the "softwareName" field. +func SoftwareNameContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldSoftwareName, v)) +} + +// SoftwareNameHasPrefix applies the HasPrefix predicate on the "softwareName" field. +func SoftwareNameHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldSoftwareName, v)) +} + +// SoftwareNameHasSuffix applies the HasSuffix predicate on the "softwareName" field. +func SoftwareNameHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldSoftwareName, v)) +} + +// SoftwareNameEqualFold applies the EqualFold predicate on the "softwareName" field. +func SoftwareNameEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldSoftwareName, v)) +} + +// SoftwareNameContainsFold applies the ContainsFold predicate on the "softwareName" field. +func SoftwareNameContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldSoftwareName, v)) +} + +// SoftwareVersionEQ applies the EQ predicate on the "softwareVersion" field. +func SoftwareVersionEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSoftwareVersion, v)) +} + +// SoftwareVersionNEQ applies the NEQ predicate on the "softwareVersion" field. +func SoftwareVersionNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldSoftwareVersion, v)) +} + +// SoftwareVersionIn applies the In predicate on the "softwareVersion" field. +func SoftwareVersionIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldSoftwareVersion, vs...)) +} + +// SoftwareVersionNotIn applies the NotIn predicate on the "softwareVersion" field. +func SoftwareVersionNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldSoftwareVersion, vs...)) +} + +// SoftwareVersionGT applies the GT predicate on the "softwareVersion" field. +func SoftwareVersionGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldSoftwareVersion, v)) +} + +// SoftwareVersionGTE applies the GTE predicate on the "softwareVersion" field. +func SoftwareVersionGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldSoftwareVersion, v)) +} + +// SoftwareVersionLT applies the LT predicate on the "softwareVersion" field. +func SoftwareVersionLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldSoftwareVersion, v)) +} + +// SoftwareVersionLTE applies the LTE predicate on the "softwareVersion" field. +func SoftwareVersionLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldSoftwareVersion, v)) +} + +// SoftwareVersionContains applies the Contains predicate on the "softwareVersion" field. +func SoftwareVersionContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldSoftwareVersion, v)) +} + +// SoftwareVersionHasPrefix applies the HasPrefix predicate on the "softwareVersion" field. +func SoftwareVersionHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldSoftwareVersion, v)) +} + +// SoftwareVersionHasSuffix applies the HasSuffix predicate on the "softwareVersion" field. +func SoftwareVersionHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldSoftwareVersion, v)) +} + +// SoftwareVersionEqualFold applies the EqualFold predicate on the "softwareVersion" field. +func SoftwareVersionEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldSoftwareVersion, v)) +} + +// SoftwareVersionContainsFold applies the ContainsFold predicate on the "softwareVersion" field. +func SoftwareVersionContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldSoftwareVersion, v)) +} + +// SharedInboxURIEQ applies the EQ predicate on the "sharedInboxURI" field. +func SharedInboxURIEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldSharedInboxURI, v)) +} + +// SharedInboxURINEQ applies the NEQ predicate on the "sharedInboxURI" field. +func SharedInboxURINEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldSharedInboxURI, v)) +} + +// SharedInboxURIIn applies the In predicate on the "sharedInboxURI" field. +func SharedInboxURIIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldSharedInboxURI, vs...)) +} + +// SharedInboxURINotIn applies the NotIn predicate on the "sharedInboxURI" field. +func SharedInboxURINotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldSharedInboxURI, vs...)) +} + +// SharedInboxURIGT applies the GT predicate on the "sharedInboxURI" field. +func SharedInboxURIGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldSharedInboxURI, v)) +} + +// SharedInboxURIGTE applies the GTE predicate on the "sharedInboxURI" field. +func SharedInboxURIGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldSharedInboxURI, v)) +} + +// SharedInboxURILT applies the LT predicate on the "sharedInboxURI" field. +func SharedInboxURILT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldSharedInboxURI, v)) +} + +// SharedInboxURILTE applies the LTE predicate on the "sharedInboxURI" field. +func SharedInboxURILTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldSharedInboxURI, v)) +} + +// SharedInboxURIContains applies the Contains predicate on the "sharedInboxURI" field. +func SharedInboxURIContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldSharedInboxURI, v)) +} + +// SharedInboxURIHasPrefix applies the HasPrefix predicate on the "sharedInboxURI" field. +func SharedInboxURIHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldSharedInboxURI, v)) +} + +// SharedInboxURIHasSuffix applies the HasSuffix predicate on the "sharedInboxURI" field. +func SharedInboxURIHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldSharedInboxURI, v)) +} + +// SharedInboxURIEqualFold applies the EqualFold predicate on the "sharedInboxURI" field. +func SharedInboxURIEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldSharedInboxURI, v)) +} + +// SharedInboxURIContainsFold applies the ContainsFold predicate on the "sharedInboxURI" field. +func SharedInboxURIContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldSharedInboxURI, v)) +} + +// ModeratorsURIEQ applies the EQ predicate on the "moderatorsURI" field. +func ModeratorsURIEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldModeratorsURI, v)) +} + +// ModeratorsURINEQ applies the NEQ predicate on the "moderatorsURI" field. +func ModeratorsURINEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldModeratorsURI, v)) +} + +// ModeratorsURIIn applies the In predicate on the "moderatorsURI" field. +func ModeratorsURIIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldModeratorsURI, vs...)) +} + +// ModeratorsURINotIn applies the NotIn predicate on the "moderatorsURI" field. +func ModeratorsURINotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldModeratorsURI, vs...)) +} + +// ModeratorsURIGT applies the GT predicate on the "moderatorsURI" field. +func ModeratorsURIGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldModeratorsURI, v)) +} + +// ModeratorsURIGTE applies the GTE predicate on the "moderatorsURI" field. +func ModeratorsURIGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldModeratorsURI, v)) +} + +// ModeratorsURILT applies the LT predicate on the "moderatorsURI" field. +func ModeratorsURILT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldModeratorsURI, v)) +} + +// ModeratorsURILTE applies the LTE predicate on the "moderatorsURI" field. +func ModeratorsURILTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldModeratorsURI, v)) +} + +// ModeratorsURIContains applies the Contains predicate on the "moderatorsURI" field. +func ModeratorsURIContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldModeratorsURI, v)) +} + +// ModeratorsURIHasPrefix applies the HasPrefix predicate on the "moderatorsURI" field. +func ModeratorsURIHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldModeratorsURI, v)) +} + +// ModeratorsURIHasSuffix applies the HasSuffix predicate on the "moderatorsURI" field. +func ModeratorsURIHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldModeratorsURI, v)) +} + +// ModeratorsURIIsNil applies the IsNil predicate on the "moderatorsURI" field. +func ModeratorsURIIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldModeratorsURI)) +} + +// ModeratorsURINotNil applies the NotNil predicate on the "moderatorsURI" field. +func ModeratorsURINotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldModeratorsURI)) +} + +// ModeratorsURIEqualFold applies the EqualFold predicate on the "moderatorsURI" field. +func ModeratorsURIEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldModeratorsURI, v)) +} + +// ModeratorsURIContainsFold applies the ContainsFold predicate on the "moderatorsURI" field. +func ModeratorsURIContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldModeratorsURI, v)) +} + +// AdminsURIEQ applies the EQ predicate on the "adminsURI" field. +func AdminsURIEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldAdminsURI, v)) +} + +// AdminsURINEQ applies the NEQ predicate on the "adminsURI" field. +func AdminsURINEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldAdminsURI, v)) +} + +// AdminsURIIn applies the In predicate on the "adminsURI" field. +func AdminsURIIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldAdminsURI, vs...)) +} + +// AdminsURINotIn applies the NotIn predicate on the "adminsURI" field. +func AdminsURINotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldAdminsURI, vs...)) +} + +// AdminsURIGT applies the GT predicate on the "adminsURI" field. +func AdminsURIGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldAdminsURI, v)) +} + +// AdminsURIGTE applies the GTE predicate on the "adminsURI" field. +func AdminsURIGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldAdminsURI, v)) +} + +// AdminsURILT applies the LT predicate on the "adminsURI" field. +func AdminsURILT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldAdminsURI, v)) +} + +// AdminsURILTE applies the LTE predicate on the "adminsURI" field. +func AdminsURILTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldAdminsURI, v)) +} + +// AdminsURIContains applies the Contains predicate on the "adminsURI" field. +func AdminsURIContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldAdminsURI, v)) +} + +// AdminsURIHasPrefix applies the HasPrefix predicate on the "adminsURI" field. +func AdminsURIHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldAdminsURI, v)) +} + +// AdminsURIHasSuffix applies the HasSuffix predicate on the "adminsURI" field. +func AdminsURIHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldAdminsURI, v)) +} + +// AdminsURIIsNil applies the IsNil predicate on the "adminsURI" field. +func AdminsURIIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldAdminsURI)) +} + +// AdminsURINotNil applies the NotNil predicate on the "adminsURI" field. +func AdminsURINotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldAdminsURI)) +} + +// AdminsURIEqualFold applies the EqualFold predicate on the "adminsURI" field. +func AdminsURIEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldAdminsURI, v)) +} + +// AdminsURIContainsFold applies the ContainsFold predicate on the "adminsURI" field. +func AdminsURIContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldAdminsURI, v)) +} + +// LogoEndpointEQ applies the EQ predicate on the "logoEndpoint" field. +func LogoEndpointEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldLogoEndpoint, v)) +} + +// LogoEndpointNEQ applies the NEQ predicate on the "logoEndpoint" field. +func LogoEndpointNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldLogoEndpoint, v)) +} + +// LogoEndpointIn applies the In predicate on the "logoEndpoint" field. +func LogoEndpointIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldLogoEndpoint, vs...)) +} + +// LogoEndpointNotIn applies the NotIn predicate on the "logoEndpoint" field. +func LogoEndpointNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldLogoEndpoint, vs...)) +} + +// LogoEndpointGT applies the GT predicate on the "logoEndpoint" field. +func LogoEndpointGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldLogoEndpoint, v)) +} + +// LogoEndpointGTE applies the GTE predicate on the "logoEndpoint" field. +func LogoEndpointGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldLogoEndpoint, v)) +} + +// LogoEndpointLT applies the LT predicate on the "logoEndpoint" field. +func LogoEndpointLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldLogoEndpoint, v)) +} + +// LogoEndpointLTE applies the LTE predicate on the "logoEndpoint" field. +func LogoEndpointLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldLogoEndpoint, v)) +} + +// LogoEndpointContains applies the Contains predicate on the "logoEndpoint" field. +func LogoEndpointContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldLogoEndpoint, v)) +} + +// LogoEndpointHasPrefix applies the HasPrefix predicate on the "logoEndpoint" field. +func LogoEndpointHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldLogoEndpoint, v)) +} + +// LogoEndpointHasSuffix applies the HasSuffix predicate on the "logoEndpoint" field. +func LogoEndpointHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldLogoEndpoint, v)) +} + +// LogoEndpointIsNil applies the IsNil predicate on the "logoEndpoint" field. +func LogoEndpointIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldLogoEndpoint)) +} + +// LogoEndpointNotNil applies the NotNil predicate on the "logoEndpoint" field. +func LogoEndpointNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldLogoEndpoint)) +} + +// LogoEndpointEqualFold applies the EqualFold predicate on the "logoEndpoint" field. +func LogoEndpointEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldLogoEndpoint, v)) +} + +// LogoEndpointContainsFold applies the ContainsFold predicate on the "logoEndpoint" field. +func LogoEndpointContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldLogoEndpoint, v)) +} + +// LogoMimeTypeEQ applies the EQ predicate on the "logoMimeType" field. +func LogoMimeTypeEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldLogoMimeType, v)) +} + +// LogoMimeTypeNEQ applies the NEQ predicate on the "logoMimeType" field. +func LogoMimeTypeNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldLogoMimeType, v)) +} + +// LogoMimeTypeIn applies the In predicate on the "logoMimeType" field. +func LogoMimeTypeIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldLogoMimeType, vs...)) +} + +// LogoMimeTypeNotIn applies the NotIn predicate on the "logoMimeType" field. +func LogoMimeTypeNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldLogoMimeType, vs...)) +} + +// LogoMimeTypeGT applies the GT predicate on the "logoMimeType" field. +func LogoMimeTypeGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldLogoMimeType, v)) +} + +// LogoMimeTypeGTE applies the GTE predicate on the "logoMimeType" field. +func LogoMimeTypeGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldLogoMimeType, v)) +} + +// LogoMimeTypeLT applies the LT predicate on the "logoMimeType" field. +func LogoMimeTypeLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldLogoMimeType, v)) +} + +// LogoMimeTypeLTE applies the LTE predicate on the "logoMimeType" field. +func LogoMimeTypeLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldLogoMimeType, v)) +} + +// LogoMimeTypeContains applies the Contains predicate on the "logoMimeType" field. +func LogoMimeTypeContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldLogoMimeType, v)) +} + +// LogoMimeTypeHasPrefix applies the HasPrefix predicate on the "logoMimeType" field. +func LogoMimeTypeHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldLogoMimeType, v)) +} + +// LogoMimeTypeHasSuffix applies the HasSuffix predicate on the "logoMimeType" field. +func LogoMimeTypeHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldLogoMimeType, v)) +} + +// LogoMimeTypeIsNil applies the IsNil predicate on the "logoMimeType" field. +func LogoMimeTypeIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldLogoMimeType)) +} + +// LogoMimeTypeNotNil applies the NotNil predicate on the "logoMimeType" field. +func LogoMimeTypeNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldLogoMimeType)) +} + +// LogoMimeTypeEqualFold applies the EqualFold predicate on the "logoMimeType" field. +func LogoMimeTypeEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldLogoMimeType, v)) +} + +// LogoMimeTypeContainsFold applies the ContainsFold predicate on the "logoMimeType" field. +func LogoMimeTypeContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldLogoMimeType, v)) +} + +// BannerEndpointEQ applies the EQ predicate on the "bannerEndpoint" field. +func BannerEndpointEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldBannerEndpoint, v)) +} + +// BannerEndpointNEQ applies the NEQ predicate on the "bannerEndpoint" field. +func BannerEndpointNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldBannerEndpoint, v)) +} + +// BannerEndpointIn applies the In predicate on the "bannerEndpoint" field. +func BannerEndpointIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldBannerEndpoint, vs...)) +} + +// BannerEndpointNotIn applies the NotIn predicate on the "bannerEndpoint" field. +func BannerEndpointNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldBannerEndpoint, vs...)) +} + +// BannerEndpointGT applies the GT predicate on the "bannerEndpoint" field. +func BannerEndpointGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldBannerEndpoint, v)) +} + +// BannerEndpointGTE applies the GTE predicate on the "bannerEndpoint" field. +func BannerEndpointGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldBannerEndpoint, v)) +} + +// BannerEndpointLT applies the LT predicate on the "bannerEndpoint" field. +func BannerEndpointLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldBannerEndpoint, v)) +} + +// BannerEndpointLTE applies the LTE predicate on the "bannerEndpoint" field. +func BannerEndpointLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldBannerEndpoint, v)) +} + +// BannerEndpointContains applies the Contains predicate on the "bannerEndpoint" field. +func BannerEndpointContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldBannerEndpoint, v)) +} + +// BannerEndpointHasPrefix applies the HasPrefix predicate on the "bannerEndpoint" field. +func BannerEndpointHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldBannerEndpoint, v)) +} + +// BannerEndpointHasSuffix applies the HasSuffix predicate on the "bannerEndpoint" field. +func BannerEndpointHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldBannerEndpoint, v)) +} + +// BannerEndpointIsNil applies the IsNil predicate on the "bannerEndpoint" field. +func BannerEndpointIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldBannerEndpoint)) +} + +// BannerEndpointNotNil applies the NotNil predicate on the "bannerEndpoint" field. +func BannerEndpointNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldBannerEndpoint)) +} + +// BannerEndpointEqualFold applies the EqualFold predicate on the "bannerEndpoint" field. +func BannerEndpointEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldBannerEndpoint, v)) +} + +// BannerEndpointContainsFold applies the ContainsFold predicate on the "bannerEndpoint" field. +func BannerEndpointContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldBannerEndpoint, v)) +} + +// BannerMimeTypeEQ applies the EQ predicate on the "bannerMimeType" field. +func BannerMimeTypeEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEQ(FieldBannerMimeType, v)) +} + +// BannerMimeTypeNEQ applies the NEQ predicate on the "bannerMimeType" field. +func BannerMimeTypeNEQ(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNEQ(FieldBannerMimeType, v)) +} + +// BannerMimeTypeIn applies the In predicate on the "bannerMimeType" field. +func BannerMimeTypeIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIn(FieldBannerMimeType, vs...)) +} + +// BannerMimeTypeNotIn applies the NotIn predicate on the "bannerMimeType" field. +func BannerMimeTypeNotIn(vs ...string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotIn(FieldBannerMimeType, vs...)) +} + +// BannerMimeTypeGT applies the GT predicate on the "bannerMimeType" field. +func BannerMimeTypeGT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGT(FieldBannerMimeType, v)) +} + +// BannerMimeTypeGTE applies the GTE predicate on the "bannerMimeType" field. +func BannerMimeTypeGTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldGTE(FieldBannerMimeType, v)) +} + +// BannerMimeTypeLT applies the LT predicate on the "bannerMimeType" field. +func BannerMimeTypeLT(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLT(FieldBannerMimeType, v)) +} + +// BannerMimeTypeLTE applies the LTE predicate on the "bannerMimeType" field. +func BannerMimeTypeLTE(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldLTE(FieldBannerMimeType, v)) +} + +// BannerMimeTypeContains applies the Contains predicate on the "bannerMimeType" field. +func BannerMimeTypeContains(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContains(FieldBannerMimeType, v)) +} + +// BannerMimeTypeHasPrefix applies the HasPrefix predicate on the "bannerMimeType" field. +func BannerMimeTypeHasPrefix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasPrefix(FieldBannerMimeType, v)) +} + +// BannerMimeTypeHasSuffix applies the HasSuffix predicate on the "bannerMimeType" field. +func BannerMimeTypeHasSuffix(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldBannerMimeType, v)) +} + +// BannerMimeTypeIsNil applies the IsNil predicate on the "bannerMimeType" field. +func BannerMimeTypeIsNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldIsNull(FieldBannerMimeType)) +} + +// BannerMimeTypeNotNil applies the NotNil predicate on the "bannerMimeType" field. +func BannerMimeTypeNotNil() predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldNotNull(FieldBannerMimeType)) +} + +// BannerMimeTypeEqualFold applies the EqualFold predicate on the "bannerMimeType" field. +func BannerMimeTypeEqualFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldEqualFold(FieldBannerMimeType, v)) +} + +// BannerMimeTypeContainsFold applies the ContainsFold predicate on the "bannerMimeType" field. +func BannerMimeTypeContainsFold(v string) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.FieldContainsFold(FieldBannerMimeType, v)) +} + +// HasUsers applies the HasEdge predicate on the "users" edge. +func HasUsers() predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, UsersTable, UsersPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasUsersWith applies the HasEdge predicate on the "users" edge with a given conditions (other predicates). +func HasUsersWith(preds ...predicate.User) predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := newUsersStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + +// HasModerators applies the HasEdge predicate on the "moderators" edge. +func HasModerators() predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, ModeratorsTable, ModeratorsPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasModeratorsWith applies the HasEdge predicate on the "moderators" edge with a given conditions (other predicates). +func HasModeratorsWith(preds ...predicate.User) predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := newModeratorsStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + +// HasAdmins applies the HasEdge predicate on the "admins" edge. +func HasAdmins() predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, AdminsTable, AdminsPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasAdminsWith applies the HasEdge predicate on the "admins" edge with a given conditions (other predicates). +func HasAdminsWith(preds ...predicate.User) predicate.InstanceMetadata { + return predicate.InstanceMetadata(func(s *sql.Selector) { + step := newAdminsStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + +// And groups predicates with the AND operator between them. +func And(predicates ...predicate.InstanceMetadata) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.AndPredicates(predicates...)) +} + +// Or groups predicates with the OR operator between them. +func Or(predicates ...predicate.InstanceMetadata) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.OrPredicates(predicates...)) +} + +// Not applies the not operator on the given predicate. +func Not(p predicate.InstanceMetadata) predicate.InstanceMetadata { + return predicate.InstanceMetadata(sql.NotPredicates(p)) +} diff --git a/ent/instancemetadata_create.go b/ent/instancemetadata_create.go new file mode 100644 index 0000000..21ce7dd --- /dev/null +++ b/ent/instancemetadata_create.go @@ -0,0 +1,1971 @@ +// Code generated by ent, DO NOT EDIT. + +package ent + +import ( + "context" + "errors" + "fmt" + "time" + + "entgo.io/ent/dialect" + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "entgo.io/ent/schema/field" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/ent/user" + "github.com/lysand-org/versia-go/pkg/lysand" +) + +// InstanceMetadataCreate is the builder for creating a InstanceMetadata entity. +type InstanceMetadataCreate struct { + config + mutation *InstanceMetadataMutation + hooks []Hook + conflict []sql.ConflictOption +} + +// SetIsRemote sets the "isRemote" field. +func (imc *InstanceMetadataCreate) SetIsRemote(b bool) *InstanceMetadataCreate { + imc.mutation.SetIsRemote(b) + return imc +} + +// SetURI sets the "uri" field. +func (imc *InstanceMetadataCreate) SetURI(s string) *InstanceMetadataCreate { + imc.mutation.SetURI(s) + return imc +} + +// SetExtensions sets the "extensions" field. +func (imc *InstanceMetadataCreate) SetExtensions(l lysand.Extensions) *InstanceMetadataCreate { + imc.mutation.SetExtensions(l) + return imc +} + +// SetCreatedAt sets the "created_at" field. +func (imc *InstanceMetadataCreate) SetCreatedAt(t time.Time) *InstanceMetadataCreate { + imc.mutation.SetCreatedAt(t) + return imc +} + +// SetNillableCreatedAt sets the "created_at" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableCreatedAt(t *time.Time) *InstanceMetadataCreate { + if t != nil { + imc.SetCreatedAt(*t) + } + return imc +} + +// SetUpdatedAt sets the "updated_at" field. +func (imc *InstanceMetadataCreate) SetUpdatedAt(t time.Time) *InstanceMetadataCreate { + imc.mutation.SetUpdatedAt(t) + return imc +} + +// SetNillableUpdatedAt sets the "updated_at" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableUpdatedAt(t *time.Time) *InstanceMetadataCreate { + if t != nil { + imc.SetUpdatedAt(*t) + } + return imc +} + +// SetName sets the "name" field. +func (imc *InstanceMetadataCreate) SetName(s string) *InstanceMetadataCreate { + imc.mutation.SetName(s) + return imc +} + +// SetDescription sets the "description" field. +func (imc *InstanceMetadataCreate) SetDescription(s string) *InstanceMetadataCreate { + imc.mutation.SetDescription(s) + return imc +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableDescription(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetDescription(*s) + } + return imc +} + +// SetHost sets the "host" field. +func (imc *InstanceMetadataCreate) SetHost(s string) *InstanceMetadataCreate { + imc.mutation.SetHost(s) + return imc +} + +// SetPublicKey sets the "publicKey" field. +func (imc *InstanceMetadataCreate) SetPublicKey(b []byte) *InstanceMetadataCreate { + imc.mutation.SetPublicKey(b) + return imc +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (imc *InstanceMetadataCreate) SetPublicKeyAlgorithm(s string) *InstanceMetadataCreate { + imc.mutation.SetPublicKeyAlgorithm(s) + return imc +} + +// SetPrivateKey sets the "privateKey" field. +func (imc *InstanceMetadataCreate) SetPrivateKey(b []byte) *InstanceMetadataCreate { + imc.mutation.SetPrivateKey(b) + return imc +} + +// SetSoftwareName sets the "softwareName" field. +func (imc *InstanceMetadataCreate) SetSoftwareName(s string) *InstanceMetadataCreate { + imc.mutation.SetSoftwareName(s) + return imc +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (imc *InstanceMetadataCreate) SetSoftwareVersion(s string) *InstanceMetadataCreate { + imc.mutation.SetSoftwareVersion(s) + return imc +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (imc *InstanceMetadataCreate) SetSharedInboxURI(s string) *InstanceMetadataCreate { + imc.mutation.SetSharedInboxURI(s) + return imc +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (imc *InstanceMetadataCreate) SetModeratorsURI(s string) *InstanceMetadataCreate { + imc.mutation.SetModeratorsURI(s) + return imc +} + +// SetNillableModeratorsURI sets the "moderatorsURI" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableModeratorsURI(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetModeratorsURI(*s) + } + return imc +} + +// SetAdminsURI sets the "adminsURI" field. +func (imc *InstanceMetadataCreate) SetAdminsURI(s string) *InstanceMetadataCreate { + imc.mutation.SetAdminsURI(s) + return imc +} + +// SetNillableAdminsURI sets the "adminsURI" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableAdminsURI(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetAdminsURI(*s) + } + return imc +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (imc *InstanceMetadataCreate) SetLogoEndpoint(s string) *InstanceMetadataCreate { + imc.mutation.SetLogoEndpoint(s) + return imc +} + +// SetNillableLogoEndpoint sets the "logoEndpoint" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableLogoEndpoint(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetLogoEndpoint(*s) + } + return imc +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (imc *InstanceMetadataCreate) SetLogoMimeType(s string) *InstanceMetadataCreate { + imc.mutation.SetLogoMimeType(s) + return imc +} + +// SetNillableLogoMimeType sets the "logoMimeType" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableLogoMimeType(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetLogoMimeType(*s) + } + return imc +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (imc *InstanceMetadataCreate) SetBannerEndpoint(s string) *InstanceMetadataCreate { + imc.mutation.SetBannerEndpoint(s) + return imc +} + +// SetNillableBannerEndpoint sets the "bannerEndpoint" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableBannerEndpoint(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetBannerEndpoint(*s) + } + return imc +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (imc *InstanceMetadataCreate) SetBannerMimeType(s string) *InstanceMetadataCreate { + imc.mutation.SetBannerMimeType(s) + return imc +} + +// SetNillableBannerMimeType sets the "bannerMimeType" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableBannerMimeType(s *string) *InstanceMetadataCreate { + if s != nil { + imc.SetBannerMimeType(*s) + } + return imc +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (imc *InstanceMetadataCreate) SetSupportedVersions(s []string) *InstanceMetadataCreate { + imc.mutation.SetSupportedVersions(s) + return imc +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (imc *InstanceMetadataCreate) SetSupportedExtensions(s []string) *InstanceMetadataCreate { + imc.mutation.SetSupportedExtensions(s) + return imc +} + +// SetID sets the "id" field. +func (imc *InstanceMetadataCreate) SetID(u uuid.UUID) *InstanceMetadataCreate { + imc.mutation.SetID(u) + return imc +} + +// SetNillableID sets the "id" field if the given value is not nil. +func (imc *InstanceMetadataCreate) SetNillableID(u *uuid.UUID) *InstanceMetadataCreate { + if u != nil { + imc.SetID(*u) + } + return imc +} + +// AddUserIDs adds the "users" edge to the User entity by IDs. +func (imc *InstanceMetadataCreate) AddUserIDs(ids ...uuid.UUID) *InstanceMetadataCreate { + imc.mutation.AddUserIDs(ids...) + return imc +} + +// AddUsers adds the "users" edges to the User entity. +func (imc *InstanceMetadataCreate) AddUsers(u ...*User) *InstanceMetadataCreate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imc.AddUserIDs(ids...) +} + +// AddModeratorIDs adds the "moderators" edge to the User entity by IDs. +func (imc *InstanceMetadataCreate) AddModeratorIDs(ids ...uuid.UUID) *InstanceMetadataCreate { + imc.mutation.AddModeratorIDs(ids...) + return imc +} + +// AddModerators adds the "moderators" edges to the User entity. +func (imc *InstanceMetadataCreate) AddModerators(u ...*User) *InstanceMetadataCreate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imc.AddModeratorIDs(ids...) +} + +// AddAdminIDs adds the "admins" edge to the User entity by IDs. +func (imc *InstanceMetadataCreate) AddAdminIDs(ids ...uuid.UUID) *InstanceMetadataCreate { + imc.mutation.AddAdminIDs(ids...) + return imc +} + +// AddAdmins adds the "admins" edges to the User entity. +func (imc *InstanceMetadataCreate) AddAdmins(u ...*User) *InstanceMetadataCreate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imc.AddAdminIDs(ids...) +} + +// Mutation returns the InstanceMetadataMutation object of the builder. +func (imc *InstanceMetadataCreate) Mutation() *InstanceMetadataMutation { + return imc.mutation +} + +// Save creates the InstanceMetadata in the database. +func (imc *InstanceMetadataCreate) Save(ctx context.Context) (*InstanceMetadata, error) { + imc.defaults() + return withHooks(ctx, imc.sqlSave, imc.mutation, imc.hooks) +} + +// SaveX calls Save and panics if Save returns an error. +func (imc *InstanceMetadataCreate) SaveX(ctx context.Context) *InstanceMetadata { + v, err := imc.Save(ctx) + if err != nil { + panic(err) + } + return v +} + +// Exec executes the query. +func (imc *InstanceMetadataCreate) Exec(ctx context.Context) error { + _, err := imc.Save(ctx) + return err +} + +// ExecX is like Exec, but panics if an error occurs. +func (imc *InstanceMetadataCreate) ExecX(ctx context.Context) { + if err := imc.Exec(ctx); err != nil { + panic(err) + } +} + +// defaults sets the default values of the builder before save. +func (imc *InstanceMetadataCreate) defaults() { + if _, ok := imc.mutation.Extensions(); !ok { + v := instancemetadata.DefaultExtensions + imc.mutation.SetExtensions(v) + } + if _, ok := imc.mutation.CreatedAt(); !ok { + v := instancemetadata.DefaultCreatedAt() + imc.mutation.SetCreatedAt(v) + } + if _, ok := imc.mutation.UpdatedAt(); !ok { + v := instancemetadata.DefaultUpdatedAt() + imc.mutation.SetUpdatedAt(v) + } + if _, ok := imc.mutation.SupportedVersions(); !ok { + v := instancemetadata.DefaultSupportedVersions + imc.mutation.SetSupportedVersions(v) + } + if _, ok := imc.mutation.SupportedExtensions(); !ok { + v := instancemetadata.DefaultSupportedExtensions + imc.mutation.SetSupportedExtensions(v) + } + if _, ok := imc.mutation.ID(); !ok { + v := instancemetadata.DefaultID() + imc.mutation.SetID(v) + } +} + +// check runs all checks and user-defined validators on the builder. +func (imc *InstanceMetadataCreate) check() error { + if _, ok := imc.mutation.IsRemote(); !ok { + return &ValidationError{Name: "isRemote", err: errors.New(`ent: missing required field "InstanceMetadata.isRemote"`)} + } + if _, ok := imc.mutation.URI(); !ok { + return &ValidationError{Name: "uri", err: errors.New(`ent: missing required field "InstanceMetadata.uri"`)} + } + if v, ok := imc.mutation.URI(); ok { + if err := instancemetadata.URIValidator(v); err != nil { + return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.uri": %w`, err)} + } + } + if _, ok := imc.mutation.Extensions(); !ok { + return &ValidationError{Name: "extensions", err: errors.New(`ent: missing required field "InstanceMetadata.extensions"`)} + } + if _, ok := imc.mutation.CreatedAt(); !ok { + return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "InstanceMetadata.created_at"`)} + } + if _, ok := imc.mutation.UpdatedAt(); !ok { + return &ValidationError{Name: "updated_at", err: errors.New(`ent: missing required field "InstanceMetadata.updated_at"`)} + } + if _, ok := imc.mutation.Name(); !ok { + return &ValidationError{Name: "name", err: errors.New(`ent: missing required field "InstanceMetadata.name"`)} + } + if v, ok := imc.mutation.Name(); ok { + if err := instancemetadata.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.name": %w`, err)} + } + } + if _, ok := imc.mutation.Host(); !ok { + return &ValidationError{Name: "host", err: errors.New(`ent: missing required field "InstanceMetadata.host"`)} + } + if v, ok := imc.mutation.Host(); ok { + if err := instancemetadata.HostValidator(v); err != nil { + return &ValidationError{Name: "host", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.host": %w`, err)} + } + } + if _, ok := imc.mutation.PublicKey(); !ok { + return &ValidationError{Name: "publicKey", err: errors.New(`ent: missing required field "InstanceMetadata.publicKey"`)} + } + if _, ok := imc.mutation.PublicKeyAlgorithm(); !ok { + return &ValidationError{Name: "publicKeyAlgorithm", err: errors.New(`ent: missing required field "InstanceMetadata.publicKeyAlgorithm"`)} + } + if _, ok := imc.mutation.SoftwareName(); !ok { + return &ValidationError{Name: "softwareName", err: errors.New(`ent: missing required field "InstanceMetadata.softwareName"`)} + } + if v, ok := imc.mutation.SoftwareName(); ok { + if err := instancemetadata.SoftwareNameValidator(v); err != nil { + return &ValidationError{Name: "softwareName", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareName": %w`, err)} + } + } + if _, ok := imc.mutation.SoftwareVersion(); !ok { + return &ValidationError{Name: "softwareVersion", err: errors.New(`ent: missing required field "InstanceMetadata.softwareVersion"`)} + } + if v, ok := imc.mutation.SoftwareVersion(); ok { + if err := instancemetadata.SoftwareVersionValidator(v); err != nil { + return &ValidationError{Name: "softwareVersion", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareVersion": %w`, err)} + } + } + if _, ok := imc.mutation.SharedInboxURI(); !ok { + return &ValidationError{Name: "sharedInboxURI", err: errors.New(`ent: missing required field "InstanceMetadata.sharedInboxURI"`)} + } + if v, ok := imc.mutation.SharedInboxURI(); ok { + if err := instancemetadata.SharedInboxURIValidator(v); err != nil { + return &ValidationError{Name: "sharedInboxURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.sharedInboxURI": %w`, err)} + } + } + if v, ok := imc.mutation.ModeratorsURI(); ok { + if err := instancemetadata.ModeratorsURIValidator(v); err != nil { + return &ValidationError{Name: "moderatorsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.moderatorsURI": %w`, err)} + } + } + if v, ok := imc.mutation.AdminsURI(); ok { + if err := instancemetadata.AdminsURIValidator(v); err != nil { + return &ValidationError{Name: "adminsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.adminsURI": %w`, err)} + } + } + if v, ok := imc.mutation.LogoEndpoint(); ok { + if err := instancemetadata.LogoEndpointValidator(v); err != nil { + return &ValidationError{Name: "logoEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoEndpoint": %w`, err)} + } + } + if v, ok := imc.mutation.LogoMimeType(); ok { + if err := instancemetadata.LogoMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "logoMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoMimeType": %w`, err)} + } + } + if v, ok := imc.mutation.BannerEndpoint(); ok { + if err := instancemetadata.BannerEndpointValidator(v); err != nil { + return &ValidationError{Name: "bannerEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerEndpoint": %w`, err)} + } + } + if v, ok := imc.mutation.BannerMimeType(); ok { + if err := instancemetadata.BannerMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "bannerMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerMimeType": %w`, err)} + } + } + if _, ok := imc.mutation.SupportedVersions(); !ok { + return &ValidationError{Name: "supportedVersions", err: errors.New(`ent: missing required field "InstanceMetadata.supportedVersions"`)} + } + if _, ok := imc.mutation.SupportedExtensions(); !ok { + return &ValidationError{Name: "supportedExtensions", err: errors.New(`ent: missing required field "InstanceMetadata.supportedExtensions"`)} + } + return nil +} + +func (imc *InstanceMetadataCreate) sqlSave(ctx context.Context) (*InstanceMetadata, error) { + if err := imc.check(); err != nil { + return nil, err + } + _node, _spec := imc.createSpec() + if err := sqlgraph.CreateNode(ctx, imc.driver, _spec); err != nil { + if sqlgraph.IsConstraintError(err) { + err = &ConstraintError{msg: err.Error(), wrap: err} + } + return nil, err + } + if _spec.ID.Value != nil { + if id, ok := _spec.ID.Value.(*uuid.UUID); ok { + _node.ID = *id + } else if err := _node.ID.Scan(_spec.ID.Value); err != nil { + return nil, err + } + } + imc.mutation.id = &_node.ID + imc.mutation.done = true + return _node, nil +} + +func (imc *InstanceMetadataCreate) createSpec() (*InstanceMetadata, *sqlgraph.CreateSpec) { + var ( + _node = &InstanceMetadata{config: imc.config} + _spec = sqlgraph.NewCreateSpec(instancemetadata.Table, sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID)) + ) + _spec.OnConflict = imc.conflict + if id, ok := imc.mutation.ID(); ok { + _node.ID = id + _spec.ID.Value = &id + } + if value, ok := imc.mutation.IsRemote(); ok { + _spec.SetField(instancemetadata.FieldIsRemote, field.TypeBool, value) + _node.IsRemote = value + } + if value, ok := imc.mutation.URI(); ok { + _spec.SetField(instancemetadata.FieldURI, field.TypeString, value) + _node.URI = value + } + if value, ok := imc.mutation.Extensions(); ok { + _spec.SetField(instancemetadata.FieldExtensions, field.TypeJSON, value) + _node.Extensions = value + } + if value, ok := imc.mutation.CreatedAt(); ok { + _spec.SetField(instancemetadata.FieldCreatedAt, field.TypeTime, value) + _node.CreatedAt = value + } + if value, ok := imc.mutation.UpdatedAt(); ok { + _spec.SetField(instancemetadata.FieldUpdatedAt, field.TypeTime, value) + _node.UpdatedAt = value + } + if value, ok := imc.mutation.Name(); ok { + _spec.SetField(instancemetadata.FieldName, field.TypeString, value) + _node.Name = value + } + if value, ok := imc.mutation.Description(); ok { + _spec.SetField(instancemetadata.FieldDescription, field.TypeString, value) + _node.Description = &value + } + if value, ok := imc.mutation.Host(); ok { + _spec.SetField(instancemetadata.FieldHost, field.TypeString, value) + _node.Host = value + } + if value, ok := imc.mutation.PublicKey(); ok { + _spec.SetField(instancemetadata.FieldPublicKey, field.TypeBytes, value) + _node.PublicKey = value + } + if value, ok := imc.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(instancemetadata.FieldPublicKeyAlgorithm, field.TypeString, value) + _node.PublicKeyAlgorithm = value + } + if value, ok := imc.mutation.PrivateKey(); ok { + _spec.SetField(instancemetadata.FieldPrivateKey, field.TypeBytes, value) + _node.PrivateKey = value + } + if value, ok := imc.mutation.SoftwareName(); ok { + _spec.SetField(instancemetadata.FieldSoftwareName, field.TypeString, value) + _node.SoftwareName = value + } + if value, ok := imc.mutation.SoftwareVersion(); ok { + _spec.SetField(instancemetadata.FieldSoftwareVersion, field.TypeString, value) + _node.SoftwareVersion = value + } + if value, ok := imc.mutation.SharedInboxURI(); ok { + _spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value) + _node.SharedInboxURI = value + } + if value, ok := imc.mutation.ModeratorsURI(); ok { + _spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value) + _node.ModeratorsURI = &value + } + if value, ok := imc.mutation.AdminsURI(); ok { + _spec.SetField(instancemetadata.FieldAdminsURI, field.TypeString, value) + _node.AdminsURI = &value + } + if value, ok := imc.mutation.LogoEndpoint(); ok { + _spec.SetField(instancemetadata.FieldLogoEndpoint, field.TypeString, value) + _node.LogoEndpoint = &value + } + if value, ok := imc.mutation.LogoMimeType(); ok { + _spec.SetField(instancemetadata.FieldLogoMimeType, field.TypeString, value) + _node.LogoMimeType = &value + } + if value, ok := imc.mutation.BannerEndpoint(); ok { + _spec.SetField(instancemetadata.FieldBannerEndpoint, field.TypeString, value) + _node.BannerEndpoint = &value + } + if value, ok := imc.mutation.BannerMimeType(); ok { + _spec.SetField(instancemetadata.FieldBannerMimeType, field.TypeString, value) + _node.BannerMimeType = &value + } + if value, ok := imc.mutation.SupportedVersions(); ok { + _spec.SetField(instancemetadata.FieldSupportedVersions, field.TypeJSON, value) + _node.SupportedVersions = value + } + if value, ok := imc.mutation.SupportedExtensions(); ok { + _spec.SetField(instancemetadata.FieldSupportedExtensions, field.TypeJSON, value) + _node.SupportedExtensions = value + } + if nodes := imc.mutation.UsersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } + if nodes := imc.mutation.ModeratorsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } + if nodes := imc.mutation.AdminsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } + return _node, _spec +} + +// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause +// of the `INSERT` statement. For example: +// +// client.InstanceMetadata.Create(). +// SetIsRemote(v). +// OnConflict( +// // Update the row with the new values +// // the was proposed for insertion. +// sql.ResolveWithNewValues(), +// ). +// // Override some of the fields with custom +// // update values. +// Update(func(u *ent.InstanceMetadataUpsert) { +// SetIsRemote(v+v). +// }). +// Exec(ctx) +func (imc *InstanceMetadataCreate) OnConflict(opts ...sql.ConflictOption) *InstanceMetadataUpsertOne { + imc.conflict = opts + return &InstanceMetadataUpsertOne{ + create: imc, + } +} + +// OnConflictColumns calls `OnConflict` and configures the columns +// as conflict target. Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict(sql.ConflictColumns(columns...)). +// Exec(ctx) +func (imc *InstanceMetadataCreate) OnConflictColumns(columns ...string) *InstanceMetadataUpsertOne { + imc.conflict = append(imc.conflict, sql.ConflictColumns(columns...)) + return &InstanceMetadataUpsertOne{ + create: imc, + } +} + +type ( + // InstanceMetadataUpsertOne is the builder for "upsert"-ing + // one InstanceMetadata node. + InstanceMetadataUpsertOne struct { + create *InstanceMetadataCreate + } + + // InstanceMetadataUpsert is the "OnConflict" setter. + InstanceMetadataUpsert struct { + *sql.UpdateSet + } +) + +// SetIsRemote sets the "isRemote" field. +func (u *InstanceMetadataUpsert) SetIsRemote(v bool) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldIsRemote, v) + return u +} + +// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateIsRemote() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldIsRemote) + return u +} + +// SetURI sets the "uri" field. +func (u *InstanceMetadataUpsert) SetURI(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldURI, v) + return u +} + +// UpdateURI sets the "uri" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateURI() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldURI) + return u +} + +// SetExtensions sets the "extensions" field. +func (u *InstanceMetadataUpsert) SetExtensions(v lysand.Extensions) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldExtensions, v) + return u +} + +// UpdateExtensions sets the "extensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateExtensions() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldExtensions) + return u +} + +// SetUpdatedAt sets the "updated_at" field. +func (u *InstanceMetadataUpsert) SetUpdatedAt(v time.Time) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldUpdatedAt, v) + return u +} + +// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateUpdatedAt() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldUpdatedAt) + return u +} + +// SetName sets the "name" field. +func (u *InstanceMetadataUpsert) SetName(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldName, v) + return u +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateName() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldName) + return u +} + +// SetDescription sets the "description" field. +func (u *InstanceMetadataUpsert) SetDescription(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldDescription, v) + return u +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateDescription() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldDescription) + return u +} + +// ClearDescription clears the value of the "description" field. +func (u *InstanceMetadataUpsert) ClearDescription() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldDescription) + return u +} + +// SetHost sets the "host" field. +func (u *InstanceMetadataUpsert) SetHost(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldHost, v) + return u +} + +// UpdateHost sets the "host" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateHost() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldHost) + return u +} + +// SetPublicKey sets the "publicKey" field. +func (u *InstanceMetadataUpsert) SetPublicKey(v []byte) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldPublicKey, v) + return u +} + +// UpdatePublicKey sets the "publicKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdatePublicKey() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldPublicKey) + return u +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *InstanceMetadataUpsert) SetPublicKeyAlgorithm(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldPublicKeyAlgorithm, v) + return u +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdatePublicKeyAlgorithm() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldPublicKeyAlgorithm) + return u +} + +// SetPrivateKey sets the "privateKey" field. +func (u *InstanceMetadataUpsert) SetPrivateKey(v []byte) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldPrivateKey, v) + return u +} + +// UpdatePrivateKey sets the "privateKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdatePrivateKey() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldPrivateKey) + return u +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (u *InstanceMetadataUpsert) ClearPrivateKey() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldPrivateKey) + return u +} + +// SetSoftwareName sets the "softwareName" field. +func (u *InstanceMetadataUpsert) SetSoftwareName(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldSoftwareName, v) + return u +} + +// UpdateSoftwareName sets the "softwareName" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateSoftwareName() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldSoftwareName) + return u +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (u *InstanceMetadataUpsert) SetSoftwareVersion(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldSoftwareVersion, v) + return u +} + +// UpdateSoftwareVersion sets the "softwareVersion" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateSoftwareVersion() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldSoftwareVersion) + return u +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (u *InstanceMetadataUpsert) SetSharedInboxURI(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldSharedInboxURI, v) + return u +} + +// UpdateSharedInboxURI sets the "sharedInboxURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateSharedInboxURI() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldSharedInboxURI) + return u +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (u *InstanceMetadataUpsert) SetModeratorsURI(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldModeratorsURI, v) + return u +} + +// UpdateModeratorsURI sets the "moderatorsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateModeratorsURI() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldModeratorsURI) + return u +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (u *InstanceMetadataUpsert) ClearModeratorsURI() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldModeratorsURI) + return u +} + +// SetAdminsURI sets the "adminsURI" field. +func (u *InstanceMetadataUpsert) SetAdminsURI(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldAdminsURI, v) + return u +} + +// UpdateAdminsURI sets the "adminsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateAdminsURI() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldAdminsURI) + return u +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (u *InstanceMetadataUpsert) ClearAdminsURI() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldAdminsURI) + return u +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (u *InstanceMetadataUpsert) SetLogoEndpoint(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldLogoEndpoint, v) + return u +} + +// UpdateLogoEndpoint sets the "logoEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateLogoEndpoint() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldLogoEndpoint) + return u +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (u *InstanceMetadataUpsert) ClearLogoEndpoint() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldLogoEndpoint) + return u +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (u *InstanceMetadataUpsert) SetLogoMimeType(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldLogoMimeType, v) + return u +} + +// UpdateLogoMimeType sets the "logoMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateLogoMimeType() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldLogoMimeType) + return u +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (u *InstanceMetadataUpsert) ClearLogoMimeType() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldLogoMimeType) + return u +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (u *InstanceMetadataUpsert) SetBannerEndpoint(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldBannerEndpoint, v) + return u +} + +// UpdateBannerEndpoint sets the "bannerEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateBannerEndpoint() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldBannerEndpoint) + return u +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (u *InstanceMetadataUpsert) ClearBannerEndpoint() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldBannerEndpoint) + return u +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (u *InstanceMetadataUpsert) SetBannerMimeType(v string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldBannerMimeType, v) + return u +} + +// UpdateBannerMimeType sets the "bannerMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateBannerMimeType() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldBannerMimeType) + return u +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (u *InstanceMetadataUpsert) ClearBannerMimeType() *InstanceMetadataUpsert { + u.SetNull(instancemetadata.FieldBannerMimeType) + return u +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (u *InstanceMetadataUpsert) SetSupportedVersions(v []string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldSupportedVersions, v) + return u +} + +// UpdateSupportedVersions sets the "supportedVersions" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateSupportedVersions() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldSupportedVersions) + return u +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (u *InstanceMetadataUpsert) SetSupportedExtensions(v []string) *InstanceMetadataUpsert { + u.Set(instancemetadata.FieldSupportedExtensions, v) + return u +} + +// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsert) UpdateSupportedExtensions() *InstanceMetadataUpsert { + u.SetExcluded(instancemetadata.FieldSupportedExtensions) + return u +} + +// UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field. +// Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict( +// sql.ResolveWithNewValues(), +// sql.ResolveWith(func(u *sql.UpdateSet) { +// u.SetIgnore(instancemetadata.FieldID) +// }), +// ). +// Exec(ctx) +func (u *InstanceMetadataUpsertOne) UpdateNewValues() *InstanceMetadataUpsertOne { + u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) + u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { + if _, exists := u.create.mutation.ID(); exists { + s.SetIgnore(instancemetadata.FieldID) + } + if _, exists := u.create.mutation.CreatedAt(); exists { + s.SetIgnore(instancemetadata.FieldCreatedAt) + } + })) + return u +} + +// Ignore sets each column to itself in case of conflict. +// Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict(sql.ResolveWithIgnore()). +// Exec(ctx) +func (u *InstanceMetadataUpsertOne) Ignore() *InstanceMetadataUpsertOne { + u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) + return u +} + +// DoNothing configures the conflict_action to `DO NOTHING`. +// Supported only by SQLite and PostgreSQL. +func (u *InstanceMetadataUpsertOne) DoNothing() *InstanceMetadataUpsertOne { + u.create.conflict = append(u.create.conflict, sql.DoNothing()) + return u +} + +// Update allows overriding fields `UPDATE` values. See the InstanceMetadataCreate.OnConflict +// documentation for more info. +func (u *InstanceMetadataUpsertOne) Update(set func(*InstanceMetadataUpsert)) *InstanceMetadataUpsertOne { + u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { + set(&InstanceMetadataUpsert{UpdateSet: update}) + })) + return u +} + +// SetIsRemote sets the "isRemote" field. +func (u *InstanceMetadataUpsertOne) SetIsRemote(v bool) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetIsRemote(v) + }) +} + +// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateIsRemote() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateIsRemote() + }) +} + +// SetURI sets the "uri" field. +func (u *InstanceMetadataUpsertOne) SetURI(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetURI(v) + }) +} + +// UpdateURI sets the "uri" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateURI() + }) +} + +// SetExtensions sets the "extensions" field. +func (u *InstanceMetadataUpsertOne) SetExtensions(v lysand.Extensions) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetExtensions(v) + }) +} + +// UpdateExtensions sets the "extensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateExtensions() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateExtensions() + }) +} + +// SetUpdatedAt sets the "updated_at" field. +func (u *InstanceMetadataUpsertOne) SetUpdatedAt(v time.Time) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetUpdatedAt(v) + }) +} + +// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateUpdatedAt() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateUpdatedAt() + }) +} + +// SetName sets the "name" field. +func (u *InstanceMetadataUpsertOne) SetName(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetName(v) + }) +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateName() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateName() + }) +} + +// SetDescription sets the "description" field. +func (u *InstanceMetadataUpsertOne) SetDescription(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetDescription(v) + }) +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateDescription() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateDescription() + }) +} + +// ClearDescription clears the value of the "description" field. +func (u *InstanceMetadataUpsertOne) ClearDescription() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearDescription() + }) +} + +// SetHost sets the "host" field. +func (u *InstanceMetadataUpsertOne) SetHost(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetHost(v) + }) +} + +// UpdateHost sets the "host" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateHost() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateHost() + }) +} + +// SetPublicKey sets the "publicKey" field. +func (u *InstanceMetadataUpsertOne) SetPublicKey(v []byte) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPublicKey(v) + }) +} + +// UpdatePublicKey sets the "publicKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdatePublicKey() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePublicKey() + }) +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *InstanceMetadataUpsertOne) SetPublicKeyAlgorithm(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPublicKeyAlgorithm(v) + }) +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdatePublicKeyAlgorithm() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePublicKeyAlgorithm() + }) +} + +// SetPrivateKey sets the "privateKey" field. +func (u *InstanceMetadataUpsertOne) SetPrivateKey(v []byte) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPrivateKey(v) + }) +} + +// UpdatePrivateKey sets the "privateKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdatePrivateKey() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePrivateKey() + }) +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (u *InstanceMetadataUpsertOne) ClearPrivateKey() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearPrivateKey() + }) +} + +// SetSoftwareName sets the "softwareName" field. +func (u *InstanceMetadataUpsertOne) SetSoftwareName(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSoftwareName(v) + }) +} + +// UpdateSoftwareName sets the "softwareName" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateSoftwareName() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSoftwareName() + }) +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (u *InstanceMetadataUpsertOne) SetSoftwareVersion(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSoftwareVersion(v) + }) +} + +// UpdateSoftwareVersion sets the "softwareVersion" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateSoftwareVersion() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSoftwareVersion() + }) +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (u *InstanceMetadataUpsertOne) SetSharedInboxURI(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSharedInboxURI(v) + }) +} + +// UpdateSharedInboxURI sets the "sharedInboxURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateSharedInboxURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSharedInboxURI() + }) +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (u *InstanceMetadataUpsertOne) SetModeratorsURI(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetModeratorsURI(v) + }) +} + +// UpdateModeratorsURI sets the "moderatorsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateModeratorsURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateModeratorsURI() + }) +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (u *InstanceMetadataUpsertOne) ClearModeratorsURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearModeratorsURI() + }) +} + +// SetAdminsURI sets the "adminsURI" field. +func (u *InstanceMetadataUpsertOne) SetAdminsURI(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetAdminsURI(v) + }) +} + +// UpdateAdminsURI sets the "adminsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateAdminsURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateAdminsURI() + }) +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (u *InstanceMetadataUpsertOne) ClearAdminsURI() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearAdminsURI() + }) +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (u *InstanceMetadataUpsertOne) SetLogoEndpoint(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetLogoEndpoint(v) + }) +} + +// UpdateLogoEndpoint sets the "logoEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateLogoEndpoint() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateLogoEndpoint() + }) +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (u *InstanceMetadataUpsertOne) ClearLogoEndpoint() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearLogoEndpoint() + }) +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (u *InstanceMetadataUpsertOne) SetLogoMimeType(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetLogoMimeType(v) + }) +} + +// UpdateLogoMimeType sets the "logoMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateLogoMimeType() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateLogoMimeType() + }) +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (u *InstanceMetadataUpsertOne) ClearLogoMimeType() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearLogoMimeType() + }) +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (u *InstanceMetadataUpsertOne) SetBannerEndpoint(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetBannerEndpoint(v) + }) +} + +// UpdateBannerEndpoint sets the "bannerEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateBannerEndpoint() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateBannerEndpoint() + }) +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (u *InstanceMetadataUpsertOne) ClearBannerEndpoint() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearBannerEndpoint() + }) +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (u *InstanceMetadataUpsertOne) SetBannerMimeType(v string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetBannerMimeType(v) + }) +} + +// UpdateBannerMimeType sets the "bannerMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateBannerMimeType() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateBannerMimeType() + }) +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (u *InstanceMetadataUpsertOne) ClearBannerMimeType() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearBannerMimeType() + }) +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (u *InstanceMetadataUpsertOne) SetSupportedVersions(v []string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSupportedVersions(v) + }) +} + +// UpdateSupportedVersions sets the "supportedVersions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateSupportedVersions() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSupportedVersions() + }) +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (u *InstanceMetadataUpsertOne) SetSupportedExtensions(v []string) *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSupportedExtensions(v) + }) +} + +// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertOne) UpdateSupportedExtensions() *InstanceMetadataUpsertOne { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSupportedExtensions() + }) +} + +// Exec executes the query. +func (u *InstanceMetadataUpsertOne) Exec(ctx context.Context) error { + if len(u.create.conflict) == 0 { + return errors.New("ent: missing options for InstanceMetadataCreate.OnConflict") + } + return u.create.Exec(ctx) +} + +// ExecX is like Exec, but panics if an error occurs. +func (u *InstanceMetadataUpsertOne) ExecX(ctx context.Context) { + if err := u.create.Exec(ctx); err != nil { + panic(err) + } +} + +// Exec executes the UPSERT query and returns the inserted/updated ID. +func (u *InstanceMetadataUpsertOne) ID(ctx context.Context) (id uuid.UUID, err error) { + if u.create.driver.Dialect() == dialect.MySQL { + // In case of "ON CONFLICT", there is no way to get back non-numeric ID + // fields from the database since MySQL does not support the RETURNING clause. + return id, errors.New("ent: InstanceMetadataUpsertOne.ID is not supported by MySQL driver. Use InstanceMetadataUpsertOne.Exec instead") + } + node, err := u.create.Save(ctx) + if err != nil { + return id, err + } + return node.ID, nil +} + +// IDX is like ID, but panics if an error occurs. +func (u *InstanceMetadataUpsertOne) IDX(ctx context.Context) uuid.UUID { + id, err := u.ID(ctx) + if err != nil { + panic(err) + } + return id +} + +// InstanceMetadataCreateBulk is the builder for creating many InstanceMetadata entities in bulk. +type InstanceMetadataCreateBulk struct { + config + err error + builders []*InstanceMetadataCreate + conflict []sql.ConflictOption +} + +// Save creates the InstanceMetadata entities in the database. +func (imcb *InstanceMetadataCreateBulk) Save(ctx context.Context) ([]*InstanceMetadata, error) { + if imcb.err != nil { + return nil, imcb.err + } + specs := make([]*sqlgraph.CreateSpec, len(imcb.builders)) + nodes := make([]*InstanceMetadata, len(imcb.builders)) + mutators := make([]Mutator, len(imcb.builders)) + for i := range imcb.builders { + func(i int, root context.Context) { + builder := imcb.builders[i] + builder.defaults() + var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) { + mutation, ok := m.(*InstanceMetadataMutation) + if !ok { + return nil, fmt.Errorf("unexpected mutation type %T", m) + } + if err := builder.check(); err != nil { + return nil, err + } + builder.mutation = mutation + var err error + nodes[i], specs[i] = builder.createSpec() + if i < len(mutators)-1 { + _, err = mutators[i+1].Mutate(root, imcb.builders[i+1].mutation) + } else { + spec := &sqlgraph.BatchCreateSpec{Nodes: specs} + spec.OnConflict = imcb.conflict + // Invoke the actual operation on the latest mutation in the chain. + if err = sqlgraph.BatchCreate(ctx, imcb.driver, spec); err != nil { + if sqlgraph.IsConstraintError(err) { + err = &ConstraintError{msg: err.Error(), wrap: err} + } + } + } + if err != nil { + return nil, err + } + mutation.id = &nodes[i].ID + mutation.done = true + return nodes[i], nil + }) + for i := len(builder.hooks) - 1; i >= 0; i-- { + mut = builder.hooks[i](mut) + } + mutators[i] = mut + }(i, ctx) + } + if len(mutators) > 0 { + if _, err := mutators[0].Mutate(ctx, imcb.builders[0].mutation); err != nil { + return nil, err + } + } + return nodes, nil +} + +// SaveX is like Save, but panics if an error occurs. +func (imcb *InstanceMetadataCreateBulk) SaveX(ctx context.Context) []*InstanceMetadata { + v, err := imcb.Save(ctx) + if err != nil { + panic(err) + } + return v +} + +// Exec executes the query. +func (imcb *InstanceMetadataCreateBulk) Exec(ctx context.Context) error { + _, err := imcb.Save(ctx) + return err +} + +// ExecX is like Exec, but panics if an error occurs. +func (imcb *InstanceMetadataCreateBulk) ExecX(ctx context.Context) { + if err := imcb.Exec(ctx); err != nil { + panic(err) + } +} + +// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause +// of the `INSERT` statement. For example: +// +// client.InstanceMetadata.CreateBulk(builders...). +// OnConflict( +// // Update the row with the new values +// // the was proposed for insertion. +// sql.ResolveWithNewValues(), +// ). +// // Override some of the fields with custom +// // update values. +// Update(func(u *ent.InstanceMetadataUpsert) { +// SetIsRemote(v+v). +// }). +// Exec(ctx) +func (imcb *InstanceMetadataCreateBulk) OnConflict(opts ...sql.ConflictOption) *InstanceMetadataUpsertBulk { + imcb.conflict = opts + return &InstanceMetadataUpsertBulk{ + create: imcb, + } +} + +// OnConflictColumns calls `OnConflict` and configures the columns +// as conflict target. Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict(sql.ConflictColumns(columns...)). +// Exec(ctx) +func (imcb *InstanceMetadataCreateBulk) OnConflictColumns(columns ...string) *InstanceMetadataUpsertBulk { + imcb.conflict = append(imcb.conflict, sql.ConflictColumns(columns...)) + return &InstanceMetadataUpsertBulk{ + create: imcb, + } +} + +// InstanceMetadataUpsertBulk is the builder for "upsert"-ing +// a bulk of InstanceMetadata nodes. +type InstanceMetadataUpsertBulk struct { + create *InstanceMetadataCreateBulk +} + +// UpdateNewValues updates the mutable fields using the new values that +// were set on create. Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict( +// sql.ResolveWithNewValues(), +// sql.ResolveWith(func(u *sql.UpdateSet) { +// u.SetIgnore(instancemetadata.FieldID) +// }), +// ). +// Exec(ctx) +func (u *InstanceMetadataUpsertBulk) UpdateNewValues() *InstanceMetadataUpsertBulk { + u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) + u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { + for _, b := range u.create.builders { + if _, exists := b.mutation.ID(); exists { + s.SetIgnore(instancemetadata.FieldID) + } + if _, exists := b.mutation.CreatedAt(); exists { + s.SetIgnore(instancemetadata.FieldCreatedAt) + } + } + })) + return u +} + +// Ignore sets each column to itself in case of conflict. +// Using this option is equivalent to using: +// +// client.InstanceMetadata.Create(). +// OnConflict(sql.ResolveWithIgnore()). +// Exec(ctx) +func (u *InstanceMetadataUpsertBulk) Ignore() *InstanceMetadataUpsertBulk { + u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) + return u +} + +// DoNothing configures the conflict_action to `DO NOTHING`. +// Supported only by SQLite and PostgreSQL. +func (u *InstanceMetadataUpsertBulk) DoNothing() *InstanceMetadataUpsertBulk { + u.create.conflict = append(u.create.conflict, sql.DoNothing()) + return u +} + +// Update allows overriding fields `UPDATE` values. See the InstanceMetadataCreateBulk.OnConflict +// documentation for more info. +func (u *InstanceMetadataUpsertBulk) Update(set func(*InstanceMetadataUpsert)) *InstanceMetadataUpsertBulk { + u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { + set(&InstanceMetadataUpsert{UpdateSet: update}) + })) + return u +} + +// SetIsRemote sets the "isRemote" field. +func (u *InstanceMetadataUpsertBulk) SetIsRemote(v bool) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetIsRemote(v) + }) +} + +// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateIsRemote() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateIsRemote() + }) +} + +// SetURI sets the "uri" field. +func (u *InstanceMetadataUpsertBulk) SetURI(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetURI(v) + }) +} + +// UpdateURI sets the "uri" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateURI() + }) +} + +// SetExtensions sets the "extensions" field. +func (u *InstanceMetadataUpsertBulk) SetExtensions(v lysand.Extensions) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetExtensions(v) + }) +} + +// UpdateExtensions sets the "extensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateExtensions() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateExtensions() + }) +} + +// SetUpdatedAt sets the "updated_at" field. +func (u *InstanceMetadataUpsertBulk) SetUpdatedAt(v time.Time) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetUpdatedAt(v) + }) +} + +// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateUpdatedAt() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateUpdatedAt() + }) +} + +// SetName sets the "name" field. +func (u *InstanceMetadataUpsertBulk) SetName(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetName(v) + }) +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateName() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateName() + }) +} + +// SetDescription sets the "description" field. +func (u *InstanceMetadataUpsertBulk) SetDescription(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetDescription(v) + }) +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateDescription() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateDescription() + }) +} + +// ClearDescription clears the value of the "description" field. +func (u *InstanceMetadataUpsertBulk) ClearDescription() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearDescription() + }) +} + +// SetHost sets the "host" field. +func (u *InstanceMetadataUpsertBulk) SetHost(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetHost(v) + }) +} + +// UpdateHost sets the "host" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateHost() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateHost() + }) +} + +// SetPublicKey sets the "publicKey" field. +func (u *InstanceMetadataUpsertBulk) SetPublicKey(v []byte) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPublicKey(v) + }) +} + +// UpdatePublicKey sets the "publicKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdatePublicKey() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePublicKey() + }) +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *InstanceMetadataUpsertBulk) SetPublicKeyAlgorithm(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPublicKeyAlgorithm(v) + }) +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdatePublicKeyAlgorithm() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePublicKeyAlgorithm() + }) +} + +// SetPrivateKey sets the "privateKey" field. +func (u *InstanceMetadataUpsertBulk) SetPrivateKey(v []byte) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetPrivateKey(v) + }) +} + +// UpdatePrivateKey sets the "privateKey" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdatePrivateKey() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdatePrivateKey() + }) +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (u *InstanceMetadataUpsertBulk) ClearPrivateKey() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearPrivateKey() + }) +} + +// SetSoftwareName sets the "softwareName" field. +func (u *InstanceMetadataUpsertBulk) SetSoftwareName(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSoftwareName(v) + }) +} + +// UpdateSoftwareName sets the "softwareName" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateSoftwareName() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSoftwareName() + }) +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (u *InstanceMetadataUpsertBulk) SetSoftwareVersion(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSoftwareVersion(v) + }) +} + +// UpdateSoftwareVersion sets the "softwareVersion" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateSoftwareVersion() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSoftwareVersion() + }) +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (u *InstanceMetadataUpsertBulk) SetSharedInboxURI(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSharedInboxURI(v) + }) +} + +// UpdateSharedInboxURI sets the "sharedInboxURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateSharedInboxURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSharedInboxURI() + }) +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (u *InstanceMetadataUpsertBulk) SetModeratorsURI(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetModeratorsURI(v) + }) +} + +// UpdateModeratorsURI sets the "moderatorsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateModeratorsURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateModeratorsURI() + }) +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (u *InstanceMetadataUpsertBulk) ClearModeratorsURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearModeratorsURI() + }) +} + +// SetAdminsURI sets the "adminsURI" field. +func (u *InstanceMetadataUpsertBulk) SetAdminsURI(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetAdminsURI(v) + }) +} + +// UpdateAdminsURI sets the "adminsURI" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateAdminsURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateAdminsURI() + }) +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (u *InstanceMetadataUpsertBulk) ClearAdminsURI() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearAdminsURI() + }) +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (u *InstanceMetadataUpsertBulk) SetLogoEndpoint(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetLogoEndpoint(v) + }) +} + +// UpdateLogoEndpoint sets the "logoEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateLogoEndpoint() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateLogoEndpoint() + }) +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (u *InstanceMetadataUpsertBulk) ClearLogoEndpoint() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearLogoEndpoint() + }) +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (u *InstanceMetadataUpsertBulk) SetLogoMimeType(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetLogoMimeType(v) + }) +} + +// UpdateLogoMimeType sets the "logoMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateLogoMimeType() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateLogoMimeType() + }) +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (u *InstanceMetadataUpsertBulk) ClearLogoMimeType() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearLogoMimeType() + }) +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (u *InstanceMetadataUpsertBulk) SetBannerEndpoint(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetBannerEndpoint(v) + }) +} + +// UpdateBannerEndpoint sets the "bannerEndpoint" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateBannerEndpoint() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateBannerEndpoint() + }) +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (u *InstanceMetadataUpsertBulk) ClearBannerEndpoint() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearBannerEndpoint() + }) +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (u *InstanceMetadataUpsertBulk) SetBannerMimeType(v string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetBannerMimeType(v) + }) +} + +// UpdateBannerMimeType sets the "bannerMimeType" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateBannerMimeType() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateBannerMimeType() + }) +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (u *InstanceMetadataUpsertBulk) ClearBannerMimeType() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.ClearBannerMimeType() + }) +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (u *InstanceMetadataUpsertBulk) SetSupportedVersions(v []string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSupportedVersions(v) + }) +} + +// UpdateSupportedVersions sets the "supportedVersions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateSupportedVersions() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSupportedVersions() + }) +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (u *InstanceMetadataUpsertBulk) SetSupportedExtensions(v []string) *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.SetSupportedExtensions(v) + }) +} + +// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. +func (u *InstanceMetadataUpsertBulk) UpdateSupportedExtensions() *InstanceMetadataUpsertBulk { + return u.Update(func(s *InstanceMetadataUpsert) { + s.UpdateSupportedExtensions() + }) +} + +// Exec executes the query. +func (u *InstanceMetadataUpsertBulk) Exec(ctx context.Context) error { + if u.create.err != nil { + return u.create.err + } + for i, b := range u.create.builders { + if len(b.conflict) != 0 { + return fmt.Errorf("ent: OnConflict was set for builder %d. Set it on the InstanceMetadataCreateBulk instead", i) + } + } + if len(u.create.conflict) == 0 { + return errors.New("ent: missing options for InstanceMetadataCreateBulk.OnConflict") + } + return u.create.Exec(ctx) +} + +// ExecX is like Exec, but panics if an error occurs. +func (u *InstanceMetadataUpsertBulk) ExecX(ctx context.Context) { + if err := u.create.Exec(ctx); err != nil { + panic(err) + } +} diff --git a/ent/instancemetadata_delete.go b/ent/instancemetadata_delete.go new file mode 100644 index 0000000..11b59cd --- /dev/null +++ b/ent/instancemetadata_delete.go @@ -0,0 +1,88 @@ +// Code generated by ent, DO NOT EDIT. + +package ent + +import ( + "context" + + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "entgo.io/ent/schema/field" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/ent/predicate" +) + +// InstanceMetadataDelete is the builder for deleting a InstanceMetadata entity. +type InstanceMetadataDelete struct { + config + hooks []Hook + mutation *InstanceMetadataMutation +} + +// Where appends a list predicates to the InstanceMetadataDelete builder. +func (imd *InstanceMetadataDelete) Where(ps ...predicate.InstanceMetadata) *InstanceMetadataDelete { + imd.mutation.Where(ps...) + return imd +} + +// Exec executes the deletion query and returns how many vertices were deleted. +func (imd *InstanceMetadataDelete) Exec(ctx context.Context) (int, error) { + return withHooks(ctx, imd.sqlExec, imd.mutation, imd.hooks) +} + +// ExecX is like Exec, but panics if an error occurs. +func (imd *InstanceMetadataDelete) ExecX(ctx context.Context) int { + n, err := imd.Exec(ctx) + if err != nil { + panic(err) + } + return n +} + +func (imd *InstanceMetadataDelete) sqlExec(ctx context.Context) (int, error) { + _spec := sqlgraph.NewDeleteSpec(instancemetadata.Table, sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID)) + if ps := imd.mutation.predicates; len(ps) > 0 { + _spec.Predicate = func(selector *sql.Selector) { + for i := range ps { + ps[i](selector) + } + } + } + affected, err := sqlgraph.DeleteNodes(ctx, imd.driver, _spec) + if err != nil && sqlgraph.IsConstraintError(err) { + err = &ConstraintError{msg: err.Error(), wrap: err} + } + imd.mutation.done = true + return affected, err +} + +// InstanceMetadataDeleteOne is the builder for deleting a single InstanceMetadata entity. +type InstanceMetadataDeleteOne struct { + imd *InstanceMetadataDelete +} + +// Where appends a list predicates to the InstanceMetadataDelete builder. +func (imdo *InstanceMetadataDeleteOne) Where(ps ...predicate.InstanceMetadata) *InstanceMetadataDeleteOne { + imdo.imd.mutation.Where(ps...) + return imdo +} + +// Exec executes the deletion query. +func (imdo *InstanceMetadataDeleteOne) Exec(ctx context.Context) error { + n, err := imdo.imd.Exec(ctx) + switch { + case err != nil: + return err + case n == 0: + return &NotFoundError{instancemetadata.Label} + default: + return nil + } +} + +// ExecX is like Exec, but panics if an error occurs. +func (imdo *InstanceMetadataDeleteOne) ExecX(ctx context.Context) { + if err := imdo.Exec(ctx); err != nil { + panic(err) + } +} diff --git a/ent/instancemetadata_query.go b/ent/instancemetadata_query.go new file mode 100644 index 0000000..379f0fa --- /dev/null +++ b/ent/instancemetadata_query.go @@ -0,0 +1,845 @@ +// Code generated by ent, DO NOT EDIT. + +package ent + +import ( + "context" + "database/sql/driver" + "fmt" + "math" + + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "entgo.io/ent/schema/field" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/ent/predicate" + "github.com/lysand-org/versia-go/ent/user" +) + +// InstanceMetadataQuery is the builder for querying InstanceMetadata entities. +type InstanceMetadataQuery struct { + config + ctx *QueryContext + order []instancemetadata.OrderOption + inters []Interceptor + predicates []predicate.InstanceMetadata + withUsers *UserQuery + withModerators *UserQuery + withAdmins *UserQuery + // intermediate query (i.e. traversal path). + sql *sql.Selector + path func(context.Context) (*sql.Selector, error) +} + +// Where adds a new predicate for the InstanceMetadataQuery builder. +func (imq *InstanceMetadataQuery) Where(ps ...predicate.InstanceMetadata) *InstanceMetadataQuery { + imq.predicates = append(imq.predicates, ps...) + return imq +} + +// Limit the number of records to be returned by this query. +func (imq *InstanceMetadataQuery) Limit(limit int) *InstanceMetadataQuery { + imq.ctx.Limit = &limit + return imq +} + +// Offset to start from. +func (imq *InstanceMetadataQuery) Offset(offset int) *InstanceMetadataQuery { + imq.ctx.Offset = &offset + return imq +} + +// Unique configures the query builder to filter duplicate records on query. +// By default, unique is set to true, and can be disabled using this method. +func (imq *InstanceMetadataQuery) Unique(unique bool) *InstanceMetadataQuery { + imq.ctx.Unique = &unique + return imq +} + +// Order specifies how the records should be ordered. +func (imq *InstanceMetadataQuery) Order(o ...instancemetadata.OrderOption) *InstanceMetadataQuery { + imq.order = append(imq.order, o...) + return imq +} + +// QueryUsers chains the current query on the "users" edge. +func (imq *InstanceMetadataQuery) QueryUsers() *UserQuery { + query := (&UserClient{config: imq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := imq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := imq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, selector), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.UsersTable, instancemetadata.UsersPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(imq.driver.Dialect(), step) + return fromU, nil + } + return query +} + +// QueryModerators chains the current query on the "moderators" edge. +func (imq *InstanceMetadataQuery) QueryModerators() *UserQuery { + query := (&UserClient{config: imq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := imq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := imq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, selector), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.ModeratorsTable, instancemetadata.ModeratorsPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(imq.driver.Dialect(), step) + return fromU, nil + } + return query +} + +// QueryAdmins chains the current query on the "admins" edge. +func (imq *InstanceMetadataQuery) QueryAdmins() *UserQuery { + query := (&UserClient{config: imq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := imq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := imq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(instancemetadata.Table, instancemetadata.FieldID, selector), + sqlgraph.To(user.Table, user.FieldID), + sqlgraph.Edge(sqlgraph.M2M, false, instancemetadata.AdminsTable, instancemetadata.AdminsPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(imq.driver.Dialect(), step) + return fromU, nil + } + return query +} + +// First returns the first InstanceMetadata entity from the query. +// Returns a *NotFoundError when no InstanceMetadata was found. +func (imq *InstanceMetadataQuery) First(ctx context.Context) (*InstanceMetadata, error) { + nodes, err := imq.Limit(1).All(setContextOp(ctx, imq.ctx, "First")) + if err != nil { + return nil, err + } + if len(nodes) == 0 { + return nil, &NotFoundError{instancemetadata.Label} + } + return nodes[0], nil +} + +// FirstX is like First, but panics if an error occurs. +func (imq *InstanceMetadataQuery) FirstX(ctx context.Context) *InstanceMetadata { + node, err := imq.First(ctx) + if err != nil && !IsNotFound(err) { + panic(err) + } + return node +} + +// FirstID returns the first InstanceMetadata ID from the query. +// Returns a *NotFoundError when no InstanceMetadata ID was found. +func (imq *InstanceMetadataQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) { + var ids []uuid.UUID + if ids, err = imq.Limit(1).IDs(setContextOp(ctx, imq.ctx, "FirstID")); err != nil { + return + } + if len(ids) == 0 { + err = &NotFoundError{instancemetadata.Label} + return + } + return ids[0], nil +} + +// FirstIDX is like FirstID, but panics if an error occurs. +func (imq *InstanceMetadataQuery) FirstIDX(ctx context.Context) uuid.UUID { + id, err := imq.FirstID(ctx) + if err != nil && !IsNotFound(err) { + panic(err) + } + return id +} + +// Only returns a single InstanceMetadata entity found by the query, ensuring it only returns one. +// Returns a *NotSingularError when more than one InstanceMetadata entity is found. +// Returns a *NotFoundError when no InstanceMetadata entities are found. +func (imq *InstanceMetadataQuery) Only(ctx context.Context) (*InstanceMetadata, error) { + nodes, err := imq.Limit(2).All(setContextOp(ctx, imq.ctx, "Only")) + if err != nil { + return nil, err + } + switch len(nodes) { + case 1: + return nodes[0], nil + case 0: + return nil, &NotFoundError{instancemetadata.Label} + default: + return nil, &NotSingularError{instancemetadata.Label} + } +} + +// OnlyX is like Only, but panics if an error occurs. +func (imq *InstanceMetadataQuery) OnlyX(ctx context.Context) *InstanceMetadata { + node, err := imq.Only(ctx) + if err != nil { + panic(err) + } + return node +} + +// OnlyID is like Only, but returns the only InstanceMetadata ID in the query. +// Returns a *NotSingularError when more than one InstanceMetadata ID is found. +// Returns a *NotFoundError when no entities are found. +func (imq *InstanceMetadataQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) { + var ids []uuid.UUID + if ids, err = imq.Limit(2).IDs(setContextOp(ctx, imq.ctx, "OnlyID")); err != nil { + return + } + switch len(ids) { + case 1: + id = ids[0] + case 0: + err = &NotFoundError{instancemetadata.Label} + default: + err = &NotSingularError{instancemetadata.Label} + } + return +} + +// OnlyIDX is like OnlyID, but panics if an error occurs. +func (imq *InstanceMetadataQuery) OnlyIDX(ctx context.Context) uuid.UUID { + id, err := imq.OnlyID(ctx) + if err != nil { + panic(err) + } + return id +} + +// All executes the query and returns a list of InstanceMetadataSlice. +func (imq *InstanceMetadataQuery) All(ctx context.Context) ([]*InstanceMetadata, error) { + ctx = setContextOp(ctx, imq.ctx, "All") + if err := imq.prepareQuery(ctx); err != nil { + return nil, err + } + qr := querierAll[[]*InstanceMetadata, *InstanceMetadataQuery]() + return withInterceptors[[]*InstanceMetadata](ctx, imq, qr, imq.inters) +} + +// AllX is like All, but panics if an error occurs. +func (imq *InstanceMetadataQuery) AllX(ctx context.Context) []*InstanceMetadata { + nodes, err := imq.All(ctx) + if err != nil { + panic(err) + } + return nodes +} + +// IDs executes the query and returns a list of InstanceMetadata IDs. +func (imq *InstanceMetadataQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) { + if imq.ctx.Unique == nil && imq.path != nil { + imq.Unique(true) + } + ctx = setContextOp(ctx, imq.ctx, "IDs") + if err = imq.Select(instancemetadata.FieldID).Scan(ctx, &ids); err != nil { + return nil, err + } + return ids, nil +} + +// IDsX is like IDs, but panics if an error occurs. +func (imq *InstanceMetadataQuery) IDsX(ctx context.Context) []uuid.UUID { + ids, err := imq.IDs(ctx) + if err != nil { + panic(err) + } + return ids +} + +// Count returns the count of the given query. +func (imq *InstanceMetadataQuery) Count(ctx context.Context) (int, error) { + ctx = setContextOp(ctx, imq.ctx, "Count") + if err := imq.prepareQuery(ctx); err != nil { + return 0, err + } + return withInterceptors[int](ctx, imq, querierCount[*InstanceMetadataQuery](), imq.inters) +} + +// CountX is like Count, but panics if an error occurs. +func (imq *InstanceMetadataQuery) CountX(ctx context.Context) int { + count, err := imq.Count(ctx) + if err != nil { + panic(err) + } + return count +} + +// Exist returns true if the query has elements in the graph. +func (imq *InstanceMetadataQuery) Exist(ctx context.Context) (bool, error) { + ctx = setContextOp(ctx, imq.ctx, "Exist") + switch _, err := imq.FirstID(ctx); { + case IsNotFound(err): + return false, nil + case err != nil: + return false, fmt.Errorf("ent: check existence: %w", err) + default: + return true, nil + } +} + +// ExistX is like Exist, but panics if an error occurs. +func (imq *InstanceMetadataQuery) ExistX(ctx context.Context) bool { + exist, err := imq.Exist(ctx) + if err != nil { + panic(err) + } + return exist +} + +// Clone returns a duplicate of the InstanceMetadataQuery builder, including all associated steps. It can be +// used to prepare common query builders and use them differently after the clone is made. +func (imq *InstanceMetadataQuery) Clone() *InstanceMetadataQuery { + if imq == nil { + return nil + } + return &InstanceMetadataQuery{ + config: imq.config, + ctx: imq.ctx.Clone(), + order: append([]instancemetadata.OrderOption{}, imq.order...), + inters: append([]Interceptor{}, imq.inters...), + predicates: append([]predicate.InstanceMetadata{}, imq.predicates...), + withUsers: imq.withUsers.Clone(), + withModerators: imq.withModerators.Clone(), + withAdmins: imq.withAdmins.Clone(), + // clone intermediate query. + sql: imq.sql.Clone(), + path: imq.path, + } +} + +// WithUsers tells the query-builder to eager-load the nodes that are connected to +// the "users" edge. The optional arguments are used to configure the query builder of the edge. +func (imq *InstanceMetadataQuery) WithUsers(opts ...func(*UserQuery)) *InstanceMetadataQuery { + query := (&UserClient{config: imq.config}).Query() + for _, opt := range opts { + opt(query) + } + imq.withUsers = query + return imq +} + +// WithModerators tells the query-builder to eager-load the nodes that are connected to +// the "moderators" edge. The optional arguments are used to configure the query builder of the edge. +func (imq *InstanceMetadataQuery) WithModerators(opts ...func(*UserQuery)) *InstanceMetadataQuery { + query := (&UserClient{config: imq.config}).Query() + for _, opt := range opts { + opt(query) + } + imq.withModerators = query + return imq +} + +// WithAdmins tells the query-builder to eager-load the nodes that are connected to +// the "admins" edge. The optional arguments are used to configure the query builder of the edge. +func (imq *InstanceMetadataQuery) WithAdmins(opts ...func(*UserQuery)) *InstanceMetadataQuery { + query := (&UserClient{config: imq.config}).Query() + for _, opt := range opts { + opt(query) + } + imq.withAdmins = query + return imq +} + +// GroupBy is used to group vertices by one or more fields/columns. +// It is often used with aggregate functions, like: count, max, mean, min, sum. +// +// Example: +// +// var v []struct { +// IsRemote bool `json:"isRemote,omitempty"` +// Count int `json:"count,omitempty"` +// } +// +// client.InstanceMetadata.Query(). +// GroupBy(instancemetadata.FieldIsRemote). +// Aggregate(ent.Count()). +// Scan(ctx, &v) +func (imq *InstanceMetadataQuery) GroupBy(field string, fields ...string) *InstanceMetadataGroupBy { + imq.ctx.Fields = append([]string{field}, fields...) + grbuild := &InstanceMetadataGroupBy{build: imq} + grbuild.flds = &imq.ctx.Fields + grbuild.label = instancemetadata.Label + grbuild.scan = grbuild.Scan + return grbuild +} + +// Select allows the selection one or more fields/columns for the given query, +// instead of selecting all fields in the entity. +// +// Example: +// +// var v []struct { +// IsRemote bool `json:"isRemote,omitempty"` +// } +// +// client.InstanceMetadata.Query(). +// Select(instancemetadata.FieldIsRemote). +// Scan(ctx, &v) +func (imq *InstanceMetadataQuery) Select(fields ...string) *InstanceMetadataSelect { + imq.ctx.Fields = append(imq.ctx.Fields, fields...) + sbuild := &InstanceMetadataSelect{InstanceMetadataQuery: imq} + sbuild.label = instancemetadata.Label + sbuild.flds, sbuild.scan = &imq.ctx.Fields, sbuild.Scan + return sbuild +} + +// Aggregate returns a InstanceMetadataSelect configured with the given aggregations. +func (imq *InstanceMetadataQuery) Aggregate(fns ...AggregateFunc) *InstanceMetadataSelect { + return imq.Select().Aggregate(fns...) +} + +func (imq *InstanceMetadataQuery) prepareQuery(ctx context.Context) error { + for _, inter := range imq.inters { + if inter == nil { + return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)") + } + if trv, ok := inter.(Traverser); ok { + if err := trv.Traverse(ctx, imq); err != nil { + return err + } + } + } + for _, f := range imq.ctx.Fields { + if !instancemetadata.ValidColumn(f) { + return &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} + } + } + if imq.path != nil { + prev, err := imq.path(ctx) + if err != nil { + return err + } + imq.sql = prev + } + return nil +} + +func (imq *InstanceMetadataQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*InstanceMetadata, error) { + var ( + nodes = []*InstanceMetadata{} + _spec = imq.querySpec() + loadedTypes = [3]bool{ + imq.withUsers != nil, + imq.withModerators != nil, + imq.withAdmins != nil, + } + ) + _spec.ScanValues = func(columns []string) ([]any, error) { + return (*InstanceMetadata).scanValues(nil, columns) + } + _spec.Assign = func(columns []string, values []any) error { + node := &InstanceMetadata{config: imq.config} + nodes = append(nodes, node) + node.Edges.loadedTypes = loadedTypes + return node.assignValues(columns, values) + } + for i := range hooks { + hooks[i](ctx, _spec) + } + if err := sqlgraph.QueryNodes(ctx, imq.driver, _spec); err != nil { + return nil, err + } + if len(nodes) == 0 { + return nodes, nil + } + if query := imq.withUsers; query != nil { + if err := imq.loadUsers(ctx, query, nodes, + func(n *InstanceMetadata) { n.Edges.Users = []*User{} }, + func(n *InstanceMetadata, e *User) { n.Edges.Users = append(n.Edges.Users, e) }); err != nil { + return nil, err + } + } + if query := imq.withModerators; query != nil { + if err := imq.loadModerators(ctx, query, nodes, + func(n *InstanceMetadata) { n.Edges.Moderators = []*User{} }, + func(n *InstanceMetadata, e *User) { n.Edges.Moderators = append(n.Edges.Moderators, e) }); err != nil { + return nil, err + } + } + if query := imq.withAdmins; query != nil { + if err := imq.loadAdmins(ctx, query, nodes, + func(n *InstanceMetadata) { n.Edges.Admins = []*User{} }, + func(n *InstanceMetadata, e *User) { n.Edges.Admins = append(n.Edges.Admins, e) }); err != nil { + return nil, err + } + } + return nodes, nil +} + +func (imq *InstanceMetadataQuery) loadUsers(ctx context.Context, query *UserQuery, nodes []*InstanceMetadata, init func(*InstanceMetadata), assign func(*InstanceMetadata, *User)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*InstanceMetadata) + nids := make(map[uuid.UUID]map[*InstanceMetadata]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(instancemetadata.UsersTable) + s.Join(joinT).On(s.C(user.FieldID), joinT.C(instancemetadata.UsersPrimaryKey[1])) + s.Where(sql.InValues(joinT.C(instancemetadata.UsersPrimaryKey[0]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(instancemetadata.UsersPrimaryKey[0])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*InstanceMetadata]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*User](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "users" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} +func (imq *InstanceMetadataQuery) loadModerators(ctx context.Context, query *UserQuery, nodes []*InstanceMetadata, init func(*InstanceMetadata), assign func(*InstanceMetadata, *User)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*InstanceMetadata) + nids := make(map[uuid.UUID]map[*InstanceMetadata]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(instancemetadata.ModeratorsTable) + s.Join(joinT).On(s.C(user.FieldID), joinT.C(instancemetadata.ModeratorsPrimaryKey[1])) + s.Where(sql.InValues(joinT.C(instancemetadata.ModeratorsPrimaryKey[0]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(instancemetadata.ModeratorsPrimaryKey[0])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*InstanceMetadata]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*User](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "moderators" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} +func (imq *InstanceMetadataQuery) loadAdmins(ctx context.Context, query *UserQuery, nodes []*InstanceMetadata, init func(*InstanceMetadata), assign func(*InstanceMetadata, *User)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*InstanceMetadata) + nids := make(map[uuid.UUID]map[*InstanceMetadata]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(instancemetadata.AdminsTable) + s.Join(joinT).On(s.C(user.FieldID), joinT.C(instancemetadata.AdminsPrimaryKey[1])) + s.Where(sql.InValues(joinT.C(instancemetadata.AdminsPrimaryKey[0]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(instancemetadata.AdminsPrimaryKey[0])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*InstanceMetadata]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*User](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "admins" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} + +func (imq *InstanceMetadataQuery) sqlCount(ctx context.Context) (int, error) { + _spec := imq.querySpec() + _spec.Node.Columns = imq.ctx.Fields + if len(imq.ctx.Fields) > 0 { + _spec.Unique = imq.ctx.Unique != nil && *imq.ctx.Unique + } + return sqlgraph.CountNodes(ctx, imq.driver, _spec) +} + +func (imq *InstanceMetadataQuery) querySpec() *sqlgraph.QuerySpec { + _spec := sqlgraph.NewQuerySpec(instancemetadata.Table, instancemetadata.Columns, sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID)) + _spec.From = imq.sql + if unique := imq.ctx.Unique; unique != nil { + _spec.Unique = *unique + } else if imq.path != nil { + _spec.Unique = true + } + if fields := imq.ctx.Fields; len(fields) > 0 { + _spec.Node.Columns = make([]string, 0, len(fields)) + _spec.Node.Columns = append(_spec.Node.Columns, instancemetadata.FieldID) + for i := range fields { + if fields[i] != instancemetadata.FieldID { + _spec.Node.Columns = append(_spec.Node.Columns, fields[i]) + } + } + } + if ps := imq.predicates; len(ps) > 0 { + _spec.Predicate = func(selector *sql.Selector) { + for i := range ps { + ps[i](selector) + } + } + } + if limit := imq.ctx.Limit; limit != nil { + _spec.Limit = *limit + } + if offset := imq.ctx.Offset; offset != nil { + _spec.Offset = *offset + } + if ps := imq.order; len(ps) > 0 { + _spec.Order = func(selector *sql.Selector) { + for i := range ps { + ps[i](selector) + } + } + } + return _spec +} + +func (imq *InstanceMetadataQuery) sqlQuery(ctx context.Context) *sql.Selector { + builder := sql.Dialect(imq.driver.Dialect()) + t1 := builder.Table(instancemetadata.Table) + columns := imq.ctx.Fields + if len(columns) == 0 { + columns = instancemetadata.Columns + } + selector := builder.Select(t1.Columns(columns...)...).From(t1) + if imq.sql != nil { + selector = imq.sql + selector.Select(selector.Columns(columns...)...) + } + if imq.ctx.Unique != nil && *imq.ctx.Unique { + selector.Distinct() + } + for _, p := range imq.predicates { + p(selector) + } + for _, p := range imq.order { + p(selector) + } + if offset := imq.ctx.Offset; offset != nil { + // limit is mandatory for offset clause. We start + // with default value, and override it below if needed. + selector.Offset(*offset).Limit(math.MaxInt32) + } + if limit := imq.ctx.Limit; limit != nil { + selector.Limit(*limit) + } + return selector +} + +// InstanceMetadataGroupBy is the group-by builder for InstanceMetadata entities. +type InstanceMetadataGroupBy struct { + selector + build *InstanceMetadataQuery +} + +// Aggregate adds the given aggregation functions to the group-by query. +func (imgb *InstanceMetadataGroupBy) Aggregate(fns ...AggregateFunc) *InstanceMetadataGroupBy { + imgb.fns = append(imgb.fns, fns...) + return imgb +} + +// Scan applies the selector query and scans the result into the given value. +func (imgb *InstanceMetadataGroupBy) Scan(ctx context.Context, v any) error { + ctx = setContextOp(ctx, imgb.build.ctx, "GroupBy") + if err := imgb.build.prepareQuery(ctx); err != nil { + return err + } + return scanWithInterceptors[*InstanceMetadataQuery, *InstanceMetadataGroupBy](ctx, imgb.build, imgb, imgb.build.inters, v) +} + +func (imgb *InstanceMetadataGroupBy) sqlScan(ctx context.Context, root *InstanceMetadataQuery, v any) error { + selector := root.sqlQuery(ctx).Select() + aggregation := make([]string, 0, len(imgb.fns)) + for _, fn := range imgb.fns { + aggregation = append(aggregation, fn(selector)) + } + if len(selector.SelectedColumns()) == 0 { + columns := make([]string, 0, len(*imgb.flds)+len(imgb.fns)) + for _, f := range *imgb.flds { + columns = append(columns, selector.C(f)) + } + columns = append(columns, aggregation...) + selector.Select(columns...) + } + selector.GroupBy(selector.Columns(*imgb.flds...)...) + if err := selector.Err(); err != nil { + return err + } + rows := &sql.Rows{} + query, args := selector.Query() + if err := imgb.build.driver.Query(ctx, query, args, rows); err != nil { + return err + } + defer rows.Close() + return sql.ScanSlice(rows, v) +} + +// InstanceMetadataSelect is the builder for selecting fields of InstanceMetadata entities. +type InstanceMetadataSelect struct { + *InstanceMetadataQuery + selector +} + +// Aggregate adds the given aggregation functions to the selector query. +func (ims *InstanceMetadataSelect) Aggregate(fns ...AggregateFunc) *InstanceMetadataSelect { + ims.fns = append(ims.fns, fns...) + return ims +} + +// Scan applies the selector query and scans the result into the given value. +func (ims *InstanceMetadataSelect) Scan(ctx context.Context, v any) error { + ctx = setContextOp(ctx, ims.ctx, "Select") + if err := ims.prepareQuery(ctx); err != nil { + return err + } + return scanWithInterceptors[*InstanceMetadataQuery, *InstanceMetadataSelect](ctx, ims.InstanceMetadataQuery, ims, ims.inters, v) +} + +func (ims *InstanceMetadataSelect) sqlScan(ctx context.Context, root *InstanceMetadataQuery, v any) error { + selector := root.sqlQuery(ctx) + aggregation := make([]string, 0, len(ims.fns)) + for _, fn := range ims.fns { + aggregation = append(aggregation, fn(selector)) + } + switch n := len(*ims.selector.flds); { + case n == 0 && len(aggregation) > 0: + selector.Select(aggregation...) + case n != 0 && len(aggregation) > 0: + selector.AppendSelect(aggregation...) + } + rows := &sql.Rows{} + query, args := selector.Query() + if err := ims.driver.Query(ctx, query, args, rows); err != nil { + return err + } + defer rows.Close() + return sql.ScanSlice(rows, v) +} diff --git a/ent/instancemetadata_update.go b/ent/instancemetadata_update.go new file mode 100644 index 0000000..57fbc43 --- /dev/null +++ b/ent/instancemetadata_update.go @@ -0,0 +1,1626 @@ +// Code generated by ent, DO NOT EDIT. + +package ent + +import ( + "context" + "errors" + "fmt" + "time" + + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqlgraph" + "entgo.io/ent/dialect/sql/sqljson" + "entgo.io/ent/schema/field" + "github.com/google/uuid" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/ent/predicate" + "github.com/lysand-org/versia-go/ent/user" + "github.com/lysand-org/versia-go/pkg/lysand" +) + +// InstanceMetadataUpdate is the builder for updating InstanceMetadata entities. +type InstanceMetadataUpdate struct { + config + hooks []Hook + mutation *InstanceMetadataMutation +} + +// Where appends a list predicates to the InstanceMetadataUpdate builder. +func (imu *InstanceMetadataUpdate) Where(ps ...predicate.InstanceMetadata) *InstanceMetadataUpdate { + imu.mutation.Where(ps...) + return imu +} + +// SetIsRemote sets the "isRemote" field. +func (imu *InstanceMetadataUpdate) SetIsRemote(b bool) *InstanceMetadataUpdate { + imu.mutation.SetIsRemote(b) + return imu +} + +// SetNillableIsRemote sets the "isRemote" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableIsRemote(b *bool) *InstanceMetadataUpdate { + if b != nil { + imu.SetIsRemote(*b) + } + return imu +} + +// SetURI sets the "uri" field. +func (imu *InstanceMetadataUpdate) SetURI(s string) *InstanceMetadataUpdate { + imu.mutation.SetURI(s) + return imu +} + +// SetNillableURI sets the "uri" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableURI(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetURI(*s) + } + return imu +} + +// SetExtensions sets the "extensions" field. +func (imu *InstanceMetadataUpdate) SetExtensions(l lysand.Extensions) *InstanceMetadataUpdate { + imu.mutation.SetExtensions(l) + return imu +} + +// SetUpdatedAt sets the "updated_at" field. +func (imu *InstanceMetadataUpdate) SetUpdatedAt(t time.Time) *InstanceMetadataUpdate { + imu.mutation.SetUpdatedAt(t) + return imu +} + +// SetName sets the "name" field. +func (imu *InstanceMetadataUpdate) SetName(s string) *InstanceMetadataUpdate { + imu.mutation.SetName(s) + return imu +} + +// SetNillableName sets the "name" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableName(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetName(*s) + } + return imu +} + +// SetDescription sets the "description" field. +func (imu *InstanceMetadataUpdate) SetDescription(s string) *InstanceMetadataUpdate { + imu.mutation.SetDescription(s) + return imu +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableDescription(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetDescription(*s) + } + return imu +} + +// ClearDescription clears the value of the "description" field. +func (imu *InstanceMetadataUpdate) ClearDescription() *InstanceMetadataUpdate { + imu.mutation.ClearDescription() + return imu +} + +// SetHost sets the "host" field. +func (imu *InstanceMetadataUpdate) SetHost(s string) *InstanceMetadataUpdate { + imu.mutation.SetHost(s) + return imu +} + +// SetNillableHost sets the "host" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableHost(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetHost(*s) + } + return imu +} + +// SetPublicKey sets the "publicKey" field. +func (imu *InstanceMetadataUpdate) SetPublicKey(b []byte) *InstanceMetadataUpdate { + imu.mutation.SetPublicKey(b) + return imu +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (imu *InstanceMetadataUpdate) SetPublicKeyAlgorithm(s string) *InstanceMetadataUpdate { + imu.mutation.SetPublicKeyAlgorithm(s) + return imu +} + +// SetNillablePublicKeyAlgorithm sets the "publicKeyAlgorithm" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillablePublicKeyAlgorithm(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetPublicKeyAlgorithm(*s) + } + return imu +} + +// SetPrivateKey sets the "privateKey" field. +func (imu *InstanceMetadataUpdate) SetPrivateKey(b []byte) *InstanceMetadataUpdate { + imu.mutation.SetPrivateKey(b) + return imu +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (imu *InstanceMetadataUpdate) ClearPrivateKey() *InstanceMetadataUpdate { + imu.mutation.ClearPrivateKey() + return imu +} + +// SetSoftwareName sets the "softwareName" field. +func (imu *InstanceMetadataUpdate) SetSoftwareName(s string) *InstanceMetadataUpdate { + imu.mutation.SetSoftwareName(s) + return imu +} + +// SetNillableSoftwareName sets the "softwareName" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableSoftwareName(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetSoftwareName(*s) + } + return imu +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (imu *InstanceMetadataUpdate) SetSoftwareVersion(s string) *InstanceMetadataUpdate { + imu.mutation.SetSoftwareVersion(s) + return imu +} + +// SetNillableSoftwareVersion sets the "softwareVersion" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableSoftwareVersion(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetSoftwareVersion(*s) + } + return imu +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (imu *InstanceMetadataUpdate) SetSharedInboxURI(s string) *InstanceMetadataUpdate { + imu.mutation.SetSharedInboxURI(s) + return imu +} + +// SetNillableSharedInboxURI sets the "sharedInboxURI" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableSharedInboxURI(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetSharedInboxURI(*s) + } + return imu +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (imu *InstanceMetadataUpdate) SetModeratorsURI(s string) *InstanceMetadataUpdate { + imu.mutation.SetModeratorsURI(s) + return imu +} + +// SetNillableModeratorsURI sets the "moderatorsURI" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableModeratorsURI(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetModeratorsURI(*s) + } + return imu +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (imu *InstanceMetadataUpdate) ClearModeratorsURI() *InstanceMetadataUpdate { + imu.mutation.ClearModeratorsURI() + return imu +} + +// SetAdminsURI sets the "adminsURI" field. +func (imu *InstanceMetadataUpdate) SetAdminsURI(s string) *InstanceMetadataUpdate { + imu.mutation.SetAdminsURI(s) + return imu +} + +// SetNillableAdminsURI sets the "adminsURI" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableAdminsURI(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetAdminsURI(*s) + } + return imu +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (imu *InstanceMetadataUpdate) ClearAdminsURI() *InstanceMetadataUpdate { + imu.mutation.ClearAdminsURI() + return imu +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (imu *InstanceMetadataUpdate) SetLogoEndpoint(s string) *InstanceMetadataUpdate { + imu.mutation.SetLogoEndpoint(s) + return imu +} + +// SetNillableLogoEndpoint sets the "logoEndpoint" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableLogoEndpoint(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetLogoEndpoint(*s) + } + return imu +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (imu *InstanceMetadataUpdate) ClearLogoEndpoint() *InstanceMetadataUpdate { + imu.mutation.ClearLogoEndpoint() + return imu +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (imu *InstanceMetadataUpdate) SetLogoMimeType(s string) *InstanceMetadataUpdate { + imu.mutation.SetLogoMimeType(s) + return imu +} + +// SetNillableLogoMimeType sets the "logoMimeType" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableLogoMimeType(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetLogoMimeType(*s) + } + return imu +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (imu *InstanceMetadataUpdate) ClearLogoMimeType() *InstanceMetadataUpdate { + imu.mutation.ClearLogoMimeType() + return imu +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (imu *InstanceMetadataUpdate) SetBannerEndpoint(s string) *InstanceMetadataUpdate { + imu.mutation.SetBannerEndpoint(s) + return imu +} + +// SetNillableBannerEndpoint sets the "bannerEndpoint" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableBannerEndpoint(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetBannerEndpoint(*s) + } + return imu +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (imu *InstanceMetadataUpdate) ClearBannerEndpoint() *InstanceMetadataUpdate { + imu.mutation.ClearBannerEndpoint() + return imu +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (imu *InstanceMetadataUpdate) SetBannerMimeType(s string) *InstanceMetadataUpdate { + imu.mutation.SetBannerMimeType(s) + return imu +} + +// SetNillableBannerMimeType sets the "bannerMimeType" field if the given value is not nil. +func (imu *InstanceMetadataUpdate) SetNillableBannerMimeType(s *string) *InstanceMetadataUpdate { + if s != nil { + imu.SetBannerMimeType(*s) + } + return imu +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (imu *InstanceMetadataUpdate) ClearBannerMimeType() *InstanceMetadataUpdate { + imu.mutation.ClearBannerMimeType() + return imu +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (imu *InstanceMetadataUpdate) SetSupportedVersions(s []string) *InstanceMetadataUpdate { + imu.mutation.SetSupportedVersions(s) + return imu +} + +// AppendSupportedVersions appends s to the "supportedVersions" field. +func (imu *InstanceMetadataUpdate) AppendSupportedVersions(s []string) *InstanceMetadataUpdate { + imu.mutation.AppendSupportedVersions(s) + return imu +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (imu *InstanceMetadataUpdate) SetSupportedExtensions(s []string) *InstanceMetadataUpdate { + imu.mutation.SetSupportedExtensions(s) + return imu +} + +// AppendSupportedExtensions appends s to the "supportedExtensions" field. +func (imu *InstanceMetadataUpdate) AppendSupportedExtensions(s []string) *InstanceMetadataUpdate { + imu.mutation.AppendSupportedExtensions(s) + return imu +} + +// AddUserIDs adds the "users" edge to the User entity by IDs. +func (imu *InstanceMetadataUpdate) AddUserIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.AddUserIDs(ids...) + return imu +} + +// AddUsers adds the "users" edges to the User entity. +func (imu *InstanceMetadataUpdate) AddUsers(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.AddUserIDs(ids...) +} + +// AddModeratorIDs adds the "moderators" edge to the User entity by IDs. +func (imu *InstanceMetadataUpdate) AddModeratorIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.AddModeratorIDs(ids...) + return imu +} + +// AddModerators adds the "moderators" edges to the User entity. +func (imu *InstanceMetadataUpdate) AddModerators(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.AddModeratorIDs(ids...) +} + +// AddAdminIDs adds the "admins" edge to the User entity by IDs. +func (imu *InstanceMetadataUpdate) AddAdminIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.AddAdminIDs(ids...) + return imu +} + +// AddAdmins adds the "admins" edges to the User entity. +func (imu *InstanceMetadataUpdate) AddAdmins(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.AddAdminIDs(ids...) +} + +// Mutation returns the InstanceMetadataMutation object of the builder. +func (imu *InstanceMetadataUpdate) Mutation() *InstanceMetadataMutation { + return imu.mutation +} + +// ClearUsers clears all "users" edges to the User entity. +func (imu *InstanceMetadataUpdate) ClearUsers() *InstanceMetadataUpdate { + imu.mutation.ClearUsers() + return imu +} + +// RemoveUserIDs removes the "users" edge to User entities by IDs. +func (imu *InstanceMetadataUpdate) RemoveUserIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.RemoveUserIDs(ids...) + return imu +} + +// RemoveUsers removes "users" edges to User entities. +func (imu *InstanceMetadataUpdate) RemoveUsers(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.RemoveUserIDs(ids...) +} + +// ClearModerators clears all "moderators" edges to the User entity. +func (imu *InstanceMetadataUpdate) ClearModerators() *InstanceMetadataUpdate { + imu.mutation.ClearModerators() + return imu +} + +// RemoveModeratorIDs removes the "moderators" edge to User entities by IDs. +func (imu *InstanceMetadataUpdate) RemoveModeratorIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.RemoveModeratorIDs(ids...) + return imu +} + +// RemoveModerators removes "moderators" edges to User entities. +func (imu *InstanceMetadataUpdate) RemoveModerators(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.RemoveModeratorIDs(ids...) +} + +// ClearAdmins clears all "admins" edges to the User entity. +func (imu *InstanceMetadataUpdate) ClearAdmins() *InstanceMetadataUpdate { + imu.mutation.ClearAdmins() + return imu +} + +// RemoveAdminIDs removes the "admins" edge to User entities by IDs. +func (imu *InstanceMetadataUpdate) RemoveAdminIDs(ids ...uuid.UUID) *InstanceMetadataUpdate { + imu.mutation.RemoveAdminIDs(ids...) + return imu +} + +// RemoveAdmins removes "admins" edges to User entities. +func (imu *InstanceMetadataUpdate) RemoveAdmins(u ...*User) *InstanceMetadataUpdate { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imu.RemoveAdminIDs(ids...) +} + +// Save executes the query and returns the number of nodes affected by the update operation. +func (imu *InstanceMetadataUpdate) Save(ctx context.Context) (int, error) { + imu.defaults() + return withHooks(ctx, imu.sqlSave, imu.mutation, imu.hooks) +} + +// SaveX is like Save, but panics if an error occurs. +func (imu *InstanceMetadataUpdate) SaveX(ctx context.Context) int { + affected, err := imu.Save(ctx) + if err != nil { + panic(err) + } + return affected +} + +// Exec executes the query. +func (imu *InstanceMetadataUpdate) Exec(ctx context.Context) error { + _, err := imu.Save(ctx) + return err +} + +// ExecX is like Exec, but panics if an error occurs. +func (imu *InstanceMetadataUpdate) ExecX(ctx context.Context) { + if err := imu.Exec(ctx); err != nil { + panic(err) + } +} + +// defaults sets the default values of the builder before save. +func (imu *InstanceMetadataUpdate) defaults() { + if _, ok := imu.mutation.UpdatedAt(); !ok { + v := instancemetadata.UpdateDefaultUpdatedAt() + imu.mutation.SetUpdatedAt(v) + } +} + +// check runs all checks and user-defined validators on the builder. +func (imu *InstanceMetadataUpdate) check() error { + if v, ok := imu.mutation.URI(); ok { + if err := instancemetadata.URIValidator(v); err != nil { + return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.uri": %w`, err)} + } + } + if v, ok := imu.mutation.Name(); ok { + if err := instancemetadata.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.name": %w`, err)} + } + } + if v, ok := imu.mutation.Host(); ok { + if err := instancemetadata.HostValidator(v); err != nil { + return &ValidationError{Name: "host", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.host": %w`, err)} + } + } + if v, ok := imu.mutation.SoftwareName(); ok { + if err := instancemetadata.SoftwareNameValidator(v); err != nil { + return &ValidationError{Name: "softwareName", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareName": %w`, err)} + } + } + if v, ok := imu.mutation.SoftwareVersion(); ok { + if err := instancemetadata.SoftwareVersionValidator(v); err != nil { + return &ValidationError{Name: "softwareVersion", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareVersion": %w`, err)} + } + } + if v, ok := imu.mutation.SharedInboxURI(); ok { + if err := instancemetadata.SharedInboxURIValidator(v); err != nil { + return &ValidationError{Name: "sharedInboxURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.sharedInboxURI": %w`, err)} + } + } + if v, ok := imu.mutation.ModeratorsURI(); ok { + if err := instancemetadata.ModeratorsURIValidator(v); err != nil { + return &ValidationError{Name: "moderatorsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.moderatorsURI": %w`, err)} + } + } + if v, ok := imu.mutation.AdminsURI(); ok { + if err := instancemetadata.AdminsURIValidator(v); err != nil { + return &ValidationError{Name: "adminsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.adminsURI": %w`, err)} + } + } + if v, ok := imu.mutation.LogoEndpoint(); ok { + if err := instancemetadata.LogoEndpointValidator(v); err != nil { + return &ValidationError{Name: "logoEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoEndpoint": %w`, err)} + } + } + if v, ok := imu.mutation.LogoMimeType(); ok { + if err := instancemetadata.LogoMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "logoMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoMimeType": %w`, err)} + } + } + if v, ok := imu.mutation.BannerEndpoint(); ok { + if err := instancemetadata.BannerEndpointValidator(v); err != nil { + return &ValidationError{Name: "bannerEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerEndpoint": %w`, err)} + } + } + if v, ok := imu.mutation.BannerMimeType(); ok { + if err := instancemetadata.BannerMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "bannerMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerMimeType": %w`, err)} + } + } + return nil +} + +func (imu *InstanceMetadataUpdate) sqlSave(ctx context.Context) (n int, err error) { + if err := imu.check(); err != nil { + return n, err + } + _spec := sqlgraph.NewUpdateSpec(instancemetadata.Table, instancemetadata.Columns, sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID)) + if ps := imu.mutation.predicates; len(ps) > 0 { + _spec.Predicate = func(selector *sql.Selector) { + for i := range ps { + ps[i](selector) + } + } + } + if value, ok := imu.mutation.IsRemote(); ok { + _spec.SetField(instancemetadata.FieldIsRemote, field.TypeBool, value) + } + if value, ok := imu.mutation.URI(); ok { + _spec.SetField(instancemetadata.FieldURI, field.TypeString, value) + } + if value, ok := imu.mutation.Extensions(); ok { + _spec.SetField(instancemetadata.FieldExtensions, field.TypeJSON, value) + } + if value, ok := imu.mutation.UpdatedAt(); ok { + _spec.SetField(instancemetadata.FieldUpdatedAt, field.TypeTime, value) + } + if value, ok := imu.mutation.Name(); ok { + _spec.SetField(instancemetadata.FieldName, field.TypeString, value) + } + if value, ok := imu.mutation.Description(); ok { + _spec.SetField(instancemetadata.FieldDescription, field.TypeString, value) + } + if imu.mutation.DescriptionCleared() { + _spec.ClearField(instancemetadata.FieldDescription, field.TypeString) + } + if value, ok := imu.mutation.Host(); ok { + _spec.SetField(instancemetadata.FieldHost, field.TypeString, value) + } + if value, ok := imu.mutation.PublicKey(); ok { + _spec.SetField(instancemetadata.FieldPublicKey, field.TypeBytes, value) + } + if value, ok := imu.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(instancemetadata.FieldPublicKeyAlgorithm, field.TypeString, value) + } + if value, ok := imu.mutation.PrivateKey(); ok { + _spec.SetField(instancemetadata.FieldPrivateKey, field.TypeBytes, value) + } + if imu.mutation.PrivateKeyCleared() { + _spec.ClearField(instancemetadata.FieldPrivateKey, field.TypeBytes) + } + if value, ok := imu.mutation.SoftwareName(); ok { + _spec.SetField(instancemetadata.FieldSoftwareName, field.TypeString, value) + } + if value, ok := imu.mutation.SoftwareVersion(); ok { + _spec.SetField(instancemetadata.FieldSoftwareVersion, field.TypeString, value) + } + if value, ok := imu.mutation.SharedInboxURI(); ok { + _spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value) + } + if value, ok := imu.mutation.ModeratorsURI(); ok { + _spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value) + } + if imu.mutation.ModeratorsURICleared() { + _spec.ClearField(instancemetadata.FieldModeratorsURI, field.TypeString) + } + if value, ok := imu.mutation.AdminsURI(); ok { + _spec.SetField(instancemetadata.FieldAdminsURI, field.TypeString, value) + } + if imu.mutation.AdminsURICleared() { + _spec.ClearField(instancemetadata.FieldAdminsURI, field.TypeString) + } + if value, ok := imu.mutation.LogoEndpoint(); ok { + _spec.SetField(instancemetadata.FieldLogoEndpoint, field.TypeString, value) + } + if imu.mutation.LogoEndpointCleared() { + _spec.ClearField(instancemetadata.FieldLogoEndpoint, field.TypeString) + } + if value, ok := imu.mutation.LogoMimeType(); ok { + _spec.SetField(instancemetadata.FieldLogoMimeType, field.TypeString, value) + } + if imu.mutation.LogoMimeTypeCleared() { + _spec.ClearField(instancemetadata.FieldLogoMimeType, field.TypeString) + } + if value, ok := imu.mutation.BannerEndpoint(); ok { + _spec.SetField(instancemetadata.FieldBannerEndpoint, field.TypeString, value) + } + if imu.mutation.BannerEndpointCleared() { + _spec.ClearField(instancemetadata.FieldBannerEndpoint, field.TypeString) + } + if value, ok := imu.mutation.BannerMimeType(); ok { + _spec.SetField(instancemetadata.FieldBannerMimeType, field.TypeString, value) + } + if imu.mutation.BannerMimeTypeCleared() { + _spec.ClearField(instancemetadata.FieldBannerMimeType, field.TypeString) + } + if value, ok := imu.mutation.SupportedVersions(); ok { + _spec.SetField(instancemetadata.FieldSupportedVersions, field.TypeJSON, value) + } + if value, ok := imu.mutation.AppendedSupportedVersions(); ok { + _spec.AddModifier(func(u *sql.UpdateBuilder) { + sqljson.Append(u, instancemetadata.FieldSupportedVersions, value) + }) + } + if value, ok := imu.mutation.SupportedExtensions(); ok { + _spec.SetField(instancemetadata.FieldSupportedExtensions, field.TypeJSON, value) + } + if value, ok := imu.mutation.AppendedSupportedExtensions(); ok { + _spec.AddModifier(func(u *sql.UpdateBuilder) { + sqljson.Append(u, instancemetadata.FieldSupportedExtensions, value) + }) + } + if imu.mutation.UsersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.RemovedUsersIDs(); len(nodes) > 0 && !imu.mutation.UsersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.UsersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if imu.mutation.ModeratorsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.RemovedModeratorsIDs(); len(nodes) > 0 && !imu.mutation.ModeratorsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.ModeratorsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if imu.mutation.AdminsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.RemovedAdminsIDs(); len(nodes) > 0 && !imu.mutation.AdminsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imu.mutation.AdminsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if n, err = sqlgraph.UpdateNodes(ctx, imu.driver, _spec); err != nil { + if _, ok := err.(*sqlgraph.NotFoundError); ok { + err = &NotFoundError{instancemetadata.Label} + } else if sqlgraph.IsConstraintError(err) { + err = &ConstraintError{msg: err.Error(), wrap: err} + } + return 0, err + } + imu.mutation.done = true + return n, nil +} + +// InstanceMetadataUpdateOne is the builder for updating a single InstanceMetadata entity. +type InstanceMetadataUpdateOne struct { + config + fields []string + hooks []Hook + mutation *InstanceMetadataMutation +} + +// SetIsRemote sets the "isRemote" field. +func (imuo *InstanceMetadataUpdateOne) SetIsRemote(b bool) *InstanceMetadataUpdateOne { + imuo.mutation.SetIsRemote(b) + return imuo +} + +// SetNillableIsRemote sets the "isRemote" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableIsRemote(b *bool) *InstanceMetadataUpdateOne { + if b != nil { + imuo.SetIsRemote(*b) + } + return imuo +} + +// SetURI sets the "uri" field. +func (imuo *InstanceMetadataUpdateOne) SetURI(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetURI(s) + return imuo +} + +// SetNillableURI sets the "uri" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableURI(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetURI(*s) + } + return imuo +} + +// SetExtensions sets the "extensions" field. +func (imuo *InstanceMetadataUpdateOne) SetExtensions(l lysand.Extensions) *InstanceMetadataUpdateOne { + imuo.mutation.SetExtensions(l) + return imuo +} + +// SetUpdatedAt sets the "updated_at" field. +func (imuo *InstanceMetadataUpdateOne) SetUpdatedAt(t time.Time) *InstanceMetadataUpdateOne { + imuo.mutation.SetUpdatedAt(t) + return imuo +} + +// SetName sets the "name" field. +func (imuo *InstanceMetadataUpdateOne) SetName(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetName(s) + return imuo +} + +// SetNillableName sets the "name" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableName(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetName(*s) + } + return imuo +} + +// SetDescription sets the "description" field. +func (imuo *InstanceMetadataUpdateOne) SetDescription(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetDescription(s) + return imuo +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableDescription(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetDescription(*s) + } + return imuo +} + +// ClearDescription clears the value of the "description" field. +func (imuo *InstanceMetadataUpdateOne) ClearDescription() *InstanceMetadataUpdateOne { + imuo.mutation.ClearDescription() + return imuo +} + +// SetHost sets the "host" field. +func (imuo *InstanceMetadataUpdateOne) SetHost(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetHost(s) + return imuo +} + +// SetNillableHost sets the "host" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableHost(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetHost(*s) + } + return imuo +} + +// SetPublicKey sets the "publicKey" field. +func (imuo *InstanceMetadataUpdateOne) SetPublicKey(b []byte) *InstanceMetadataUpdateOne { + imuo.mutation.SetPublicKey(b) + return imuo +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (imuo *InstanceMetadataUpdateOne) SetPublicKeyAlgorithm(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetPublicKeyAlgorithm(s) + return imuo +} + +// SetNillablePublicKeyAlgorithm sets the "publicKeyAlgorithm" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillablePublicKeyAlgorithm(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetPublicKeyAlgorithm(*s) + } + return imuo +} + +// SetPrivateKey sets the "privateKey" field. +func (imuo *InstanceMetadataUpdateOne) SetPrivateKey(b []byte) *InstanceMetadataUpdateOne { + imuo.mutation.SetPrivateKey(b) + return imuo +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (imuo *InstanceMetadataUpdateOne) ClearPrivateKey() *InstanceMetadataUpdateOne { + imuo.mutation.ClearPrivateKey() + return imuo +} + +// SetSoftwareName sets the "softwareName" field. +func (imuo *InstanceMetadataUpdateOne) SetSoftwareName(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetSoftwareName(s) + return imuo +} + +// SetNillableSoftwareName sets the "softwareName" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableSoftwareName(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetSoftwareName(*s) + } + return imuo +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (imuo *InstanceMetadataUpdateOne) SetSoftwareVersion(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetSoftwareVersion(s) + return imuo +} + +// SetNillableSoftwareVersion sets the "softwareVersion" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableSoftwareVersion(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetSoftwareVersion(*s) + } + return imuo +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (imuo *InstanceMetadataUpdateOne) SetSharedInboxURI(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetSharedInboxURI(s) + return imuo +} + +// SetNillableSharedInboxURI sets the "sharedInboxURI" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableSharedInboxURI(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetSharedInboxURI(*s) + } + return imuo +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (imuo *InstanceMetadataUpdateOne) SetModeratorsURI(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetModeratorsURI(s) + return imuo +} + +// SetNillableModeratorsURI sets the "moderatorsURI" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableModeratorsURI(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetModeratorsURI(*s) + } + return imuo +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (imuo *InstanceMetadataUpdateOne) ClearModeratorsURI() *InstanceMetadataUpdateOne { + imuo.mutation.ClearModeratorsURI() + return imuo +} + +// SetAdminsURI sets the "adminsURI" field. +func (imuo *InstanceMetadataUpdateOne) SetAdminsURI(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetAdminsURI(s) + return imuo +} + +// SetNillableAdminsURI sets the "adminsURI" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableAdminsURI(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetAdminsURI(*s) + } + return imuo +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (imuo *InstanceMetadataUpdateOne) ClearAdminsURI() *InstanceMetadataUpdateOne { + imuo.mutation.ClearAdminsURI() + return imuo +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (imuo *InstanceMetadataUpdateOne) SetLogoEndpoint(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetLogoEndpoint(s) + return imuo +} + +// SetNillableLogoEndpoint sets the "logoEndpoint" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableLogoEndpoint(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetLogoEndpoint(*s) + } + return imuo +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (imuo *InstanceMetadataUpdateOne) ClearLogoEndpoint() *InstanceMetadataUpdateOne { + imuo.mutation.ClearLogoEndpoint() + return imuo +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (imuo *InstanceMetadataUpdateOne) SetLogoMimeType(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetLogoMimeType(s) + return imuo +} + +// SetNillableLogoMimeType sets the "logoMimeType" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableLogoMimeType(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetLogoMimeType(*s) + } + return imuo +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (imuo *InstanceMetadataUpdateOne) ClearLogoMimeType() *InstanceMetadataUpdateOne { + imuo.mutation.ClearLogoMimeType() + return imuo +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (imuo *InstanceMetadataUpdateOne) SetBannerEndpoint(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetBannerEndpoint(s) + return imuo +} + +// SetNillableBannerEndpoint sets the "bannerEndpoint" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableBannerEndpoint(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetBannerEndpoint(*s) + } + return imuo +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (imuo *InstanceMetadataUpdateOne) ClearBannerEndpoint() *InstanceMetadataUpdateOne { + imuo.mutation.ClearBannerEndpoint() + return imuo +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (imuo *InstanceMetadataUpdateOne) SetBannerMimeType(s string) *InstanceMetadataUpdateOne { + imuo.mutation.SetBannerMimeType(s) + return imuo +} + +// SetNillableBannerMimeType sets the "bannerMimeType" field if the given value is not nil. +func (imuo *InstanceMetadataUpdateOne) SetNillableBannerMimeType(s *string) *InstanceMetadataUpdateOne { + if s != nil { + imuo.SetBannerMimeType(*s) + } + return imuo +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (imuo *InstanceMetadataUpdateOne) ClearBannerMimeType() *InstanceMetadataUpdateOne { + imuo.mutation.ClearBannerMimeType() + return imuo +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (imuo *InstanceMetadataUpdateOne) SetSupportedVersions(s []string) *InstanceMetadataUpdateOne { + imuo.mutation.SetSupportedVersions(s) + return imuo +} + +// AppendSupportedVersions appends s to the "supportedVersions" field. +func (imuo *InstanceMetadataUpdateOne) AppendSupportedVersions(s []string) *InstanceMetadataUpdateOne { + imuo.mutation.AppendSupportedVersions(s) + return imuo +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (imuo *InstanceMetadataUpdateOne) SetSupportedExtensions(s []string) *InstanceMetadataUpdateOne { + imuo.mutation.SetSupportedExtensions(s) + return imuo +} + +// AppendSupportedExtensions appends s to the "supportedExtensions" field. +func (imuo *InstanceMetadataUpdateOne) AppendSupportedExtensions(s []string) *InstanceMetadataUpdateOne { + imuo.mutation.AppendSupportedExtensions(s) + return imuo +} + +// AddUserIDs adds the "users" edge to the User entity by IDs. +func (imuo *InstanceMetadataUpdateOne) AddUserIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.AddUserIDs(ids...) + return imuo +} + +// AddUsers adds the "users" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) AddUsers(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.AddUserIDs(ids...) +} + +// AddModeratorIDs adds the "moderators" edge to the User entity by IDs. +func (imuo *InstanceMetadataUpdateOne) AddModeratorIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.AddModeratorIDs(ids...) + return imuo +} + +// AddModerators adds the "moderators" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) AddModerators(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.AddModeratorIDs(ids...) +} + +// AddAdminIDs adds the "admins" edge to the User entity by IDs. +func (imuo *InstanceMetadataUpdateOne) AddAdminIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.AddAdminIDs(ids...) + return imuo +} + +// AddAdmins adds the "admins" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) AddAdmins(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.AddAdminIDs(ids...) +} + +// Mutation returns the InstanceMetadataMutation object of the builder. +func (imuo *InstanceMetadataUpdateOne) Mutation() *InstanceMetadataMutation { + return imuo.mutation +} + +// ClearUsers clears all "users" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) ClearUsers() *InstanceMetadataUpdateOne { + imuo.mutation.ClearUsers() + return imuo +} + +// RemoveUserIDs removes the "users" edge to User entities by IDs. +func (imuo *InstanceMetadataUpdateOne) RemoveUserIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.RemoveUserIDs(ids...) + return imuo +} + +// RemoveUsers removes "users" edges to User entities. +func (imuo *InstanceMetadataUpdateOne) RemoveUsers(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.RemoveUserIDs(ids...) +} + +// ClearModerators clears all "moderators" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) ClearModerators() *InstanceMetadataUpdateOne { + imuo.mutation.ClearModerators() + return imuo +} + +// RemoveModeratorIDs removes the "moderators" edge to User entities by IDs. +func (imuo *InstanceMetadataUpdateOne) RemoveModeratorIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.RemoveModeratorIDs(ids...) + return imuo +} + +// RemoveModerators removes "moderators" edges to User entities. +func (imuo *InstanceMetadataUpdateOne) RemoveModerators(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.RemoveModeratorIDs(ids...) +} + +// ClearAdmins clears all "admins" edges to the User entity. +func (imuo *InstanceMetadataUpdateOne) ClearAdmins() *InstanceMetadataUpdateOne { + imuo.mutation.ClearAdmins() + return imuo +} + +// RemoveAdminIDs removes the "admins" edge to User entities by IDs. +func (imuo *InstanceMetadataUpdateOne) RemoveAdminIDs(ids ...uuid.UUID) *InstanceMetadataUpdateOne { + imuo.mutation.RemoveAdminIDs(ids...) + return imuo +} + +// RemoveAdmins removes "admins" edges to User entities. +func (imuo *InstanceMetadataUpdateOne) RemoveAdmins(u ...*User) *InstanceMetadataUpdateOne { + ids := make([]uuid.UUID, len(u)) + for i := range u { + ids[i] = u[i].ID + } + return imuo.RemoveAdminIDs(ids...) +} + +// Where appends a list predicates to the InstanceMetadataUpdate builder. +func (imuo *InstanceMetadataUpdateOne) Where(ps ...predicate.InstanceMetadata) *InstanceMetadataUpdateOne { + imuo.mutation.Where(ps...) + return imuo +} + +// Select allows selecting one or more fields (columns) of the returned entity. +// The default is selecting all fields defined in the entity schema. +func (imuo *InstanceMetadataUpdateOne) Select(field string, fields ...string) *InstanceMetadataUpdateOne { + imuo.fields = append([]string{field}, fields...) + return imuo +} + +// Save executes the query and returns the updated InstanceMetadata entity. +func (imuo *InstanceMetadataUpdateOne) Save(ctx context.Context) (*InstanceMetadata, error) { + imuo.defaults() + return withHooks(ctx, imuo.sqlSave, imuo.mutation, imuo.hooks) +} + +// SaveX is like Save, but panics if an error occurs. +func (imuo *InstanceMetadataUpdateOne) SaveX(ctx context.Context) *InstanceMetadata { + node, err := imuo.Save(ctx) + if err != nil { + panic(err) + } + return node +} + +// Exec executes the query on the entity. +func (imuo *InstanceMetadataUpdateOne) Exec(ctx context.Context) error { + _, err := imuo.Save(ctx) + return err +} + +// ExecX is like Exec, but panics if an error occurs. +func (imuo *InstanceMetadataUpdateOne) ExecX(ctx context.Context) { + if err := imuo.Exec(ctx); err != nil { + panic(err) + } +} + +// defaults sets the default values of the builder before save. +func (imuo *InstanceMetadataUpdateOne) defaults() { + if _, ok := imuo.mutation.UpdatedAt(); !ok { + v := instancemetadata.UpdateDefaultUpdatedAt() + imuo.mutation.SetUpdatedAt(v) + } +} + +// check runs all checks and user-defined validators on the builder. +func (imuo *InstanceMetadataUpdateOne) check() error { + if v, ok := imuo.mutation.URI(); ok { + if err := instancemetadata.URIValidator(v); err != nil { + return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.uri": %w`, err)} + } + } + if v, ok := imuo.mutation.Name(); ok { + if err := instancemetadata.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.name": %w`, err)} + } + } + if v, ok := imuo.mutation.Host(); ok { + if err := instancemetadata.HostValidator(v); err != nil { + return &ValidationError{Name: "host", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.host": %w`, err)} + } + } + if v, ok := imuo.mutation.SoftwareName(); ok { + if err := instancemetadata.SoftwareNameValidator(v); err != nil { + return &ValidationError{Name: "softwareName", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareName": %w`, err)} + } + } + if v, ok := imuo.mutation.SoftwareVersion(); ok { + if err := instancemetadata.SoftwareVersionValidator(v); err != nil { + return &ValidationError{Name: "softwareVersion", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareVersion": %w`, err)} + } + } + if v, ok := imuo.mutation.SharedInboxURI(); ok { + if err := instancemetadata.SharedInboxURIValidator(v); err != nil { + return &ValidationError{Name: "sharedInboxURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.sharedInboxURI": %w`, err)} + } + } + if v, ok := imuo.mutation.ModeratorsURI(); ok { + if err := instancemetadata.ModeratorsURIValidator(v); err != nil { + return &ValidationError{Name: "moderatorsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.moderatorsURI": %w`, err)} + } + } + if v, ok := imuo.mutation.AdminsURI(); ok { + if err := instancemetadata.AdminsURIValidator(v); err != nil { + return &ValidationError{Name: "adminsURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.adminsURI": %w`, err)} + } + } + if v, ok := imuo.mutation.LogoEndpoint(); ok { + if err := instancemetadata.LogoEndpointValidator(v); err != nil { + return &ValidationError{Name: "logoEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoEndpoint": %w`, err)} + } + } + if v, ok := imuo.mutation.LogoMimeType(); ok { + if err := instancemetadata.LogoMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "logoMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.logoMimeType": %w`, err)} + } + } + if v, ok := imuo.mutation.BannerEndpoint(); ok { + if err := instancemetadata.BannerEndpointValidator(v); err != nil { + return &ValidationError{Name: "bannerEndpoint", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerEndpoint": %w`, err)} + } + } + if v, ok := imuo.mutation.BannerMimeType(); ok { + if err := instancemetadata.BannerMimeTypeValidator(v); err != nil { + return &ValidationError{Name: "bannerMimeType", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.bannerMimeType": %w`, err)} + } + } + return nil +} + +func (imuo *InstanceMetadataUpdateOne) sqlSave(ctx context.Context) (_node *InstanceMetadata, err error) { + if err := imuo.check(); err != nil { + return _node, err + } + _spec := sqlgraph.NewUpdateSpec(instancemetadata.Table, instancemetadata.Columns, sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID)) + id, ok := imuo.mutation.ID() + if !ok { + return nil, &ValidationError{Name: "id", err: errors.New(`ent: missing "InstanceMetadata.id" for update`)} + } + _spec.Node.ID.Value = id + if fields := imuo.fields; len(fields) > 0 { + _spec.Node.Columns = make([]string, 0, len(fields)) + _spec.Node.Columns = append(_spec.Node.Columns, instancemetadata.FieldID) + for _, f := range fields { + if !instancemetadata.ValidColumn(f) { + return nil, &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} + } + if f != instancemetadata.FieldID { + _spec.Node.Columns = append(_spec.Node.Columns, f) + } + } + } + if ps := imuo.mutation.predicates; len(ps) > 0 { + _spec.Predicate = func(selector *sql.Selector) { + for i := range ps { + ps[i](selector) + } + } + } + if value, ok := imuo.mutation.IsRemote(); ok { + _spec.SetField(instancemetadata.FieldIsRemote, field.TypeBool, value) + } + if value, ok := imuo.mutation.URI(); ok { + _spec.SetField(instancemetadata.FieldURI, field.TypeString, value) + } + if value, ok := imuo.mutation.Extensions(); ok { + _spec.SetField(instancemetadata.FieldExtensions, field.TypeJSON, value) + } + if value, ok := imuo.mutation.UpdatedAt(); ok { + _spec.SetField(instancemetadata.FieldUpdatedAt, field.TypeTime, value) + } + if value, ok := imuo.mutation.Name(); ok { + _spec.SetField(instancemetadata.FieldName, field.TypeString, value) + } + if value, ok := imuo.mutation.Description(); ok { + _spec.SetField(instancemetadata.FieldDescription, field.TypeString, value) + } + if imuo.mutation.DescriptionCleared() { + _spec.ClearField(instancemetadata.FieldDescription, field.TypeString) + } + if value, ok := imuo.mutation.Host(); ok { + _spec.SetField(instancemetadata.FieldHost, field.TypeString, value) + } + if value, ok := imuo.mutation.PublicKey(); ok { + _spec.SetField(instancemetadata.FieldPublicKey, field.TypeBytes, value) + } + if value, ok := imuo.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(instancemetadata.FieldPublicKeyAlgorithm, field.TypeString, value) + } + if value, ok := imuo.mutation.PrivateKey(); ok { + _spec.SetField(instancemetadata.FieldPrivateKey, field.TypeBytes, value) + } + if imuo.mutation.PrivateKeyCleared() { + _spec.ClearField(instancemetadata.FieldPrivateKey, field.TypeBytes) + } + if value, ok := imuo.mutation.SoftwareName(); ok { + _spec.SetField(instancemetadata.FieldSoftwareName, field.TypeString, value) + } + if value, ok := imuo.mutation.SoftwareVersion(); ok { + _spec.SetField(instancemetadata.FieldSoftwareVersion, field.TypeString, value) + } + if value, ok := imuo.mutation.SharedInboxURI(); ok { + _spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value) + } + if value, ok := imuo.mutation.ModeratorsURI(); ok { + _spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value) + } + if imuo.mutation.ModeratorsURICleared() { + _spec.ClearField(instancemetadata.FieldModeratorsURI, field.TypeString) + } + if value, ok := imuo.mutation.AdminsURI(); ok { + _spec.SetField(instancemetadata.FieldAdminsURI, field.TypeString, value) + } + if imuo.mutation.AdminsURICleared() { + _spec.ClearField(instancemetadata.FieldAdminsURI, field.TypeString) + } + if value, ok := imuo.mutation.LogoEndpoint(); ok { + _spec.SetField(instancemetadata.FieldLogoEndpoint, field.TypeString, value) + } + if imuo.mutation.LogoEndpointCleared() { + _spec.ClearField(instancemetadata.FieldLogoEndpoint, field.TypeString) + } + if value, ok := imuo.mutation.LogoMimeType(); ok { + _spec.SetField(instancemetadata.FieldLogoMimeType, field.TypeString, value) + } + if imuo.mutation.LogoMimeTypeCleared() { + _spec.ClearField(instancemetadata.FieldLogoMimeType, field.TypeString) + } + if value, ok := imuo.mutation.BannerEndpoint(); ok { + _spec.SetField(instancemetadata.FieldBannerEndpoint, field.TypeString, value) + } + if imuo.mutation.BannerEndpointCleared() { + _spec.ClearField(instancemetadata.FieldBannerEndpoint, field.TypeString) + } + if value, ok := imuo.mutation.BannerMimeType(); ok { + _spec.SetField(instancemetadata.FieldBannerMimeType, field.TypeString, value) + } + if imuo.mutation.BannerMimeTypeCleared() { + _spec.ClearField(instancemetadata.FieldBannerMimeType, field.TypeString) + } + if value, ok := imuo.mutation.SupportedVersions(); ok { + _spec.SetField(instancemetadata.FieldSupportedVersions, field.TypeJSON, value) + } + if value, ok := imuo.mutation.AppendedSupportedVersions(); ok { + _spec.AddModifier(func(u *sql.UpdateBuilder) { + sqljson.Append(u, instancemetadata.FieldSupportedVersions, value) + }) + } + if value, ok := imuo.mutation.SupportedExtensions(); ok { + _spec.SetField(instancemetadata.FieldSupportedExtensions, field.TypeJSON, value) + } + if value, ok := imuo.mutation.AppendedSupportedExtensions(); ok { + _spec.AddModifier(func(u *sql.UpdateBuilder) { + sqljson.Append(u, instancemetadata.FieldSupportedExtensions, value) + }) + } + if imuo.mutation.UsersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.RemovedUsersIDs(); len(nodes) > 0 && !imuo.mutation.UsersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.UsersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.UsersTable, + Columns: instancemetadata.UsersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if imuo.mutation.ModeratorsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.RemovedModeratorsIDs(); len(nodes) > 0 && !imuo.mutation.ModeratorsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.ModeratorsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.ModeratorsTable, + Columns: instancemetadata.ModeratorsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if imuo.mutation.AdminsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.RemovedAdminsIDs(); len(nodes) > 0 && !imuo.mutation.AdminsCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := imuo.mutation.AdminsIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: false, + Table: instancemetadata.AdminsTable, + Columns: instancemetadata.AdminsPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + _node = &InstanceMetadata{config: imuo.config} + _spec.Assign = _node.assignValues + _spec.ScanValues = _node.scanValues + if err = sqlgraph.UpdateNode(ctx, imuo.driver, _spec); err != nil { + if _, ok := err.(*sqlgraph.NotFoundError); ok { + err = &NotFoundError{instancemetadata.Label} + } else if sqlgraph.IsConstraintError(err) { + err = &ConstraintError{msg: err.Error(), wrap: err} + } + return nil, err + } + imuo.mutation.done = true + return _node, nil +} diff --git a/ent/internal/schema.go b/ent/internal/schema.go index 3b19b62..6a77a19 100644 --- a/ent/internal/schema.go +++ b/ent/internal/schema.go @@ -6,4 +6,4 @@ // Package internal holds a loadable version of the latest schema. package internal -const Schema = "{\"Schema\":\"github.com/lysand-org/versia-go/ent/schema\",\"Package\":\"github.com/lysand-org/versia-go/ent\",\"Schemas\":[{\"name\":\"Attachment\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"author\",\"type\":\"User\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":384,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"sha256\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"blurhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"height\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"width\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"fps\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Follow\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"follower\",\"type\":\"User\",\"unique\":true,\"required\":true},{\"name\":\"followee\",\"type\":\"User\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"status\",\"type\":{\"Type\":6,\"Ident\":\"follow.Status\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"pending\",\"V\":\"pending\"},{\"N\":\"accepted\",\"V\":\"accepted\"}],\"default\":true,\"default_value\":\"pending\",\"default_kind\":24,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"unique\":true,\"edges\":[\"follower\",\"followee\"]}]},{\"name\":\"Image\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"url\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Note\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"author\",\"type\":\"User\",\"unique\":true,\"required\":true},{\"name\":\"mentions\",\"type\":\"User\"},{\"name\":\"attachments\",\"type\":\"Attachment\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"subject\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":384,\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"content\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"isSensitive\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"visibility\",\"type\":{\"Type\":6,\"Ident\":\"note.Visibility\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"public\",\"V\":\"public\"},{\"N\":\"unlisted\",\"V\":\"unlisted\"},{\"N\":\"followers\",\"V\":\"followers\"},{\"N\":\"direct\",\"V\":\"direct\"}],\"default\":true,\"default_value\":\"public\",\"default_kind\":24,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"ServerMetadata\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"follower\",\"type\":\"User\",\"unique\":true,\"required\":true},{\"name\":\"followee\",\"type\":\"User\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"supportedExtensions\",\"type\":{\"Type\":3,\"Ident\":\"[]string\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":{\"Name\":\"\",\"Ident\":\"[]string\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":{}}},\"default\":true,\"default_value\":[],\"default_kind\":23,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"unique\":true,\"edges\":[\"follower\",\"followee\"]}]},{\"name\":\"User\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"avatarImage\",\"type\":\"Image\",\"unique\":true},{\"name\":\"headerImage\",\"type\":\"Image\",\"unique\":true},{\"name\":\"authoredNotes\",\"type\":\"Note\",\"ref_name\":\"author\",\"inverse\":true},{\"name\":\"mentionedNotes\",\"type\":\"Note\",\"ref_name\":\"mentions\",\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"username\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"unique\":true,\"validators\":2,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"passwordHash\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"displayName\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":256,\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"biography\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKey\",\"type\":{\"Type\":5,\"Ident\":\"ed25519.PublicKey\",\"PkgPath\":\"crypto/ed25519\",\"PkgName\":\"ed25519\",\"Nillable\":true,\"RType\":{\"Name\":\"PublicKey\",\"Ident\":\"ed25519.PublicKey\",\"Kind\":23,\"PkgPath\":\"crypto/ed25519\",\"Methods\":{\"Equal\":{\"In\":[{\"Name\":\"PublicKey\",\"Ident\":\"crypto.PublicKey\",\"Kind\":20,\"PkgPath\":\"crypto\",\"Methods\":null}],\"Out\":[{\"Name\":\"bool\",\"Ident\":\"bool\",\"Kind\":1,\"PkgPath\":\"\",\"Methods\":null}]}}}},\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"privateKey\",\"type\":{\"Type\":5,\"Ident\":\"ed25519.PrivateKey\",\"PkgPath\":\"crypto/ed25519\",\"PkgName\":\"ed25519\",\"Nillable\":true,\"RType\":{\"Name\":\"PrivateKey\",\"Ident\":\"ed25519.PrivateKey\",\"Kind\":23,\"PkgPath\":\"crypto/ed25519\",\"Methods\":{\"Equal\":{\"In\":[{\"Name\":\"PrivateKey\",\"Ident\":\"crypto.PrivateKey\",\"Kind\":20,\"PkgPath\":\"crypto\",\"Methods\":null}],\"Out\":[{\"Name\":\"bool\",\"Ident\":\"bool\",\"Kind\":1,\"PkgPath\":\"\",\"Methods\":null}]},\"Public\":{\"In\":[],\"Out\":[{\"Name\":\"PublicKey\",\"Ident\":\"crypto.PublicKey\",\"Kind\":20,\"PkgPath\":\"crypto\",\"Methods\":null}]},\"Seed\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Sign\":{\"In\":[{\"Name\":\"Reader\",\"Ident\":\"io.Reader\",\"Kind\":20,\"PkgPath\":\"io\",\"Methods\":null},{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"SignerOpts\",\"Ident\":\"crypto.SignerOpts\",\"Kind\":20,\"PkgPath\":\"crypto\",\"Methods\":null}],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]}}}},\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"indexable\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":true,\"default_kind\":1,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"privacyLevel\",\"type\":{\"Type\":6,\"Ident\":\"user.PrivacyLevel\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"public\",\"V\":\"public\"},{\"N\":\"restricted\",\"V\":\"restricted\"},{\"N\":\"private\",\"V\":\"private\"}],\"default\":true,\"default_value\":\"public\",\"default_kind\":24,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"fields\",\"type\":{\"Type\":3,\"Ident\":\"[]lysand.Field\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"\",\"Ident\":\"[]lysand.Field\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":{}}},\"default\":true,\"default_value\":[],\"default_kind\":23,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"inbox\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"featured\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"followers\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"following\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"outbox\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}}]}],\"Features\":[\"schema/snapshot\",\"sql/upsert\"]}" +const Schema = "{\"Schema\":\"github.com/lysand-org/versia-go/ent/schema\",\"Package\":\"github.com/lysand-org/versia-go/ent\",\"Schemas\":[{\"name\":\"Attachment\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"author\",\"type\":\"User\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":384,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"sha256\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"blurhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"height\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"width\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"fps\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Follow\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"follower\",\"type\":\"User\",\"unique\":true,\"required\":true},{\"name\":\"followee\",\"type\":\"User\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"status\",\"type\":{\"Type\":6,\"Ident\":\"follow.Status\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"pending\",\"V\":\"pending\"},{\"N\":\"accepted\",\"V\":\"accepted\"}],\"default\":true,\"default_value\":\"pending\",\"default_kind\":24,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"unique\":true,\"edges\":[\"follower\",\"followee\"]}]},{\"name\":\"Image\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"url\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"InstanceMetadata\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"users\",\"type\":\"User\"},{\"name\":\"moderators\",\"type\":\"User\"},{\"name\":\"admins\",\"type\":\"User\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"host\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"unique\":true,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKey\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKeyAlgorithm\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"privateKey\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"softwareName\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"softwareVersion\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"sharedInboxURI\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"moderatorsURI\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"adminsURI\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logoEndpoint\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logoMimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"bannerEndpoint\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"bannerMimeType\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"supportedVersions\",\"type\":{\"Type\":3,\"Ident\":\"[]string\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":{\"Name\":\"\",\"Ident\":\"[]string\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":{}}},\"default\":true,\"default_value\":[],\"default_kind\":23,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"supportedExtensions\",\"type\":{\"Type\":3,\"Ident\":\"[]string\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":{\"Name\":\"\",\"Ident\":\"[]string\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":{}}},\"default\":true,\"default_value\":[],\"default_kind\":23,\"position\":{\"Index\":16,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Note\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"author\",\"type\":\"User\",\"unique\":true,\"required\":true},{\"name\":\"mentions\",\"type\":\"User\"},{\"name\":\"attachments\",\"type\":\"Attachment\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"subject\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":384,\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"content\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"isSensitive\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"visibility\",\"type\":{\"Type\":6,\"Ident\":\"note.Visibility\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"public\",\"V\":\"public\"},{\"N\":\"unlisted\",\"V\":\"unlisted\"},{\"N\":\"followers\",\"V\":\"followers\"},{\"N\":\"direct\",\"V\":\"direct\"}],\"default\":true,\"default_value\":\"public\",\"default_kind\":24,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"User\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"avatarImage\",\"type\":\"Image\",\"unique\":true},{\"name\":\"headerImage\",\"type\":\"Image\",\"unique\":true},{\"name\":\"authoredNotes\",\"type\":\"Note\",\"ref_name\":\"author\",\"inverse\":true},{\"name\":\"mentionedNotes\",\"type\":\"Note\",\"ref_name\":\"mentions\",\"inverse\":true},{\"name\":\"servers\",\"type\":\"InstanceMetadata\",\"ref_name\":\"users\",\"inverse\":true},{\"name\":\"moderatedServers\",\"type\":\"InstanceMetadata\",\"ref_name\":\"moderators\",\"inverse\":true},{\"name\":\"administeredServers\",\"type\":\"InstanceMetadata\",\"ref_name\":\"admins\",\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":4,\"Ident\":\"uuid.UUID\",\"PkgPath\":\"github.com/google/uuid\",\"PkgName\":\"uuid\",\"Nillable\":false,\"RType\":{\"Name\":\"UUID\",\"Ident\":\"uuid.UUID\",\"Kind\":17,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":{\"ClockSequence\":{\"In\":[],\"Out\":[{\"Name\":\"int\",\"Ident\":\"int\",\"Kind\":2,\"PkgPath\":\"\",\"Methods\":null}]},\"Domain\":{\"In\":[],\"Out\":[{\"Name\":\"Domain\",\"Ident\":\"uuid.Domain\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"ID\":{\"In\":[],\"Out\":[{\"Name\":\"uint32\",\"Ident\":\"uint32\",\"Kind\":10,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalBinary\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"MarshalText\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"NodeID\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]},\"Scan\":{\"In\":[{\"Name\":\"\",\"Ident\":\"interface {}\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"String\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"Time\":{\"In\":[],\"Out\":[{\"Name\":\"Time\",\"Ident\":\"uuid.Time\",\"Kind\":6,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"URN\":{\"In\":[],\"Out\":[{\"Name\":\"string\",\"Ident\":\"string\",\"Kind\":24,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalBinary\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"UnmarshalText\":{\"In\":[{\"Name\":\"\",\"Ident\":\"[]uint8\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}],\"Out\":[{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Value\":{\"In\":[],\"Out\":[{\"Name\":\"Value\",\"Ident\":\"driver.Value\",\"Kind\":20,\"PkgPath\":\"database/sql/driver\",\"Methods\":null},{\"Name\":\"error\",\"Ident\":\"error\",\"Kind\":20,\"PkgPath\":\"\",\"Methods\":null}]},\"Variant\":{\"In\":[],\"Out\":[{\"Name\":\"Variant\",\"Ident\":\"uuid.Variant\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]},\"Version\":{\"In\":[],\"Out\":[{\"Name\":\"Version\",\"Ident\":\"uuid.Version\",\"Kind\":8,\"PkgPath\":\"github.com/google/uuid\",\"Methods\":null}]}}}},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"isRemote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"uri\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"extensions\",\"type\":{\"Type\":3,\"Ident\":\"lysand.Extensions\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"Extensions\",\"Ident\":\"lysand.Extensions\",\"Kind\":21,\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"Methods\":{}}},\"default\":true,\"default_value\":{},\"default_kind\":21,\"position\":{\"Index\":3,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":4,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":5,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"username\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"unique\":true,\"validators\":2,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"passwordHash\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"displayName\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":256,\"nillable\":true,\"optional\":true,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"biography\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"nillable\":true,\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKey\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKeyActor\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"publicKeyAlgorithm\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"privateKey\",\"type\":{\"Type\":5,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":true,\"RType\":null},\"optional\":true,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"indexable\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":true,\"default_kind\":1,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"privacyLevel\",\"type\":{\"Type\":6,\"Ident\":\"user.PrivacyLevel\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"enums\":[{\"N\":\"public\",\"V\":\"public\"},{\"N\":\"restricted\",\"V\":\"restricted\"},{\"N\":\"private\",\"V\":\"private\"}],\"default\":true,\"default_value\":\"public\",\"default_kind\":24,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"fields\",\"type\":{\"Type\":3,\"Ident\":\"[]lysand.Field\",\"PkgPath\":\"github.com/lysand-org/versia-go/pkg/lysand\",\"PkgName\":\"lysand\",\"Nillable\":true,\"RType\":{\"Name\":\"\",\"Ident\":\"[]lysand.Field\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":{}}},\"default\":true,\"default_value\":[],\"default_kind\":23,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"inbox\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"featured\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"followers\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"following\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"outbox\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}}]}],\"Features\":[\"schema/snapshot\",\"sql/upsert\"]}" diff --git a/ent/migrate/schema.go b/ent/migrate/schema.go index 1d937be..20a66ef 100644 --- a/ent/migrate/schema.go +++ b/ent/migrate/schema.go @@ -98,6 +98,38 @@ var ( Columns: ImagesColumns, PrimaryKey: []*schema.Column{ImagesColumns[0]}, } + // InstanceMetadataColumns holds the columns for the "instance_metadata" table. + InstanceMetadataColumns = []*schema.Column{ + {Name: "id", Type: field.TypeUUID}, + {Name: "is_remote", Type: field.TypeBool}, + {Name: "uri", Type: field.TypeString}, + {Name: "extensions", Type: field.TypeJSON}, + {Name: "created_at", Type: field.TypeTime}, + {Name: "updated_at", Type: field.TypeTime}, + {Name: "name", Type: field.TypeString}, + {Name: "description", Type: field.TypeString, Nullable: true}, + {Name: "host", Type: field.TypeString, Unique: true}, + {Name: "public_key", Type: field.TypeBytes}, + {Name: "public_key_algorithm", Type: field.TypeString}, + {Name: "private_key", Type: field.TypeBytes, Nullable: true}, + {Name: "software_name", Type: field.TypeString}, + {Name: "software_version", Type: field.TypeString}, + {Name: "shared_inbox_uri", Type: field.TypeString}, + {Name: "moderators_uri", Type: field.TypeString, Nullable: true}, + {Name: "admins_uri", Type: field.TypeString, Nullable: true}, + {Name: "logo_endpoint", Type: field.TypeString, Nullable: true}, + {Name: "logo_mime_type", Type: field.TypeString, Nullable: true}, + {Name: "banner_endpoint", Type: field.TypeString, Nullable: true}, + {Name: "banner_mime_type", Type: field.TypeString, Nullable: true}, + {Name: "supported_versions", Type: field.TypeJSON}, + {Name: "supported_extensions", Type: field.TypeJSON}, + } + // InstanceMetadataTable holds the schema information for the "instance_metadata" table. + InstanceMetadataTable = &schema.Table{ + Name: "instance_metadata", + Columns: InstanceMetadataColumns, + PrimaryKey: []*schema.Column{InstanceMetadataColumns[0]}, + } // NotesColumns holds the columns for the "notes" table. NotesColumns = []*schema.Column{ {Name: "id", Type: field.TypeUUID}, @@ -126,48 +158,6 @@ var ( }, }, } - // ServerMetadataColumns holds the columns for the "server_metadata" table. - ServerMetadataColumns = []*schema.Column{ - {Name: "id", Type: field.TypeUUID}, - {Name: "is_remote", Type: field.TypeBool}, - {Name: "uri", Type: field.TypeString}, - {Name: "extensions", Type: field.TypeJSON}, - {Name: "created_at", Type: field.TypeTime}, - {Name: "updated_at", Type: field.TypeTime}, - {Name: "name", Type: field.TypeString}, - {Name: "description", Type: field.TypeString, Nullable: true}, - {Name: "version", Type: field.TypeString}, - {Name: "supported_extensions", Type: field.TypeJSON}, - {Name: "server_metadata_follower", Type: field.TypeUUID}, - {Name: "server_metadata_followee", Type: field.TypeUUID}, - } - // ServerMetadataTable holds the schema information for the "server_metadata" table. - ServerMetadataTable = &schema.Table{ - Name: "server_metadata", - Columns: ServerMetadataColumns, - PrimaryKey: []*schema.Column{ServerMetadataColumns[0]}, - ForeignKeys: []*schema.ForeignKey{ - { - Symbol: "server_metadata_users_follower", - Columns: []*schema.Column{ServerMetadataColumns[10]}, - RefColumns: []*schema.Column{UsersColumns[0]}, - OnDelete: schema.NoAction, - }, - { - Symbol: "server_metadata_users_followee", - Columns: []*schema.Column{ServerMetadataColumns[11]}, - RefColumns: []*schema.Column{UsersColumns[0]}, - OnDelete: schema.NoAction, - }, - }, - Indexes: []*schema.Index{ - { - Name: "servermetadata_server_metadata_follower_server_metadata_followee", - Unique: true, - Columns: []*schema.Column{ServerMetadataColumns[10], ServerMetadataColumns[11]}, - }, - }, - } // UsersColumns holds the columns for the "users" table. UsersColumns = []*schema.Column{ {Name: "id", Type: field.TypeUUID}, @@ -181,6 +171,8 @@ var ( {Name: "display_name", Type: field.TypeString, Nullable: true, Size: 256}, {Name: "biography", Type: field.TypeString, Nullable: true}, {Name: "public_key", Type: field.TypeBytes}, + {Name: "public_key_actor", Type: field.TypeString}, + {Name: "public_key_algorithm", Type: field.TypeString}, {Name: "private_key", Type: field.TypeBytes, Nullable: true}, {Name: "indexable", Type: field.TypeBool, Default: true}, {Name: "privacy_level", Type: field.TypeEnum, Enums: []string{"public", "restricted", "private"}, Default: "public"}, @@ -201,18 +193,93 @@ var ( ForeignKeys: []*schema.ForeignKey{ { Symbol: "users_images_avatarImage", - Columns: []*schema.Column{UsersColumns[20]}, + Columns: []*schema.Column{UsersColumns[22]}, RefColumns: []*schema.Column{ImagesColumns[0]}, OnDelete: schema.SetNull, }, { Symbol: "users_images_headerImage", - Columns: []*schema.Column{UsersColumns[21]}, + Columns: []*schema.Column{UsersColumns[23]}, RefColumns: []*schema.Column{ImagesColumns[0]}, OnDelete: schema.SetNull, }, }, } + // InstanceMetadataUsersColumns holds the columns for the "instance_metadata_users" table. + InstanceMetadataUsersColumns = []*schema.Column{ + {Name: "instance_metadata_id", Type: field.TypeUUID}, + {Name: "user_id", Type: field.TypeUUID}, + } + // InstanceMetadataUsersTable holds the schema information for the "instance_metadata_users" table. + InstanceMetadataUsersTable = &schema.Table{ + Name: "instance_metadata_users", + Columns: InstanceMetadataUsersColumns, + PrimaryKey: []*schema.Column{InstanceMetadataUsersColumns[0], InstanceMetadataUsersColumns[1]}, + ForeignKeys: []*schema.ForeignKey{ + { + Symbol: "instance_metadata_users_instance_metadata_id", + Columns: []*schema.Column{InstanceMetadataUsersColumns[0]}, + RefColumns: []*schema.Column{InstanceMetadataColumns[0]}, + OnDelete: schema.Cascade, + }, + { + Symbol: "instance_metadata_users_user_id", + Columns: []*schema.Column{InstanceMetadataUsersColumns[1]}, + RefColumns: []*schema.Column{UsersColumns[0]}, + OnDelete: schema.Cascade, + }, + }, + } + // InstanceMetadataModeratorsColumns holds the columns for the "instance_metadata_moderators" table. + InstanceMetadataModeratorsColumns = []*schema.Column{ + {Name: "instance_metadata_id", Type: field.TypeUUID}, + {Name: "user_id", Type: field.TypeUUID}, + } + // InstanceMetadataModeratorsTable holds the schema information for the "instance_metadata_moderators" table. + InstanceMetadataModeratorsTable = &schema.Table{ + Name: "instance_metadata_moderators", + Columns: InstanceMetadataModeratorsColumns, + PrimaryKey: []*schema.Column{InstanceMetadataModeratorsColumns[0], InstanceMetadataModeratorsColumns[1]}, + ForeignKeys: []*schema.ForeignKey{ + { + Symbol: "instance_metadata_moderators_instance_metadata_id", + Columns: []*schema.Column{InstanceMetadataModeratorsColumns[0]}, + RefColumns: []*schema.Column{InstanceMetadataColumns[0]}, + OnDelete: schema.Cascade, + }, + { + Symbol: "instance_metadata_moderators_user_id", + Columns: []*schema.Column{InstanceMetadataModeratorsColumns[1]}, + RefColumns: []*schema.Column{UsersColumns[0]}, + OnDelete: schema.Cascade, + }, + }, + } + // InstanceMetadataAdminsColumns holds the columns for the "instance_metadata_admins" table. + InstanceMetadataAdminsColumns = []*schema.Column{ + {Name: "instance_metadata_id", Type: field.TypeUUID}, + {Name: "user_id", Type: field.TypeUUID}, + } + // InstanceMetadataAdminsTable holds the schema information for the "instance_metadata_admins" table. + InstanceMetadataAdminsTable = &schema.Table{ + Name: "instance_metadata_admins", + Columns: InstanceMetadataAdminsColumns, + PrimaryKey: []*schema.Column{InstanceMetadataAdminsColumns[0], InstanceMetadataAdminsColumns[1]}, + ForeignKeys: []*schema.ForeignKey{ + { + Symbol: "instance_metadata_admins_instance_metadata_id", + Columns: []*schema.Column{InstanceMetadataAdminsColumns[0]}, + RefColumns: []*schema.Column{InstanceMetadataColumns[0]}, + OnDelete: schema.Cascade, + }, + { + Symbol: "instance_metadata_admins_user_id", + Columns: []*schema.Column{InstanceMetadataAdminsColumns[1]}, + RefColumns: []*schema.Column{UsersColumns[0]}, + OnDelete: schema.Cascade, + }, + }, + } // NoteMentionsColumns holds the columns for the "note_mentions" table. NoteMentionsColumns = []*schema.Column{ {Name: "note_id", Type: field.TypeUUID}, @@ -243,9 +310,12 @@ var ( AttachmentsTable, FollowsTable, ImagesTable, + InstanceMetadataTable, NotesTable, - ServerMetadataTable, UsersTable, + InstanceMetadataUsersTable, + InstanceMetadataModeratorsTable, + InstanceMetadataAdminsTable, NoteMentionsTable, } ) @@ -256,10 +326,14 @@ func init() { FollowsTable.ForeignKeys[0].RefTable = UsersTable FollowsTable.ForeignKeys[1].RefTable = UsersTable NotesTable.ForeignKeys[0].RefTable = UsersTable - ServerMetadataTable.ForeignKeys[0].RefTable = UsersTable - ServerMetadataTable.ForeignKeys[1].RefTable = UsersTable UsersTable.ForeignKeys[0].RefTable = ImagesTable UsersTable.ForeignKeys[1].RefTable = ImagesTable + InstanceMetadataUsersTable.ForeignKeys[0].RefTable = InstanceMetadataTable + InstanceMetadataUsersTable.ForeignKeys[1].RefTable = UsersTable + InstanceMetadataModeratorsTable.ForeignKeys[0].RefTable = InstanceMetadataTable + InstanceMetadataModeratorsTable.ForeignKeys[1].RefTable = UsersTable + InstanceMetadataAdminsTable.ForeignKeys[0].RefTable = InstanceMetadataTable + InstanceMetadataAdminsTable.ForeignKeys[1].RefTable = UsersTable NoteMentionsTable.ForeignKeys[0].RefTable = NotesTable NoteMentionsTable.ForeignKeys[1].RefTable = UsersTable } diff --git a/ent/mutation.go b/ent/mutation.go index b93b028..d8924e4 100644 --- a/ent/mutation.go +++ b/ent/mutation.go @@ -4,7 +4,6 @@ package ent import ( "context" - "crypto/ed25519" "errors" "fmt" "sync" @@ -16,9 +15,9 @@ import ( "github.com/lysand-org/versia-go/ent/attachment" "github.com/lysand-org/versia-go/ent/follow" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" "github.com/lysand-org/versia-go/ent/predicate" - "github.com/lysand-org/versia-go/ent/servermetadata" "github.com/lysand-org/versia-go/ent/user" "github.com/lysand-org/versia-go/pkg/lysand" ) @@ -32,12 +31,12 @@ const ( OpUpdateOne = ent.OpUpdateOne // Node types. - TypeAttachment = "Attachment" - TypeFollow = "Follow" - TypeImage = "Image" - TypeNote = "Note" - TypeServerMetadata = "ServerMetadata" - TypeUser = "User" + TypeAttachment = "Attachment" + TypeFollow = "Follow" + TypeImage = "Image" + TypeInstanceMetadata = "InstanceMetadata" + TypeNote = "Note" + TypeUser = "User" ) // AttachmentMutation represents an operation that mutates the Attachment nodes in the graph. @@ -2412,6 +2411,1918 @@ func (m *ImageMutation) ResetEdge(name string) error { return fmt.Errorf("unknown Image edge %s", name) } +// InstanceMetadataMutation represents an operation that mutates the InstanceMetadata nodes in the graph. +type InstanceMetadataMutation struct { + config + op Op + typ string + id *uuid.UUID + isRemote *bool + uri *string + extensions *lysand.Extensions + created_at *time.Time + updated_at *time.Time + name *string + description *string + host *string + publicKey *[]byte + publicKeyAlgorithm *string + privateKey *[]byte + softwareName *string + softwareVersion *string + sharedInboxURI *string + moderatorsURI *string + adminsURI *string + logoEndpoint *string + logoMimeType *string + bannerEndpoint *string + bannerMimeType *string + supportedVersions *[]string + appendsupportedVersions []string + supportedExtensions *[]string + appendsupportedExtensions []string + clearedFields map[string]struct{} + users map[uuid.UUID]struct{} + removedusers map[uuid.UUID]struct{} + clearedusers bool + moderators map[uuid.UUID]struct{} + removedmoderators map[uuid.UUID]struct{} + clearedmoderators bool + admins map[uuid.UUID]struct{} + removedadmins map[uuid.UUID]struct{} + clearedadmins bool + done bool + oldValue func(context.Context) (*InstanceMetadata, error) + predicates []predicate.InstanceMetadata +} + +var _ ent.Mutation = (*InstanceMetadataMutation)(nil) + +// instancemetadataOption allows management of the mutation configuration using functional options. +type instancemetadataOption func(*InstanceMetadataMutation) + +// newInstanceMetadataMutation creates new mutation for the InstanceMetadata entity. +func newInstanceMetadataMutation(c config, op Op, opts ...instancemetadataOption) *InstanceMetadataMutation { + m := &InstanceMetadataMutation{ + config: c, + op: op, + typ: TypeInstanceMetadata, + clearedFields: make(map[string]struct{}), + } + for _, opt := range opts { + opt(m) + } + return m +} + +// withInstanceMetadataID sets the ID field of the mutation. +func withInstanceMetadataID(id uuid.UUID) instancemetadataOption { + return func(m *InstanceMetadataMutation) { + var ( + err error + once sync.Once + value *InstanceMetadata + ) + m.oldValue = func(ctx context.Context) (*InstanceMetadata, error) { + once.Do(func() { + if m.done { + err = errors.New("querying old values post mutation is not allowed") + } else { + value, err = m.Client().InstanceMetadata.Get(ctx, id) + } + }) + return value, err + } + m.id = &id + } +} + +// withInstanceMetadata sets the old InstanceMetadata of the mutation. +func withInstanceMetadata(node *InstanceMetadata) instancemetadataOption { + return func(m *InstanceMetadataMutation) { + m.oldValue = func(context.Context) (*InstanceMetadata, error) { + return node, nil + } + m.id = &node.ID + } +} + +// Client returns a new `ent.Client` from the mutation. If the mutation was +// executed in a transaction (ent.Tx), a transactional client is returned. +func (m InstanceMetadataMutation) Client() *Client { + client := &Client{config: m.config} + client.init() + return client +} + +// Tx returns an `ent.Tx` for mutations that were executed in transactions; +// it returns an error otherwise. +func (m InstanceMetadataMutation) Tx() (*Tx, error) { + if _, ok := m.driver.(*txDriver); !ok { + return nil, errors.New("ent: mutation is not running in a transaction") + } + tx := &Tx{config: m.config} + tx.init() + return tx, nil +} + +// SetID sets the value of the id field. Note that this +// operation is only accepted on creation of InstanceMetadata entities. +func (m *InstanceMetadataMutation) SetID(id uuid.UUID) { + m.id = &id +} + +// ID returns the ID value in the mutation. Note that the ID is only available +// if it was provided to the builder or after it was returned from the database. +func (m *InstanceMetadataMutation) ID() (id uuid.UUID, exists bool) { + if m.id == nil { + return + } + return *m.id, true +} + +// IDs queries the database and returns the entity ids that match the mutation's predicate. +// That means, if the mutation is applied within a transaction with an isolation level such +// as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated +// or updated by the mutation. +func (m *InstanceMetadataMutation) IDs(ctx context.Context) ([]uuid.UUID, error) { + switch { + case m.op.Is(OpUpdateOne | OpDeleteOne): + id, exists := m.ID() + if exists { + return []uuid.UUID{id}, nil + } + fallthrough + case m.op.Is(OpUpdate | OpDelete): + return m.Client().InstanceMetadata.Query().Where(m.predicates...).IDs(ctx) + default: + return nil, fmt.Errorf("IDs is not allowed on %s operations", m.op) + } +} + +// SetIsRemote sets the "isRemote" field. +func (m *InstanceMetadataMutation) SetIsRemote(b bool) { + m.isRemote = &b +} + +// IsRemote returns the value of the "isRemote" field in the mutation. +func (m *InstanceMetadataMutation) IsRemote() (r bool, exists bool) { + v := m.isRemote + if v == nil { + return + } + return *v, true +} + +// OldIsRemote returns the old "isRemote" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldIsRemote(ctx context.Context) (v bool, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldIsRemote is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldIsRemote requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldIsRemote: %w", err) + } + return oldValue.IsRemote, nil +} + +// ResetIsRemote resets all changes to the "isRemote" field. +func (m *InstanceMetadataMutation) ResetIsRemote() { + m.isRemote = nil +} + +// SetURI sets the "uri" field. +func (m *InstanceMetadataMutation) SetURI(s string) { + m.uri = &s +} + +// URI returns the value of the "uri" field in the mutation. +func (m *InstanceMetadataMutation) URI() (r string, exists bool) { + v := m.uri + if v == nil { + return + } + return *v, true +} + +// OldURI returns the old "uri" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldURI(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldURI is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldURI requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldURI: %w", err) + } + return oldValue.URI, nil +} + +// ResetURI resets all changes to the "uri" field. +func (m *InstanceMetadataMutation) ResetURI() { + m.uri = nil +} + +// SetExtensions sets the "extensions" field. +func (m *InstanceMetadataMutation) SetExtensions(l lysand.Extensions) { + m.extensions = &l +} + +// Extensions returns the value of the "extensions" field in the mutation. +func (m *InstanceMetadataMutation) Extensions() (r lysand.Extensions, exists bool) { + v := m.extensions + if v == nil { + return + } + return *v, true +} + +// OldExtensions returns the old "extensions" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldExtensions(ctx context.Context) (v lysand.Extensions, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldExtensions is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldExtensions requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldExtensions: %w", err) + } + return oldValue.Extensions, nil +} + +// ResetExtensions resets all changes to the "extensions" field. +func (m *InstanceMetadataMutation) ResetExtensions() { + m.extensions = nil +} + +// SetCreatedAt sets the "created_at" field. +func (m *InstanceMetadataMutation) SetCreatedAt(t time.Time) { + m.created_at = &t +} + +// CreatedAt returns the value of the "created_at" field in the mutation. +func (m *InstanceMetadataMutation) CreatedAt() (r time.Time, exists bool) { + v := m.created_at + if v == nil { + return + } + return *v, true +} + +// OldCreatedAt returns the old "created_at" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldCreatedAt(ctx context.Context) (v time.Time, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldCreatedAt is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldCreatedAt requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldCreatedAt: %w", err) + } + return oldValue.CreatedAt, nil +} + +// ResetCreatedAt resets all changes to the "created_at" field. +func (m *InstanceMetadataMutation) ResetCreatedAt() { + m.created_at = nil +} + +// SetUpdatedAt sets the "updated_at" field. +func (m *InstanceMetadataMutation) SetUpdatedAt(t time.Time) { + m.updated_at = &t +} + +// UpdatedAt returns the value of the "updated_at" field in the mutation. +func (m *InstanceMetadataMutation) UpdatedAt() (r time.Time, exists bool) { + v := m.updated_at + if v == nil { + return + } + return *v, true +} + +// OldUpdatedAt returns the old "updated_at" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldUpdatedAt(ctx context.Context) (v time.Time, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldUpdatedAt is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldUpdatedAt requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldUpdatedAt: %w", err) + } + return oldValue.UpdatedAt, nil +} + +// ResetUpdatedAt resets all changes to the "updated_at" field. +func (m *InstanceMetadataMutation) ResetUpdatedAt() { + m.updated_at = nil +} + +// SetName sets the "name" field. +func (m *InstanceMetadataMutation) SetName(s string) { + m.name = &s +} + +// Name returns the value of the "name" field in the mutation. +func (m *InstanceMetadataMutation) Name() (r string, exists bool) { + v := m.name + if v == nil { + return + } + return *v, true +} + +// OldName returns the old "name" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldName(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldName is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldName requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldName: %w", err) + } + return oldValue.Name, nil +} + +// ResetName resets all changes to the "name" field. +func (m *InstanceMetadataMutation) ResetName() { + m.name = nil +} + +// SetDescription sets the "description" field. +func (m *InstanceMetadataMutation) SetDescription(s string) { + m.description = &s +} + +// Description returns the value of the "description" field in the mutation. +func (m *InstanceMetadataMutation) Description() (r string, exists bool) { + v := m.description + if v == nil { + return + } + return *v, true +} + +// OldDescription returns the old "description" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldDescription(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldDescription is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldDescription requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldDescription: %w", err) + } + return oldValue.Description, nil +} + +// ClearDescription clears the value of the "description" field. +func (m *InstanceMetadataMutation) ClearDescription() { + m.description = nil + m.clearedFields[instancemetadata.FieldDescription] = struct{}{} +} + +// DescriptionCleared returns if the "description" field was cleared in this mutation. +func (m *InstanceMetadataMutation) DescriptionCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldDescription] + return ok +} + +// ResetDescription resets all changes to the "description" field. +func (m *InstanceMetadataMutation) ResetDescription() { + m.description = nil + delete(m.clearedFields, instancemetadata.FieldDescription) +} + +// SetHost sets the "host" field. +func (m *InstanceMetadataMutation) SetHost(s string) { + m.host = &s +} + +// Host returns the value of the "host" field in the mutation. +func (m *InstanceMetadataMutation) Host() (r string, exists bool) { + v := m.host + if v == nil { + return + } + return *v, true +} + +// OldHost returns the old "host" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldHost(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldHost is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldHost requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldHost: %w", err) + } + return oldValue.Host, nil +} + +// ResetHost resets all changes to the "host" field. +func (m *InstanceMetadataMutation) ResetHost() { + m.host = nil +} + +// SetPublicKey sets the "publicKey" field. +func (m *InstanceMetadataMutation) SetPublicKey(b []byte) { + m.publicKey = &b +} + +// PublicKey returns the value of the "publicKey" field in the mutation. +func (m *InstanceMetadataMutation) PublicKey() (r []byte, exists bool) { + v := m.publicKey + if v == nil { + return + } + return *v, true +} + +// OldPublicKey returns the old "publicKey" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldPublicKey(ctx context.Context) (v []byte, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldPublicKey is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldPublicKey requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldPublicKey: %w", err) + } + return oldValue.PublicKey, nil +} + +// ResetPublicKey resets all changes to the "publicKey" field. +func (m *InstanceMetadataMutation) ResetPublicKey() { + m.publicKey = nil +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (m *InstanceMetadataMutation) SetPublicKeyAlgorithm(s string) { + m.publicKeyAlgorithm = &s +} + +// PublicKeyAlgorithm returns the value of the "publicKeyAlgorithm" field in the mutation. +func (m *InstanceMetadataMutation) PublicKeyAlgorithm() (r string, exists bool) { + v := m.publicKeyAlgorithm + if v == nil { + return + } + return *v, true +} + +// OldPublicKeyAlgorithm returns the old "publicKeyAlgorithm" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldPublicKeyAlgorithm(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldPublicKeyAlgorithm is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldPublicKeyAlgorithm requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldPublicKeyAlgorithm: %w", err) + } + return oldValue.PublicKeyAlgorithm, nil +} + +// ResetPublicKeyAlgorithm resets all changes to the "publicKeyAlgorithm" field. +func (m *InstanceMetadataMutation) ResetPublicKeyAlgorithm() { + m.publicKeyAlgorithm = nil +} + +// SetPrivateKey sets the "privateKey" field. +func (m *InstanceMetadataMutation) SetPrivateKey(b []byte) { + m.privateKey = &b +} + +// PrivateKey returns the value of the "privateKey" field in the mutation. +func (m *InstanceMetadataMutation) PrivateKey() (r []byte, exists bool) { + v := m.privateKey + if v == nil { + return + } + return *v, true +} + +// OldPrivateKey returns the old "privateKey" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldPrivateKey(ctx context.Context) (v []byte, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldPrivateKey is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldPrivateKey requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldPrivateKey: %w", err) + } + return oldValue.PrivateKey, nil +} + +// ClearPrivateKey clears the value of the "privateKey" field. +func (m *InstanceMetadataMutation) ClearPrivateKey() { + m.privateKey = nil + m.clearedFields[instancemetadata.FieldPrivateKey] = struct{}{} +} + +// PrivateKeyCleared returns if the "privateKey" field was cleared in this mutation. +func (m *InstanceMetadataMutation) PrivateKeyCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldPrivateKey] + return ok +} + +// ResetPrivateKey resets all changes to the "privateKey" field. +func (m *InstanceMetadataMutation) ResetPrivateKey() { + m.privateKey = nil + delete(m.clearedFields, instancemetadata.FieldPrivateKey) +} + +// SetSoftwareName sets the "softwareName" field. +func (m *InstanceMetadataMutation) SetSoftwareName(s string) { + m.softwareName = &s +} + +// SoftwareName returns the value of the "softwareName" field in the mutation. +func (m *InstanceMetadataMutation) SoftwareName() (r string, exists bool) { + v := m.softwareName + if v == nil { + return + } + return *v, true +} + +// OldSoftwareName returns the old "softwareName" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldSoftwareName(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldSoftwareName is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldSoftwareName requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldSoftwareName: %w", err) + } + return oldValue.SoftwareName, nil +} + +// ResetSoftwareName resets all changes to the "softwareName" field. +func (m *InstanceMetadataMutation) ResetSoftwareName() { + m.softwareName = nil +} + +// SetSoftwareVersion sets the "softwareVersion" field. +func (m *InstanceMetadataMutation) SetSoftwareVersion(s string) { + m.softwareVersion = &s +} + +// SoftwareVersion returns the value of the "softwareVersion" field in the mutation. +func (m *InstanceMetadataMutation) SoftwareVersion() (r string, exists bool) { + v := m.softwareVersion + if v == nil { + return + } + return *v, true +} + +// OldSoftwareVersion returns the old "softwareVersion" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldSoftwareVersion(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldSoftwareVersion is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldSoftwareVersion requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldSoftwareVersion: %w", err) + } + return oldValue.SoftwareVersion, nil +} + +// ResetSoftwareVersion resets all changes to the "softwareVersion" field. +func (m *InstanceMetadataMutation) ResetSoftwareVersion() { + m.softwareVersion = nil +} + +// SetSharedInboxURI sets the "sharedInboxURI" field. +func (m *InstanceMetadataMutation) SetSharedInboxURI(s string) { + m.sharedInboxURI = &s +} + +// SharedInboxURI returns the value of the "sharedInboxURI" field in the mutation. +func (m *InstanceMetadataMutation) SharedInboxURI() (r string, exists bool) { + v := m.sharedInboxURI + if v == nil { + return + } + return *v, true +} + +// OldSharedInboxURI returns the old "sharedInboxURI" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldSharedInboxURI(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldSharedInboxURI is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldSharedInboxURI requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldSharedInboxURI: %w", err) + } + return oldValue.SharedInboxURI, nil +} + +// ResetSharedInboxURI resets all changes to the "sharedInboxURI" field. +func (m *InstanceMetadataMutation) ResetSharedInboxURI() { + m.sharedInboxURI = nil +} + +// SetModeratorsURI sets the "moderatorsURI" field. +func (m *InstanceMetadataMutation) SetModeratorsURI(s string) { + m.moderatorsURI = &s +} + +// ModeratorsURI returns the value of the "moderatorsURI" field in the mutation. +func (m *InstanceMetadataMutation) ModeratorsURI() (r string, exists bool) { + v := m.moderatorsURI + if v == nil { + return + } + return *v, true +} + +// OldModeratorsURI returns the old "moderatorsURI" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldModeratorsURI(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldModeratorsURI is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldModeratorsURI requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldModeratorsURI: %w", err) + } + return oldValue.ModeratorsURI, nil +} + +// ClearModeratorsURI clears the value of the "moderatorsURI" field. +func (m *InstanceMetadataMutation) ClearModeratorsURI() { + m.moderatorsURI = nil + m.clearedFields[instancemetadata.FieldModeratorsURI] = struct{}{} +} + +// ModeratorsURICleared returns if the "moderatorsURI" field was cleared in this mutation. +func (m *InstanceMetadataMutation) ModeratorsURICleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldModeratorsURI] + return ok +} + +// ResetModeratorsURI resets all changes to the "moderatorsURI" field. +func (m *InstanceMetadataMutation) ResetModeratorsURI() { + m.moderatorsURI = nil + delete(m.clearedFields, instancemetadata.FieldModeratorsURI) +} + +// SetAdminsURI sets the "adminsURI" field. +func (m *InstanceMetadataMutation) SetAdminsURI(s string) { + m.adminsURI = &s +} + +// AdminsURI returns the value of the "adminsURI" field in the mutation. +func (m *InstanceMetadataMutation) AdminsURI() (r string, exists bool) { + v := m.adminsURI + if v == nil { + return + } + return *v, true +} + +// OldAdminsURI returns the old "adminsURI" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldAdminsURI(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldAdminsURI is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldAdminsURI requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldAdminsURI: %w", err) + } + return oldValue.AdminsURI, nil +} + +// ClearAdminsURI clears the value of the "adminsURI" field. +func (m *InstanceMetadataMutation) ClearAdminsURI() { + m.adminsURI = nil + m.clearedFields[instancemetadata.FieldAdminsURI] = struct{}{} +} + +// AdminsURICleared returns if the "adminsURI" field was cleared in this mutation. +func (m *InstanceMetadataMutation) AdminsURICleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldAdminsURI] + return ok +} + +// ResetAdminsURI resets all changes to the "adminsURI" field. +func (m *InstanceMetadataMutation) ResetAdminsURI() { + m.adminsURI = nil + delete(m.clearedFields, instancemetadata.FieldAdminsURI) +} + +// SetLogoEndpoint sets the "logoEndpoint" field. +func (m *InstanceMetadataMutation) SetLogoEndpoint(s string) { + m.logoEndpoint = &s +} + +// LogoEndpoint returns the value of the "logoEndpoint" field in the mutation. +func (m *InstanceMetadataMutation) LogoEndpoint() (r string, exists bool) { + v := m.logoEndpoint + if v == nil { + return + } + return *v, true +} + +// OldLogoEndpoint returns the old "logoEndpoint" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldLogoEndpoint(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldLogoEndpoint is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldLogoEndpoint requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldLogoEndpoint: %w", err) + } + return oldValue.LogoEndpoint, nil +} + +// ClearLogoEndpoint clears the value of the "logoEndpoint" field. +func (m *InstanceMetadataMutation) ClearLogoEndpoint() { + m.logoEndpoint = nil + m.clearedFields[instancemetadata.FieldLogoEndpoint] = struct{}{} +} + +// LogoEndpointCleared returns if the "logoEndpoint" field was cleared in this mutation. +func (m *InstanceMetadataMutation) LogoEndpointCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldLogoEndpoint] + return ok +} + +// ResetLogoEndpoint resets all changes to the "logoEndpoint" field. +func (m *InstanceMetadataMutation) ResetLogoEndpoint() { + m.logoEndpoint = nil + delete(m.clearedFields, instancemetadata.FieldLogoEndpoint) +} + +// SetLogoMimeType sets the "logoMimeType" field. +func (m *InstanceMetadataMutation) SetLogoMimeType(s string) { + m.logoMimeType = &s +} + +// LogoMimeType returns the value of the "logoMimeType" field in the mutation. +func (m *InstanceMetadataMutation) LogoMimeType() (r string, exists bool) { + v := m.logoMimeType + if v == nil { + return + } + return *v, true +} + +// OldLogoMimeType returns the old "logoMimeType" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldLogoMimeType(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldLogoMimeType is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldLogoMimeType requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldLogoMimeType: %w", err) + } + return oldValue.LogoMimeType, nil +} + +// ClearLogoMimeType clears the value of the "logoMimeType" field. +func (m *InstanceMetadataMutation) ClearLogoMimeType() { + m.logoMimeType = nil + m.clearedFields[instancemetadata.FieldLogoMimeType] = struct{}{} +} + +// LogoMimeTypeCleared returns if the "logoMimeType" field was cleared in this mutation. +func (m *InstanceMetadataMutation) LogoMimeTypeCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldLogoMimeType] + return ok +} + +// ResetLogoMimeType resets all changes to the "logoMimeType" field. +func (m *InstanceMetadataMutation) ResetLogoMimeType() { + m.logoMimeType = nil + delete(m.clearedFields, instancemetadata.FieldLogoMimeType) +} + +// SetBannerEndpoint sets the "bannerEndpoint" field. +func (m *InstanceMetadataMutation) SetBannerEndpoint(s string) { + m.bannerEndpoint = &s +} + +// BannerEndpoint returns the value of the "bannerEndpoint" field in the mutation. +func (m *InstanceMetadataMutation) BannerEndpoint() (r string, exists bool) { + v := m.bannerEndpoint + if v == nil { + return + } + return *v, true +} + +// OldBannerEndpoint returns the old "bannerEndpoint" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldBannerEndpoint(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldBannerEndpoint is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldBannerEndpoint requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldBannerEndpoint: %w", err) + } + return oldValue.BannerEndpoint, nil +} + +// ClearBannerEndpoint clears the value of the "bannerEndpoint" field. +func (m *InstanceMetadataMutation) ClearBannerEndpoint() { + m.bannerEndpoint = nil + m.clearedFields[instancemetadata.FieldBannerEndpoint] = struct{}{} +} + +// BannerEndpointCleared returns if the "bannerEndpoint" field was cleared in this mutation. +func (m *InstanceMetadataMutation) BannerEndpointCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldBannerEndpoint] + return ok +} + +// ResetBannerEndpoint resets all changes to the "bannerEndpoint" field. +func (m *InstanceMetadataMutation) ResetBannerEndpoint() { + m.bannerEndpoint = nil + delete(m.clearedFields, instancemetadata.FieldBannerEndpoint) +} + +// SetBannerMimeType sets the "bannerMimeType" field. +func (m *InstanceMetadataMutation) SetBannerMimeType(s string) { + m.bannerMimeType = &s +} + +// BannerMimeType returns the value of the "bannerMimeType" field in the mutation. +func (m *InstanceMetadataMutation) BannerMimeType() (r string, exists bool) { + v := m.bannerMimeType + if v == nil { + return + } + return *v, true +} + +// OldBannerMimeType returns the old "bannerMimeType" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldBannerMimeType(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldBannerMimeType is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldBannerMimeType requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldBannerMimeType: %w", err) + } + return oldValue.BannerMimeType, nil +} + +// ClearBannerMimeType clears the value of the "bannerMimeType" field. +func (m *InstanceMetadataMutation) ClearBannerMimeType() { + m.bannerMimeType = nil + m.clearedFields[instancemetadata.FieldBannerMimeType] = struct{}{} +} + +// BannerMimeTypeCleared returns if the "bannerMimeType" field was cleared in this mutation. +func (m *InstanceMetadataMutation) BannerMimeTypeCleared() bool { + _, ok := m.clearedFields[instancemetadata.FieldBannerMimeType] + return ok +} + +// ResetBannerMimeType resets all changes to the "bannerMimeType" field. +func (m *InstanceMetadataMutation) ResetBannerMimeType() { + m.bannerMimeType = nil + delete(m.clearedFields, instancemetadata.FieldBannerMimeType) +} + +// SetSupportedVersions sets the "supportedVersions" field. +func (m *InstanceMetadataMutation) SetSupportedVersions(s []string) { + m.supportedVersions = &s + m.appendsupportedVersions = nil +} + +// SupportedVersions returns the value of the "supportedVersions" field in the mutation. +func (m *InstanceMetadataMutation) SupportedVersions() (r []string, exists bool) { + v := m.supportedVersions + if v == nil { + return + } + return *v, true +} + +// OldSupportedVersions returns the old "supportedVersions" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldSupportedVersions(ctx context.Context) (v []string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldSupportedVersions is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldSupportedVersions requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldSupportedVersions: %w", err) + } + return oldValue.SupportedVersions, nil +} + +// AppendSupportedVersions adds s to the "supportedVersions" field. +func (m *InstanceMetadataMutation) AppendSupportedVersions(s []string) { + m.appendsupportedVersions = append(m.appendsupportedVersions, s...) +} + +// AppendedSupportedVersions returns the list of values that were appended to the "supportedVersions" field in this mutation. +func (m *InstanceMetadataMutation) AppendedSupportedVersions() ([]string, bool) { + if len(m.appendsupportedVersions) == 0 { + return nil, false + } + return m.appendsupportedVersions, true +} + +// ResetSupportedVersions resets all changes to the "supportedVersions" field. +func (m *InstanceMetadataMutation) ResetSupportedVersions() { + m.supportedVersions = nil + m.appendsupportedVersions = nil +} + +// SetSupportedExtensions sets the "supportedExtensions" field. +func (m *InstanceMetadataMutation) SetSupportedExtensions(s []string) { + m.supportedExtensions = &s + m.appendsupportedExtensions = nil +} + +// SupportedExtensions returns the value of the "supportedExtensions" field in the mutation. +func (m *InstanceMetadataMutation) SupportedExtensions() (r []string, exists bool) { + v := m.supportedExtensions + if v == nil { + return + } + return *v, true +} + +// OldSupportedExtensions returns the old "supportedExtensions" field's value of the InstanceMetadata entity. +// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *InstanceMetadataMutation) OldSupportedExtensions(ctx context.Context) (v []string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldSupportedExtensions is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldSupportedExtensions requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldSupportedExtensions: %w", err) + } + return oldValue.SupportedExtensions, nil +} + +// AppendSupportedExtensions adds s to the "supportedExtensions" field. +func (m *InstanceMetadataMutation) AppendSupportedExtensions(s []string) { + m.appendsupportedExtensions = append(m.appendsupportedExtensions, s...) +} + +// AppendedSupportedExtensions returns the list of values that were appended to the "supportedExtensions" field in this mutation. +func (m *InstanceMetadataMutation) AppendedSupportedExtensions() ([]string, bool) { + if len(m.appendsupportedExtensions) == 0 { + return nil, false + } + return m.appendsupportedExtensions, true +} + +// ResetSupportedExtensions resets all changes to the "supportedExtensions" field. +func (m *InstanceMetadataMutation) ResetSupportedExtensions() { + m.supportedExtensions = nil + m.appendsupportedExtensions = nil +} + +// AddUserIDs adds the "users" edge to the User entity by ids. +func (m *InstanceMetadataMutation) AddUserIDs(ids ...uuid.UUID) { + if m.users == nil { + m.users = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.users[ids[i]] = struct{}{} + } +} + +// ClearUsers clears the "users" edge to the User entity. +func (m *InstanceMetadataMutation) ClearUsers() { + m.clearedusers = true +} + +// UsersCleared reports if the "users" edge to the User entity was cleared. +func (m *InstanceMetadataMutation) UsersCleared() bool { + return m.clearedusers +} + +// RemoveUserIDs removes the "users" edge to the User entity by IDs. +func (m *InstanceMetadataMutation) RemoveUserIDs(ids ...uuid.UUID) { + if m.removedusers == nil { + m.removedusers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.users, ids[i]) + m.removedusers[ids[i]] = struct{}{} + } +} + +// RemovedUsers returns the removed IDs of the "users" edge to the User entity. +func (m *InstanceMetadataMutation) RemovedUsersIDs() (ids []uuid.UUID) { + for id := range m.removedusers { + ids = append(ids, id) + } + return +} + +// UsersIDs returns the "users" edge IDs in the mutation. +func (m *InstanceMetadataMutation) UsersIDs() (ids []uuid.UUID) { + for id := range m.users { + ids = append(ids, id) + } + return +} + +// ResetUsers resets all changes to the "users" edge. +func (m *InstanceMetadataMutation) ResetUsers() { + m.users = nil + m.clearedusers = false + m.removedusers = nil +} + +// AddModeratorIDs adds the "moderators" edge to the User entity by ids. +func (m *InstanceMetadataMutation) AddModeratorIDs(ids ...uuid.UUID) { + if m.moderators == nil { + m.moderators = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.moderators[ids[i]] = struct{}{} + } +} + +// ClearModerators clears the "moderators" edge to the User entity. +func (m *InstanceMetadataMutation) ClearModerators() { + m.clearedmoderators = true +} + +// ModeratorsCleared reports if the "moderators" edge to the User entity was cleared. +func (m *InstanceMetadataMutation) ModeratorsCleared() bool { + return m.clearedmoderators +} + +// RemoveModeratorIDs removes the "moderators" edge to the User entity by IDs. +func (m *InstanceMetadataMutation) RemoveModeratorIDs(ids ...uuid.UUID) { + if m.removedmoderators == nil { + m.removedmoderators = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.moderators, ids[i]) + m.removedmoderators[ids[i]] = struct{}{} + } +} + +// RemovedModerators returns the removed IDs of the "moderators" edge to the User entity. +func (m *InstanceMetadataMutation) RemovedModeratorsIDs() (ids []uuid.UUID) { + for id := range m.removedmoderators { + ids = append(ids, id) + } + return +} + +// ModeratorsIDs returns the "moderators" edge IDs in the mutation. +func (m *InstanceMetadataMutation) ModeratorsIDs() (ids []uuid.UUID) { + for id := range m.moderators { + ids = append(ids, id) + } + return +} + +// ResetModerators resets all changes to the "moderators" edge. +func (m *InstanceMetadataMutation) ResetModerators() { + m.moderators = nil + m.clearedmoderators = false + m.removedmoderators = nil +} + +// AddAdminIDs adds the "admins" edge to the User entity by ids. +func (m *InstanceMetadataMutation) AddAdminIDs(ids ...uuid.UUID) { + if m.admins == nil { + m.admins = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.admins[ids[i]] = struct{}{} + } +} + +// ClearAdmins clears the "admins" edge to the User entity. +func (m *InstanceMetadataMutation) ClearAdmins() { + m.clearedadmins = true +} + +// AdminsCleared reports if the "admins" edge to the User entity was cleared. +func (m *InstanceMetadataMutation) AdminsCleared() bool { + return m.clearedadmins +} + +// RemoveAdminIDs removes the "admins" edge to the User entity by IDs. +func (m *InstanceMetadataMutation) RemoveAdminIDs(ids ...uuid.UUID) { + if m.removedadmins == nil { + m.removedadmins = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.admins, ids[i]) + m.removedadmins[ids[i]] = struct{}{} + } +} + +// RemovedAdmins returns the removed IDs of the "admins" edge to the User entity. +func (m *InstanceMetadataMutation) RemovedAdminsIDs() (ids []uuid.UUID) { + for id := range m.removedadmins { + ids = append(ids, id) + } + return +} + +// AdminsIDs returns the "admins" edge IDs in the mutation. +func (m *InstanceMetadataMutation) AdminsIDs() (ids []uuid.UUID) { + for id := range m.admins { + ids = append(ids, id) + } + return +} + +// ResetAdmins resets all changes to the "admins" edge. +func (m *InstanceMetadataMutation) ResetAdmins() { + m.admins = nil + m.clearedadmins = false + m.removedadmins = nil +} + +// Where appends a list predicates to the InstanceMetadataMutation builder. +func (m *InstanceMetadataMutation) Where(ps ...predicate.InstanceMetadata) { + m.predicates = append(m.predicates, ps...) +} + +// WhereP appends storage-level predicates to the InstanceMetadataMutation builder. Using this method, +// users can use type-assertion to append predicates that do not depend on any generated package. +func (m *InstanceMetadataMutation) WhereP(ps ...func(*sql.Selector)) { + p := make([]predicate.InstanceMetadata, len(ps)) + for i := range ps { + p[i] = ps[i] + } + m.Where(p...) +} + +// Op returns the operation name. +func (m *InstanceMetadataMutation) Op() Op { + return m.op +} + +// SetOp allows setting the mutation operation. +func (m *InstanceMetadataMutation) SetOp(op Op) { + m.op = op +} + +// Type returns the node type of this mutation (InstanceMetadata). +func (m *InstanceMetadataMutation) Type() string { + return m.typ +} + +// Fields returns all fields that were changed during this mutation. Note that in +// order to get all numeric fields that were incremented/decremented, call +// AddedFields(). +func (m *InstanceMetadataMutation) Fields() []string { + fields := make([]string, 0, 22) + if m.isRemote != nil { + fields = append(fields, instancemetadata.FieldIsRemote) + } + if m.uri != nil { + fields = append(fields, instancemetadata.FieldURI) + } + if m.extensions != nil { + fields = append(fields, instancemetadata.FieldExtensions) + } + if m.created_at != nil { + fields = append(fields, instancemetadata.FieldCreatedAt) + } + if m.updated_at != nil { + fields = append(fields, instancemetadata.FieldUpdatedAt) + } + if m.name != nil { + fields = append(fields, instancemetadata.FieldName) + } + if m.description != nil { + fields = append(fields, instancemetadata.FieldDescription) + } + if m.host != nil { + fields = append(fields, instancemetadata.FieldHost) + } + if m.publicKey != nil { + fields = append(fields, instancemetadata.FieldPublicKey) + } + if m.publicKeyAlgorithm != nil { + fields = append(fields, instancemetadata.FieldPublicKeyAlgorithm) + } + if m.privateKey != nil { + fields = append(fields, instancemetadata.FieldPrivateKey) + } + if m.softwareName != nil { + fields = append(fields, instancemetadata.FieldSoftwareName) + } + if m.softwareVersion != nil { + fields = append(fields, instancemetadata.FieldSoftwareVersion) + } + if m.sharedInboxURI != nil { + fields = append(fields, instancemetadata.FieldSharedInboxURI) + } + if m.moderatorsURI != nil { + fields = append(fields, instancemetadata.FieldModeratorsURI) + } + if m.adminsURI != nil { + fields = append(fields, instancemetadata.FieldAdminsURI) + } + if m.logoEndpoint != nil { + fields = append(fields, instancemetadata.FieldLogoEndpoint) + } + if m.logoMimeType != nil { + fields = append(fields, instancemetadata.FieldLogoMimeType) + } + if m.bannerEndpoint != nil { + fields = append(fields, instancemetadata.FieldBannerEndpoint) + } + if m.bannerMimeType != nil { + fields = append(fields, instancemetadata.FieldBannerMimeType) + } + if m.supportedVersions != nil { + fields = append(fields, instancemetadata.FieldSupportedVersions) + } + if m.supportedExtensions != nil { + fields = append(fields, instancemetadata.FieldSupportedExtensions) + } + return fields +} + +// Field returns the value of a field with the given name. The second boolean +// return value indicates that this field was not set, or was not defined in the +// schema. +func (m *InstanceMetadataMutation) Field(name string) (ent.Value, bool) { + switch name { + case instancemetadata.FieldIsRemote: + return m.IsRemote() + case instancemetadata.FieldURI: + return m.URI() + case instancemetadata.FieldExtensions: + return m.Extensions() + case instancemetadata.FieldCreatedAt: + return m.CreatedAt() + case instancemetadata.FieldUpdatedAt: + return m.UpdatedAt() + case instancemetadata.FieldName: + return m.Name() + case instancemetadata.FieldDescription: + return m.Description() + case instancemetadata.FieldHost: + return m.Host() + case instancemetadata.FieldPublicKey: + return m.PublicKey() + case instancemetadata.FieldPublicKeyAlgorithm: + return m.PublicKeyAlgorithm() + case instancemetadata.FieldPrivateKey: + return m.PrivateKey() + case instancemetadata.FieldSoftwareName: + return m.SoftwareName() + case instancemetadata.FieldSoftwareVersion: + return m.SoftwareVersion() + case instancemetadata.FieldSharedInboxURI: + return m.SharedInboxURI() + case instancemetadata.FieldModeratorsURI: + return m.ModeratorsURI() + case instancemetadata.FieldAdminsURI: + return m.AdminsURI() + case instancemetadata.FieldLogoEndpoint: + return m.LogoEndpoint() + case instancemetadata.FieldLogoMimeType: + return m.LogoMimeType() + case instancemetadata.FieldBannerEndpoint: + return m.BannerEndpoint() + case instancemetadata.FieldBannerMimeType: + return m.BannerMimeType() + case instancemetadata.FieldSupportedVersions: + return m.SupportedVersions() + case instancemetadata.FieldSupportedExtensions: + return m.SupportedExtensions() + } + return nil, false +} + +// OldField returns the old value of the field from the database. An error is +// returned if the mutation operation is not UpdateOne, or the query to the +// database failed. +func (m *InstanceMetadataMutation) OldField(ctx context.Context, name string) (ent.Value, error) { + switch name { + case instancemetadata.FieldIsRemote: + return m.OldIsRemote(ctx) + case instancemetadata.FieldURI: + return m.OldURI(ctx) + case instancemetadata.FieldExtensions: + return m.OldExtensions(ctx) + case instancemetadata.FieldCreatedAt: + return m.OldCreatedAt(ctx) + case instancemetadata.FieldUpdatedAt: + return m.OldUpdatedAt(ctx) + case instancemetadata.FieldName: + return m.OldName(ctx) + case instancemetadata.FieldDescription: + return m.OldDescription(ctx) + case instancemetadata.FieldHost: + return m.OldHost(ctx) + case instancemetadata.FieldPublicKey: + return m.OldPublicKey(ctx) + case instancemetadata.FieldPublicKeyAlgorithm: + return m.OldPublicKeyAlgorithm(ctx) + case instancemetadata.FieldPrivateKey: + return m.OldPrivateKey(ctx) + case instancemetadata.FieldSoftwareName: + return m.OldSoftwareName(ctx) + case instancemetadata.FieldSoftwareVersion: + return m.OldSoftwareVersion(ctx) + case instancemetadata.FieldSharedInboxURI: + return m.OldSharedInboxURI(ctx) + case instancemetadata.FieldModeratorsURI: + return m.OldModeratorsURI(ctx) + case instancemetadata.FieldAdminsURI: + return m.OldAdminsURI(ctx) + case instancemetadata.FieldLogoEndpoint: + return m.OldLogoEndpoint(ctx) + case instancemetadata.FieldLogoMimeType: + return m.OldLogoMimeType(ctx) + case instancemetadata.FieldBannerEndpoint: + return m.OldBannerEndpoint(ctx) + case instancemetadata.FieldBannerMimeType: + return m.OldBannerMimeType(ctx) + case instancemetadata.FieldSupportedVersions: + return m.OldSupportedVersions(ctx) + case instancemetadata.FieldSupportedExtensions: + return m.OldSupportedExtensions(ctx) + } + return nil, fmt.Errorf("unknown InstanceMetadata field %s", name) +} + +// SetField sets the value of a field with the given name. It returns an error if +// the field is not defined in the schema, or if the type mismatched the field +// type. +func (m *InstanceMetadataMutation) SetField(name string, value ent.Value) error { + switch name { + case instancemetadata.FieldIsRemote: + v, ok := value.(bool) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetIsRemote(v) + return nil + case instancemetadata.FieldURI: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetURI(v) + return nil + case instancemetadata.FieldExtensions: + v, ok := value.(lysand.Extensions) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetExtensions(v) + return nil + case instancemetadata.FieldCreatedAt: + v, ok := value.(time.Time) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetCreatedAt(v) + return nil + case instancemetadata.FieldUpdatedAt: + v, ok := value.(time.Time) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetUpdatedAt(v) + return nil + case instancemetadata.FieldName: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetName(v) + return nil + case instancemetadata.FieldDescription: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetDescription(v) + return nil + case instancemetadata.FieldHost: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetHost(v) + return nil + case instancemetadata.FieldPublicKey: + v, ok := value.([]byte) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetPublicKey(v) + return nil + case instancemetadata.FieldPublicKeyAlgorithm: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetPublicKeyAlgorithm(v) + return nil + case instancemetadata.FieldPrivateKey: + v, ok := value.([]byte) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetPrivateKey(v) + return nil + case instancemetadata.FieldSoftwareName: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetSoftwareName(v) + return nil + case instancemetadata.FieldSoftwareVersion: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetSoftwareVersion(v) + return nil + case instancemetadata.FieldSharedInboxURI: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetSharedInboxURI(v) + return nil + case instancemetadata.FieldModeratorsURI: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetModeratorsURI(v) + return nil + case instancemetadata.FieldAdminsURI: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetAdminsURI(v) + return nil + case instancemetadata.FieldLogoEndpoint: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetLogoEndpoint(v) + return nil + case instancemetadata.FieldLogoMimeType: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetLogoMimeType(v) + return nil + case instancemetadata.FieldBannerEndpoint: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetBannerEndpoint(v) + return nil + case instancemetadata.FieldBannerMimeType: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetBannerMimeType(v) + return nil + case instancemetadata.FieldSupportedVersions: + v, ok := value.([]string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetSupportedVersions(v) + return nil + case instancemetadata.FieldSupportedExtensions: + v, ok := value.([]string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetSupportedExtensions(v) + return nil + } + return fmt.Errorf("unknown InstanceMetadata field %s", name) +} + +// AddedFields returns all numeric fields that were incremented/decremented during +// this mutation. +func (m *InstanceMetadataMutation) AddedFields() []string { + return nil +} + +// AddedField returns the numeric value that was incremented/decremented on a field +// with the given name. The second boolean return value indicates that this field +// was not set, or was not defined in the schema. +func (m *InstanceMetadataMutation) AddedField(name string) (ent.Value, bool) { + return nil, false +} + +// AddField adds the value to the field with the given name. It returns an error if +// the field is not defined in the schema, or if the type mismatched the field +// type. +func (m *InstanceMetadataMutation) AddField(name string, value ent.Value) error { + switch name { + } + return fmt.Errorf("unknown InstanceMetadata numeric field %s", name) +} + +// ClearedFields returns all nullable fields that were cleared during this +// mutation. +func (m *InstanceMetadataMutation) ClearedFields() []string { + var fields []string + if m.FieldCleared(instancemetadata.FieldDescription) { + fields = append(fields, instancemetadata.FieldDescription) + } + if m.FieldCleared(instancemetadata.FieldPrivateKey) { + fields = append(fields, instancemetadata.FieldPrivateKey) + } + if m.FieldCleared(instancemetadata.FieldModeratorsURI) { + fields = append(fields, instancemetadata.FieldModeratorsURI) + } + if m.FieldCleared(instancemetadata.FieldAdminsURI) { + fields = append(fields, instancemetadata.FieldAdminsURI) + } + if m.FieldCleared(instancemetadata.FieldLogoEndpoint) { + fields = append(fields, instancemetadata.FieldLogoEndpoint) + } + if m.FieldCleared(instancemetadata.FieldLogoMimeType) { + fields = append(fields, instancemetadata.FieldLogoMimeType) + } + if m.FieldCleared(instancemetadata.FieldBannerEndpoint) { + fields = append(fields, instancemetadata.FieldBannerEndpoint) + } + if m.FieldCleared(instancemetadata.FieldBannerMimeType) { + fields = append(fields, instancemetadata.FieldBannerMimeType) + } + return fields +} + +// FieldCleared returns a boolean indicating if a field with the given name was +// cleared in this mutation. +func (m *InstanceMetadataMutation) FieldCleared(name string) bool { + _, ok := m.clearedFields[name] + return ok +} + +// ClearField clears the value of the field with the given name. It returns an +// error if the field is not defined in the schema. +func (m *InstanceMetadataMutation) ClearField(name string) error { + switch name { + case instancemetadata.FieldDescription: + m.ClearDescription() + return nil + case instancemetadata.FieldPrivateKey: + m.ClearPrivateKey() + return nil + case instancemetadata.FieldModeratorsURI: + m.ClearModeratorsURI() + return nil + case instancemetadata.FieldAdminsURI: + m.ClearAdminsURI() + return nil + case instancemetadata.FieldLogoEndpoint: + m.ClearLogoEndpoint() + return nil + case instancemetadata.FieldLogoMimeType: + m.ClearLogoMimeType() + return nil + case instancemetadata.FieldBannerEndpoint: + m.ClearBannerEndpoint() + return nil + case instancemetadata.FieldBannerMimeType: + m.ClearBannerMimeType() + return nil + } + return fmt.Errorf("unknown InstanceMetadata nullable field %s", name) +} + +// ResetField resets all changes in the mutation for the field with the given name. +// It returns an error if the field is not defined in the schema. +func (m *InstanceMetadataMutation) ResetField(name string) error { + switch name { + case instancemetadata.FieldIsRemote: + m.ResetIsRemote() + return nil + case instancemetadata.FieldURI: + m.ResetURI() + return nil + case instancemetadata.FieldExtensions: + m.ResetExtensions() + return nil + case instancemetadata.FieldCreatedAt: + m.ResetCreatedAt() + return nil + case instancemetadata.FieldUpdatedAt: + m.ResetUpdatedAt() + return nil + case instancemetadata.FieldName: + m.ResetName() + return nil + case instancemetadata.FieldDescription: + m.ResetDescription() + return nil + case instancemetadata.FieldHost: + m.ResetHost() + return nil + case instancemetadata.FieldPublicKey: + m.ResetPublicKey() + return nil + case instancemetadata.FieldPublicKeyAlgorithm: + m.ResetPublicKeyAlgorithm() + return nil + case instancemetadata.FieldPrivateKey: + m.ResetPrivateKey() + return nil + case instancemetadata.FieldSoftwareName: + m.ResetSoftwareName() + return nil + case instancemetadata.FieldSoftwareVersion: + m.ResetSoftwareVersion() + return nil + case instancemetadata.FieldSharedInboxURI: + m.ResetSharedInboxURI() + return nil + case instancemetadata.FieldModeratorsURI: + m.ResetModeratorsURI() + return nil + case instancemetadata.FieldAdminsURI: + m.ResetAdminsURI() + return nil + case instancemetadata.FieldLogoEndpoint: + m.ResetLogoEndpoint() + return nil + case instancemetadata.FieldLogoMimeType: + m.ResetLogoMimeType() + return nil + case instancemetadata.FieldBannerEndpoint: + m.ResetBannerEndpoint() + return nil + case instancemetadata.FieldBannerMimeType: + m.ResetBannerMimeType() + return nil + case instancemetadata.FieldSupportedVersions: + m.ResetSupportedVersions() + return nil + case instancemetadata.FieldSupportedExtensions: + m.ResetSupportedExtensions() + return nil + } + return fmt.Errorf("unknown InstanceMetadata field %s", name) +} + +// AddedEdges returns all edge names that were set/added in this mutation. +func (m *InstanceMetadataMutation) AddedEdges() []string { + edges := make([]string, 0, 3) + if m.users != nil { + edges = append(edges, instancemetadata.EdgeUsers) + } + if m.moderators != nil { + edges = append(edges, instancemetadata.EdgeModerators) + } + if m.admins != nil { + edges = append(edges, instancemetadata.EdgeAdmins) + } + return edges +} + +// AddedIDs returns all IDs (to other nodes) that were added for the given edge +// name in this mutation. +func (m *InstanceMetadataMutation) AddedIDs(name string) []ent.Value { + switch name { + case instancemetadata.EdgeUsers: + ids := make([]ent.Value, 0, len(m.users)) + for id := range m.users { + ids = append(ids, id) + } + return ids + case instancemetadata.EdgeModerators: + ids := make([]ent.Value, 0, len(m.moderators)) + for id := range m.moderators { + ids = append(ids, id) + } + return ids + case instancemetadata.EdgeAdmins: + ids := make([]ent.Value, 0, len(m.admins)) + for id := range m.admins { + ids = append(ids, id) + } + return ids + } + return nil +} + +// RemovedEdges returns all edge names that were removed in this mutation. +func (m *InstanceMetadataMutation) RemovedEdges() []string { + edges := make([]string, 0, 3) + if m.removedusers != nil { + edges = append(edges, instancemetadata.EdgeUsers) + } + if m.removedmoderators != nil { + edges = append(edges, instancemetadata.EdgeModerators) + } + if m.removedadmins != nil { + edges = append(edges, instancemetadata.EdgeAdmins) + } + return edges +} + +// RemovedIDs returns all IDs (to other nodes) that were removed for the edge with +// the given name in this mutation. +func (m *InstanceMetadataMutation) RemovedIDs(name string) []ent.Value { + switch name { + case instancemetadata.EdgeUsers: + ids := make([]ent.Value, 0, len(m.removedusers)) + for id := range m.removedusers { + ids = append(ids, id) + } + return ids + case instancemetadata.EdgeModerators: + ids := make([]ent.Value, 0, len(m.removedmoderators)) + for id := range m.removedmoderators { + ids = append(ids, id) + } + return ids + case instancemetadata.EdgeAdmins: + ids := make([]ent.Value, 0, len(m.removedadmins)) + for id := range m.removedadmins { + ids = append(ids, id) + } + return ids + } + return nil +} + +// ClearedEdges returns all edge names that were cleared in this mutation. +func (m *InstanceMetadataMutation) ClearedEdges() []string { + edges := make([]string, 0, 3) + if m.clearedusers { + edges = append(edges, instancemetadata.EdgeUsers) + } + if m.clearedmoderators { + edges = append(edges, instancemetadata.EdgeModerators) + } + if m.clearedadmins { + edges = append(edges, instancemetadata.EdgeAdmins) + } + return edges +} + +// EdgeCleared returns a boolean which indicates if the edge with the given name +// was cleared in this mutation. +func (m *InstanceMetadataMutation) EdgeCleared(name string) bool { + switch name { + case instancemetadata.EdgeUsers: + return m.clearedusers + case instancemetadata.EdgeModerators: + return m.clearedmoderators + case instancemetadata.EdgeAdmins: + return m.clearedadmins + } + return false +} + +// ClearEdge clears the value of the edge with the given name. It returns an error +// if that edge is not defined in the schema. +func (m *InstanceMetadataMutation) ClearEdge(name string) error { + switch name { + } + return fmt.Errorf("unknown InstanceMetadata unique edge %s", name) +} + +// ResetEdge resets all changes to the edge with the given name in this mutation. +// It returns an error if the edge is not defined in the schema. +func (m *InstanceMetadataMutation) ResetEdge(name string) error { + switch name { + case instancemetadata.EdgeUsers: + m.ResetUsers() + return nil + case instancemetadata.EdgeModerators: + m.ResetModerators() + return nil + case instancemetadata.EdgeAdmins: + m.ResetAdmins() + return nil + } + return fmt.Errorf("unknown InstanceMetadata edge %s", name) +} + // NoteMutation represents an operation that mutates the Note nodes in the graph. type NoteMutation struct { config @@ -3433,974 +5344,57 @@ func (m *NoteMutation) ResetEdge(name string) error { return fmt.Errorf("unknown Note edge %s", name) } -// ServerMetadataMutation represents an operation that mutates the ServerMetadata nodes in the graph. -type ServerMetadataMutation struct { - config - op Op - typ string - id *uuid.UUID - isRemote *bool - uri *string - extensions *lysand.Extensions - created_at *time.Time - updated_at *time.Time - name *string - description *string - version *string - supportedExtensions *[]string - appendsupportedExtensions []string - clearedFields map[string]struct{} - follower *uuid.UUID - clearedfollower bool - followee *uuid.UUID - clearedfollowee bool - done bool - oldValue func(context.Context) (*ServerMetadata, error) - predicates []predicate.ServerMetadata -} - -var _ ent.Mutation = (*ServerMetadataMutation)(nil) - -// servermetadataOption allows management of the mutation configuration using functional options. -type servermetadataOption func(*ServerMetadataMutation) - -// newServerMetadataMutation creates new mutation for the ServerMetadata entity. -func newServerMetadataMutation(c config, op Op, opts ...servermetadataOption) *ServerMetadataMutation { - m := &ServerMetadataMutation{ - config: c, - op: op, - typ: TypeServerMetadata, - clearedFields: make(map[string]struct{}), - } - for _, opt := range opts { - opt(m) - } - return m -} - -// withServerMetadataID sets the ID field of the mutation. -func withServerMetadataID(id uuid.UUID) servermetadataOption { - return func(m *ServerMetadataMutation) { - var ( - err error - once sync.Once - value *ServerMetadata - ) - m.oldValue = func(ctx context.Context) (*ServerMetadata, error) { - once.Do(func() { - if m.done { - err = errors.New("querying old values post mutation is not allowed") - } else { - value, err = m.Client().ServerMetadata.Get(ctx, id) - } - }) - return value, err - } - m.id = &id - } -} - -// withServerMetadata sets the old ServerMetadata of the mutation. -func withServerMetadata(node *ServerMetadata) servermetadataOption { - return func(m *ServerMetadataMutation) { - m.oldValue = func(context.Context) (*ServerMetadata, error) { - return node, nil - } - m.id = &node.ID - } -} - -// Client returns a new `ent.Client` from the mutation. If the mutation was -// executed in a transaction (ent.Tx), a transactional client is returned. -func (m ServerMetadataMutation) Client() *Client { - client := &Client{config: m.config} - client.init() - return client -} - -// Tx returns an `ent.Tx` for mutations that were executed in transactions; -// it returns an error otherwise. -func (m ServerMetadataMutation) Tx() (*Tx, error) { - if _, ok := m.driver.(*txDriver); !ok { - return nil, errors.New("ent: mutation is not running in a transaction") - } - tx := &Tx{config: m.config} - tx.init() - return tx, nil -} - -// SetID sets the value of the id field. Note that this -// operation is only accepted on creation of ServerMetadata entities. -func (m *ServerMetadataMutation) SetID(id uuid.UUID) { - m.id = &id -} - -// ID returns the ID value in the mutation. Note that the ID is only available -// if it was provided to the builder or after it was returned from the database. -func (m *ServerMetadataMutation) ID() (id uuid.UUID, exists bool) { - if m.id == nil { - return - } - return *m.id, true -} - -// IDs queries the database and returns the entity ids that match the mutation's predicate. -// That means, if the mutation is applied within a transaction with an isolation level such -// as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated -// or updated by the mutation. -func (m *ServerMetadataMutation) IDs(ctx context.Context) ([]uuid.UUID, error) { - switch { - case m.op.Is(OpUpdateOne | OpDeleteOne): - id, exists := m.ID() - if exists { - return []uuid.UUID{id}, nil - } - fallthrough - case m.op.Is(OpUpdate | OpDelete): - return m.Client().ServerMetadata.Query().Where(m.predicates...).IDs(ctx) - default: - return nil, fmt.Errorf("IDs is not allowed on %s operations", m.op) - } -} - -// SetIsRemote sets the "isRemote" field. -func (m *ServerMetadataMutation) SetIsRemote(b bool) { - m.isRemote = &b -} - -// IsRemote returns the value of the "isRemote" field in the mutation. -func (m *ServerMetadataMutation) IsRemote() (r bool, exists bool) { - v := m.isRemote - if v == nil { - return - } - return *v, true -} - -// OldIsRemote returns the old "isRemote" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldIsRemote(ctx context.Context) (v bool, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldIsRemote is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldIsRemote requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldIsRemote: %w", err) - } - return oldValue.IsRemote, nil -} - -// ResetIsRemote resets all changes to the "isRemote" field. -func (m *ServerMetadataMutation) ResetIsRemote() { - m.isRemote = nil -} - -// SetURI sets the "uri" field. -func (m *ServerMetadataMutation) SetURI(s string) { - m.uri = &s -} - -// URI returns the value of the "uri" field in the mutation. -func (m *ServerMetadataMutation) URI() (r string, exists bool) { - v := m.uri - if v == nil { - return - } - return *v, true -} - -// OldURI returns the old "uri" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldURI(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldURI is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldURI requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldURI: %w", err) - } - return oldValue.URI, nil -} - -// ResetURI resets all changes to the "uri" field. -func (m *ServerMetadataMutation) ResetURI() { - m.uri = nil -} - -// SetExtensions sets the "extensions" field. -func (m *ServerMetadataMutation) SetExtensions(l lysand.Extensions) { - m.extensions = &l -} - -// Extensions returns the value of the "extensions" field in the mutation. -func (m *ServerMetadataMutation) Extensions() (r lysand.Extensions, exists bool) { - v := m.extensions - if v == nil { - return - } - return *v, true -} - -// OldExtensions returns the old "extensions" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldExtensions(ctx context.Context) (v lysand.Extensions, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldExtensions is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldExtensions requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldExtensions: %w", err) - } - return oldValue.Extensions, nil -} - -// ResetExtensions resets all changes to the "extensions" field. -func (m *ServerMetadataMutation) ResetExtensions() { - m.extensions = nil -} - -// SetCreatedAt sets the "created_at" field. -func (m *ServerMetadataMutation) SetCreatedAt(t time.Time) { - m.created_at = &t -} - -// CreatedAt returns the value of the "created_at" field in the mutation. -func (m *ServerMetadataMutation) CreatedAt() (r time.Time, exists bool) { - v := m.created_at - if v == nil { - return - } - return *v, true -} - -// OldCreatedAt returns the old "created_at" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldCreatedAt(ctx context.Context) (v time.Time, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldCreatedAt is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldCreatedAt requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldCreatedAt: %w", err) - } - return oldValue.CreatedAt, nil -} - -// ResetCreatedAt resets all changes to the "created_at" field. -func (m *ServerMetadataMutation) ResetCreatedAt() { - m.created_at = nil -} - -// SetUpdatedAt sets the "updated_at" field. -func (m *ServerMetadataMutation) SetUpdatedAt(t time.Time) { - m.updated_at = &t -} - -// UpdatedAt returns the value of the "updated_at" field in the mutation. -func (m *ServerMetadataMutation) UpdatedAt() (r time.Time, exists bool) { - v := m.updated_at - if v == nil { - return - } - return *v, true -} - -// OldUpdatedAt returns the old "updated_at" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldUpdatedAt(ctx context.Context) (v time.Time, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldUpdatedAt is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldUpdatedAt requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldUpdatedAt: %w", err) - } - return oldValue.UpdatedAt, nil -} - -// ResetUpdatedAt resets all changes to the "updated_at" field. -func (m *ServerMetadataMutation) ResetUpdatedAt() { - m.updated_at = nil -} - -// SetName sets the "name" field. -func (m *ServerMetadataMutation) SetName(s string) { - m.name = &s -} - -// Name returns the value of the "name" field in the mutation. -func (m *ServerMetadataMutation) Name() (r string, exists bool) { - v := m.name - if v == nil { - return - } - return *v, true -} - -// OldName returns the old "name" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldName(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldName is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldName requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldName: %w", err) - } - return oldValue.Name, nil -} - -// ResetName resets all changes to the "name" field. -func (m *ServerMetadataMutation) ResetName() { - m.name = nil -} - -// SetDescription sets the "description" field. -func (m *ServerMetadataMutation) SetDescription(s string) { - m.description = &s -} - -// Description returns the value of the "description" field in the mutation. -func (m *ServerMetadataMutation) Description() (r string, exists bool) { - v := m.description - if v == nil { - return - } - return *v, true -} - -// OldDescription returns the old "description" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldDescription(ctx context.Context) (v *string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldDescription is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldDescription requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldDescription: %w", err) - } - return oldValue.Description, nil -} - -// ClearDescription clears the value of the "description" field. -func (m *ServerMetadataMutation) ClearDescription() { - m.description = nil - m.clearedFields[servermetadata.FieldDescription] = struct{}{} -} - -// DescriptionCleared returns if the "description" field was cleared in this mutation. -func (m *ServerMetadataMutation) DescriptionCleared() bool { - _, ok := m.clearedFields[servermetadata.FieldDescription] - return ok -} - -// ResetDescription resets all changes to the "description" field. -func (m *ServerMetadataMutation) ResetDescription() { - m.description = nil - delete(m.clearedFields, servermetadata.FieldDescription) -} - -// SetVersion sets the "version" field. -func (m *ServerMetadataMutation) SetVersion(s string) { - m.version = &s -} - -// Version returns the value of the "version" field in the mutation. -func (m *ServerMetadataMutation) Version() (r string, exists bool) { - v := m.version - if v == nil { - return - } - return *v, true -} - -// OldVersion returns the old "version" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldVersion(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldVersion is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldVersion requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldVersion: %w", err) - } - return oldValue.Version, nil -} - -// ResetVersion resets all changes to the "version" field. -func (m *ServerMetadataMutation) ResetVersion() { - m.version = nil -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (m *ServerMetadataMutation) SetSupportedExtensions(s []string) { - m.supportedExtensions = &s - m.appendsupportedExtensions = nil -} - -// SupportedExtensions returns the value of the "supportedExtensions" field in the mutation. -func (m *ServerMetadataMutation) SupportedExtensions() (r []string, exists bool) { - v := m.supportedExtensions - if v == nil { - return - } - return *v, true -} - -// OldSupportedExtensions returns the old "supportedExtensions" field's value of the ServerMetadata entity. -// If the ServerMetadata object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ServerMetadataMutation) OldSupportedExtensions(ctx context.Context) (v []string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldSupportedExtensions is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldSupportedExtensions requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldSupportedExtensions: %w", err) - } - return oldValue.SupportedExtensions, nil -} - -// AppendSupportedExtensions adds s to the "supportedExtensions" field. -func (m *ServerMetadataMutation) AppendSupportedExtensions(s []string) { - m.appendsupportedExtensions = append(m.appendsupportedExtensions, s...) -} - -// AppendedSupportedExtensions returns the list of values that were appended to the "supportedExtensions" field in this mutation. -func (m *ServerMetadataMutation) AppendedSupportedExtensions() ([]string, bool) { - if len(m.appendsupportedExtensions) == 0 { - return nil, false - } - return m.appendsupportedExtensions, true -} - -// ResetSupportedExtensions resets all changes to the "supportedExtensions" field. -func (m *ServerMetadataMutation) ResetSupportedExtensions() { - m.supportedExtensions = nil - m.appendsupportedExtensions = nil -} - -// SetFollowerID sets the "follower" edge to the User entity by id. -func (m *ServerMetadataMutation) SetFollowerID(id uuid.UUID) { - m.follower = &id -} - -// ClearFollower clears the "follower" edge to the User entity. -func (m *ServerMetadataMutation) ClearFollower() { - m.clearedfollower = true -} - -// FollowerCleared reports if the "follower" edge to the User entity was cleared. -func (m *ServerMetadataMutation) FollowerCleared() bool { - return m.clearedfollower -} - -// FollowerID returns the "follower" edge ID in the mutation. -func (m *ServerMetadataMutation) FollowerID() (id uuid.UUID, exists bool) { - if m.follower != nil { - return *m.follower, true - } - return -} - -// FollowerIDs returns the "follower" edge IDs in the mutation. -// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use -// FollowerID instead. It exists only for internal usage by the builders. -func (m *ServerMetadataMutation) FollowerIDs() (ids []uuid.UUID) { - if id := m.follower; id != nil { - ids = append(ids, *id) - } - return -} - -// ResetFollower resets all changes to the "follower" edge. -func (m *ServerMetadataMutation) ResetFollower() { - m.follower = nil - m.clearedfollower = false -} - -// SetFolloweeID sets the "followee" edge to the User entity by id. -func (m *ServerMetadataMutation) SetFolloweeID(id uuid.UUID) { - m.followee = &id -} - -// ClearFollowee clears the "followee" edge to the User entity. -func (m *ServerMetadataMutation) ClearFollowee() { - m.clearedfollowee = true -} - -// FolloweeCleared reports if the "followee" edge to the User entity was cleared. -func (m *ServerMetadataMutation) FolloweeCleared() bool { - return m.clearedfollowee -} - -// FolloweeID returns the "followee" edge ID in the mutation. -func (m *ServerMetadataMutation) FolloweeID() (id uuid.UUID, exists bool) { - if m.followee != nil { - return *m.followee, true - } - return -} - -// FolloweeIDs returns the "followee" edge IDs in the mutation. -// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use -// FolloweeID instead. It exists only for internal usage by the builders. -func (m *ServerMetadataMutation) FolloweeIDs() (ids []uuid.UUID) { - if id := m.followee; id != nil { - ids = append(ids, *id) - } - return -} - -// ResetFollowee resets all changes to the "followee" edge. -func (m *ServerMetadataMutation) ResetFollowee() { - m.followee = nil - m.clearedfollowee = false -} - -// Where appends a list predicates to the ServerMetadataMutation builder. -func (m *ServerMetadataMutation) Where(ps ...predicate.ServerMetadata) { - m.predicates = append(m.predicates, ps...) -} - -// WhereP appends storage-level predicates to the ServerMetadataMutation builder. Using this method, -// users can use type-assertion to append predicates that do not depend on any generated package. -func (m *ServerMetadataMutation) WhereP(ps ...func(*sql.Selector)) { - p := make([]predicate.ServerMetadata, len(ps)) - for i := range ps { - p[i] = ps[i] - } - m.Where(p...) -} - -// Op returns the operation name. -func (m *ServerMetadataMutation) Op() Op { - return m.op -} - -// SetOp allows setting the mutation operation. -func (m *ServerMetadataMutation) SetOp(op Op) { - m.op = op -} - -// Type returns the node type of this mutation (ServerMetadata). -func (m *ServerMetadataMutation) Type() string { - return m.typ -} - -// Fields returns all fields that were changed during this mutation. Note that in -// order to get all numeric fields that were incremented/decremented, call -// AddedFields(). -func (m *ServerMetadataMutation) Fields() []string { - fields := make([]string, 0, 9) - if m.isRemote != nil { - fields = append(fields, servermetadata.FieldIsRemote) - } - if m.uri != nil { - fields = append(fields, servermetadata.FieldURI) - } - if m.extensions != nil { - fields = append(fields, servermetadata.FieldExtensions) - } - if m.created_at != nil { - fields = append(fields, servermetadata.FieldCreatedAt) - } - if m.updated_at != nil { - fields = append(fields, servermetadata.FieldUpdatedAt) - } - if m.name != nil { - fields = append(fields, servermetadata.FieldName) - } - if m.description != nil { - fields = append(fields, servermetadata.FieldDescription) - } - if m.version != nil { - fields = append(fields, servermetadata.FieldVersion) - } - if m.supportedExtensions != nil { - fields = append(fields, servermetadata.FieldSupportedExtensions) - } - return fields -} - -// Field returns the value of a field with the given name. The second boolean -// return value indicates that this field was not set, or was not defined in the -// schema. -func (m *ServerMetadataMutation) Field(name string) (ent.Value, bool) { - switch name { - case servermetadata.FieldIsRemote: - return m.IsRemote() - case servermetadata.FieldURI: - return m.URI() - case servermetadata.FieldExtensions: - return m.Extensions() - case servermetadata.FieldCreatedAt: - return m.CreatedAt() - case servermetadata.FieldUpdatedAt: - return m.UpdatedAt() - case servermetadata.FieldName: - return m.Name() - case servermetadata.FieldDescription: - return m.Description() - case servermetadata.FieldVersion: - return m.Version() - case servermetadata.FieldSupportedExtensions: - return m.SupportedExtensions() - } - return nil, false -} - -// OldField returns the old value of the field from the database. An error is -// returned if the mutation operation is not UpdateOne, or the query to the -// database failed. -func (m *ServerMetadataMutation) OldField(ctx context.Context, name string) (ent.Value, error) { - switch name { - case servermetadata.FieldIsRemote: - return m.OldIsRemote(ctx) - case servermetadata.FieldURI: - return m.OldURI(ctx) - case servermetadata.FieldExtensions: - return m.OldExtensions(ctx) - case servermetadata.FieldCreatedAt: - return m.OldCreatedAt(ctx) - case servermetadata.FieldUpdatedAt: - return m.OldUpdatedAt(ctx) - case servermetadata.FieldName: - return m.OldName(ctx) - case servermetadata.FieldDescription: - return m.OldDescription(ctx) - case servermetadata.FieldVersion: - return m.OldVersion(ctx) - case servermetadata.FieldSupportedExtensions: - return m.OldSupportedExtensions(ctx) - } - return nil, fmt.Errorf("unknown ServerMetadata field %s", name) -} - -// SetField sets the value of a field with the given name. It returns an error if -// the field is not defined in the schema, or if the type mismatched the field -// type. -func (m *ServerMetadataMutation) SetField(name string, value ent.Value) error { - switch name { - case servermetadata.FieldIsRemote: - v, ok := value.(bool) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetIsRemote(v) - return nil - case servermetadata.FieldURI: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetURI(v) - return nil - case servermetadata.FieldExtensions: - v, ok := value.(lysand.Extensions) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetExtensions(v) - return nil - case servermetadata.FieldCreatedAt: - v, ok := value.(time.Time) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetCreatedAt(v) - return nil - case servermetadata.FieldUpdatedAt: - v, ok := value.(time.Time) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetUpdatedAt(v) - return nil - case servermetadata.FieldName: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetName(v) - return nil - case servermetadata.FieldDescription: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetDescription(v) - return nil - case servermetadata.FieldVersion: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetVersion(v) - return nil - case servermetadata.FieldSupportedExtensions: - v, ok := value.([]string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetSupportedExtensions(v) - return nil - } - return fmt.Errorf("unknown ServerMetadata field %s", name) -} - -// AddedFields returns all numeric fields that were incremented/decremented during -// this mutation. -func (m *ServerMetadataMutation) AddedFields() []string { - return nil -} - -// AddedField returns the numeric value that was incremented/decremented on a field -// with the given name. The second boolean return value indicates that this field -// was not set, or was not defined in the schema. -func (m *ServerMetadataMutation) AddedField(name string) (ent.Value, bool) { - return nil, false -} - -// AddField adds the value to the field with the given name. It returns an error if -// the field is not defined in the schema, or if the type mismatched the field -// type. -func (m *ServerMetadataMutation) AddField(name string, value ent.Value) error { - switch name { - } - return fmt.Errorf("unknown ServerMetadata numeric field %s", name) -} - -// ClearedFields returns all nullable fields that were cleared during this -// mutation. -func (m *ServerMetadataMutation) ClearedFields() []string { - var fields []string - if m.FieldCleared(servermetadata.FieldDescription) { - fields = append(fields, servermetadata.FieldDescription) - } - return fields -} - -// FieldCleared returns a boolean indicating if a field with the given name was -// cleared in this mutation. -func (m *ServerMetadataMutation) FieldCleared(name string) bool { - _, ok := m.clearedFields[name] - return ok -} - -// ClearField clears the value of the field with the given name. It returns an -// error if the field is not defined in the schema. -func (m *ServerMetadataMutation) ClearField(name string) error { - switch name { - case servermetadata.FieldDescription: - m.ClearDescription() - return nil - } - return fmt.Errorf("unknown ServerMetadata nullable field %s", name) -} - -// ResetField resets all changes in the mutation for the field with the given name. -// It returns an error if the field is not defined in the schema. -func (m *ServerMetadataMutation) ResetField(name string) error { - switch name { - case servermetadata.FieldIsRemote: - m.ResetIsRemote() - return nil - case servermetadata.FieldURI: - m.ResetURI() - return nil - case servermetadata.FieldExtensions: - m.ResetExtensions() - return nil - case servermetadata.FieldCreatedAt: - m.ResetCreatedAt() - return nil - case servermetadata.FieldUpdatedAt: - m.ResetUpdatedAt() - return nil - case servermetadata.FieldName: - m.ResetName() - return nil - case servermetadata.FieldDescription: - m.ResetDescription() - return nil - case servermetadata.FieldVersion: - m.ResetVersion() - return nil - case servermetadata.FieldSupportedExtensions: - m.ResetSupportedExtensions() - return nil - } - return fmt.Errorf("unknown ServerMetadata field %s", name) -} - -// AddedEdges returns all edge names that were set/added in this mutation. -func (m *ServerMetadataMutation) AddedEdges() []string { - edges := make([]string, 0, 2) - if m.follower != nil { - edges = append(edges, servermetadata.EdgeFollower) - } - if m.followee != nil { - edges = append(edges, servermetadata.EdgeFollowee) - } - return edges -} - -// AddedIDs returns all IDs (to other nodes) that were added for the given edge -// name in this mutation. -func (m *ServerMetadataMutation) AddedIDs(name string) []ent.Value { - switch name { - case servermetadata.EdgeFollower: - if id := m.follower; id != nil { - return []ent.Value{*id} - } - case servermetadata.EdgeFollowee: - if id := m.followee; id != nil { - return []ent.Value{*id} - } - } - return nil -} - -// RemovedEdges returns all edge names that were removed in this mutation. -func (m *ServerMetadataMutation) RemovedEdges() []string { - edges := make([]string, 0, 2) - return edges -} - -// RemovedIDs returns all IDs (to other nodes) that were removed for the edge with -// the given name in this mutation. -func (m *ServerMetadataMutation) RemovedIDs(name string) []ent.Value { - return nil -} - -// ClearedEdges returns all edge names that were cleared in this mutation. -func (m *ServerMetadataMutation) ClearedEdges() []string { - edges := make([]string, 0, 2) - if m.clearedfollower { - edges = append(edges, servermetadata.EdgeFollower) - } - if m.clearedfollowee { - edges = append(edges, servermetadata.EdgeFollowee) - } - return edges -} - -// EdgeCleared returns a boolean which indicates if the edge with the given name -// was cleared in this mutation. -func (m *ServerMetadataMutation) EdgeCleared(name string) bool { - switch name { - case servermetadata.EdgeFollower: - return m.clearedfollower - case servermetadata.EdgeFollowee: - return m.clearedfollowee - } - return false -} - -// ClearEdge clears the value of the edge with the given name. It returns an error -// if that edge is not defined in the schema. -func (m *ServerMetadataMutation) ClearEdge(name string) error { - switch name { - case servermetadata.EdgeFollower: - m.ClearFollower() - return nil - case servermetadata.EdgeFollowee: - m.ClearFollowee() - return nil - } - return fmt.Errorf("unknown ServerMetadata unique edge %s", name) -} - -// ResetEdge resets all changes to the edge with the given name in this mutation. -// It returns an error if the edge is not defined in the schema. -func (m *ServerMetadataMutation) ResetEdge(name string) error { - switch name { - case servermetadata.EdgeFollower: - m.ResetFollower() - return nil - case servermetadata.EdgeFollowee: - m.ResetFollowee() - return nil - } - return fmt.Errorf("unknown ServerMetadata edge %s", name) -} - // UserMutation represents an operation that mutates the User nodes in the graph. type UserMutation struct { config - op Op - typ string - id *uuid.UUID - isRemote *bool - uri *string - extensions *lysand.Extensions - created_at *time.Time - updated_at *time.Time - username *string - passwordHash *[]byte - displayName *string - biography *string - publicKey *ed25519.PublicKey - privateKey *ed25519.PrivateKey - indexable *bool - privacyLevel *user.PrivacyLevel - fields *[]lysand.Field - appendfields []lysand.Field - inbox *string - featured *string - followers *string - following *string - outbox *string - clearedFields map[string]struct{} - avatarImage *int - clearedavatarImage bool - headerImage *int - clearedheaderImage bool - authoredNotes map[uuid.UUID]struct{} - removedauthoredNotes map[uuid.UUID]struct{} - clearedauthoredNotes bool - mentionedNotes map[uuid.UUID]struct{} - removedmentionedNotes map[uuid.UUID]struct{} - clearedmentionedNotes bool - done bool - oldValue func(context.Context) (*User, error) - predicates []predicate.User + op Op + typ string + id *uuid.UUID + isRemote *bool + uri *string + extensions *lysand.Extensions + created_at *time.Time + updated_at *time.Time + username *string + passwordHash *[]byte + displayName *string + biography *string + publicKey *[]byte + publicKeyActor *string + publicKeyAlgorithm *string + privateKey *[]byte + indexable *bool + privacyLevel *user.PrivacyLevel + fields *[]lysand.Field + appendfields []lysand.Field + inbox *string + featured *string + followers *string + following *string + outbox *string + clearedFields map[string]struct{} + avatarImage *int + clearedavatarImage bool + headerImage *int + clearedheaderImage bool + authoredNotes map[uuid.UUID]struct{} + removedauthoredNotes map[uuid.UUID]struct{} + clearedauthoredNotes bool + mentionedNotes map[uuid.UUID]struct{} + removedmentionedNotes map[uuid.UUID]struct{} + clearedmentionedNotes bool + servers map[uuid.UUID]struct{} + removedservers map[uuid.UUID]struct{} + clearedservers bool + moderatedServers map[uuid.UUID]struct{} + removedmoderatedServers map[uuid.UUID]struct{} + clearedmoderatedServers bool + administeredServers map[uuid.UUID]struct{} + removedadministeredServers map[uuid.UUID]struct{} + clearedadministeredServers bool + done bool + oldValue func(context.Context) (*User, error) + predicates []predicate.User } var _ ent.Mutation = (*UserMutation)(nil) @@ -4871,12 +5865,12 @@ func (m *UserMutation) ResetBiography() { } // SetPublicKey sets the "publicKey" field. -func (m *UserMutation) SetPublicKey(ek ed25519.PublicKey) { - m.publicKey = &ek +func (m *UserMutation) SetPublicKey(b []byte) { + m.publicKey = &b } // PublicKey returns the value of the "publicKey" field in the mutation. -func (m *UserMutation) PublicKey() (r ed25519.PublicKey, exists bool) { +func (m *UserMutation) PublicKey() (r []byte, exists bool) { v := m.publicKey if v == nil { return @@ -4887,7 +5881,7 @@ func (m *UserMutation) PublicKey() (r ed25519.PublicKey, exists bool) { // OldPublicKey returns the old "publicKey" field's value of the User entity. // If the User object wasn't provided to the builder, the object is fetched from the database. // An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *UserMutation) OldPublicKey(ctx context.Context) (v ed25519.PublicKey, err error) { +func (m *UserMutation) OldPublicKey(ctx context.Context) (v []byte, err error) { if !m.op.Is(OpUpdateOne) { return v, errors.New("OldPublicKey is only allowed on UpdateOne operations") } @@ -4906,13 +5900,85 @@ func (m *UserMutation) ResetPublicKey() { m.publicKey = nil } +// SetPublicKeyActor sets the "publicKeyActor" field. +func (m *UserMutation) SetPublicKeyActor(s string) { + m.publicKeyActor = &s +} + +// PublicKeyActor returns the value of the "publicKeyActor" field in the mutation. +func (m *UserMutation) PublicKeyActor() (r string, exists bool) { + v := m.publicKeyActor + if v == nil { + return + } + return *v, true +} + +// OldPublicKeyActor returns the old "publicKeyActor" field's value of the User entity. +// If the User object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UserMutation) OldPublicKeyActor(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldPublicKeyActor is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldPublicKeyActor requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldPublicKeyActor: %w", err) + } + return oldValue.PublicKeyActor, nil +} + +// ResetPublicKeyActor resets all changes to the "publicKeyActor" field. +func (m *UserMutation) ResetPublicKeyActor() { + m.publicKeyActor = nil +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (m *UserMutation) SetPublicKeyAlgorithm(s string) { + m.publicKeyAlgorithm = &s +} + +// PublicKeyAlgorithm returns the value of the "publicKeyAlgorithm" field in the mutation. +func (m *UserMutation) PublicKeyAlgorithm() (r string, exists bool) { + v := m.publicKeyAlgorithm + if v == nil { + return + } + return *v, true +} + +// OldPublicKeyAlgorithm returns the old "publicKeyAlgorithm" field's value of the User entity. +// If the User object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *UserMutation) OldPublicKeyAlgorithm(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldPublicKeyAlgorithm is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldPublicKeyAlgorithm requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldPublicKeyAlgorithm: %w", err) + } + return oldValue.PublicKeyAlgorithm, nil +} + +// ResetPublicKeyAlgorithm resets all changes to the "publicKeyAlgorithm" field. +func (m *UserMutation) ResetPublicKeyAlgorithm() { + m.publicKeyAlgorithm = nil +} + // SetPrivateKey sets the "privateKey" field. -func (m *UserMutation) SetPrivateKey(ek ed25519.PrivateKey) { - m.privateKey = &ek +func (m *UserMutation) SetPrivateKey(b []byte) { + m.privateKey = &b } // PrivateKey returns the value of the "privateKey" field in the mutation. -func (m *UserMutation) PrivateKey() (r ed25519.PrivateKey, exists bool) { +func (m *UserMutation) PrivateKey() (r []byte, exists bool) { v := m.privateKey if v == nil { return @@ -4923,7 +5989,7 @@ func (m *UserMutation) PrivateKey() (r ed25519.PrivateKey, exists bool) { // OldPrivateKey returns the old "privateKey" field's value of the User entity. // If the User object wasn't provided to the builder, the object is fetched from the database. // An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *UserMutation) OldPrivateKey(ctx context.Context) (v ed25519.PrivateKey, err error) { +func (m *UserMutation) OldPrivateKey(ctx context.Context) (v []byte, err error) { if !m.op.Is(OpUpdateOne) { return v, errors.New("OldPrivateKey is only allowed on UpdateOne operations") } @@ -5444,6 +6510,168 @@ func (m *UserMutation) ResetMentionedNotes() { m.removedmentionedNotes = nil } +// AddServerIDs adds the "servers" edge to the InstanceMetadata entity by ids. +func (m *UserMutation) AddServerIDs(ids ...uuid.UUID) { + if m.servers == nil { + m.servers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.servers[ids[i]] = struct{}{} + } +} + +// ClearServers clears the "servers" edge to the InstanceMetadata entity. +func (m *UserMutation) ClearServers() { + m.clearedservers = true +} + +// ServersCleared reports if the "servers" edge to the InstanceMetadata entity was cleared. +func (m *UserMutation) ServersCleared() bool { + return m.clearedservers +} + +// RemoveServerIDs removes the "servers" edge to the InstanceMetadata entity by IDs. +func (m *UserMutation) RemoveServerIDs(ids ...uuid.UUID) { + if m.removedservers == nil { + m.removedservers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.servers, ids[i]) + m.removedservers[ids[i]] = struct{}{} + } +} + +// RemovedServers returns the removed IDs of the "servers" edge to the InstanceMetadata entity. +func (m *UserMutation) RemovedServersIDs() (ids []uuid.UUID) { + for id := range m.removedservers { + ids = append(ids, id) + } + return +} + +// ServersIDs returns the "servers" edge IDs in the mutation. +func (m *UserMutation) ServersIDs() (ids []uuid.UUID) { + for id := range m.servers { + ids = append(ids, id) + } + return +} + +// ResetServers resets all changes to the "servers" edge. +func (m *UserMutation) ResetServers() { + m.servers = nil + m.clearedservers = false + m.removedservers = nil +} + +// AddModeratedServerIDs adds the "moderatedServers" edge to the InstanceMetadata entity by ids. +func (m *UserMutation) AddModeratedServerIDs(ids ...uuid.UUID) { + if m.moderatedServers == nil { + m.moderatedServers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.moderatedServers[ids[i]] = struct{}{} + } +} + +// ClearModeratedServers clears the "moderatedServers" edge to the InstanceMetadata entity. +func (m *UserMutation) ClearModeratedServers() { + m.clearedmoderatedServers = true +} + +// ModeratedServersCleared reports if the "moderatedServers" edge to the InstanceMetadata entity was cleared. +func (m *UserMutation) ModeratedServersCleared() bool { + return m.clearedmoderatedServers +} + +// RemoveModeratedServerIDs removes the "moderatedServers" edge to the InstanceMetadata entity by IDs. +func (m *UserMutation) RemoveModeratedServerIDs(ids ...uuid.UUID) { + if m.removedmoderatedServers == nil { + m.removedmoderatedServers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.moderatedServers, ids[i]) + m.removedmoderatedServers[ids[i]] = struct{}{} + } +} + +// RemovedModeratedServers returns the removed IDs of the "moderatedServers" edge to the InstanceMetadata entity. +func (m *UserMutation) RemovedModeratedServersIDs() (ids []uuid.UUID) { + for id := range m.removedmoderatedServers { + ids = append(ids, id) + } + return +} + +// ModeratedServersIDs returns the "moderatedServers" edge IDs in the mutation. +func (m *UserMutation) ModeratedServersIDs() (ids []uuid.UUID) { + for id := range m.moderatedServers { + ids = append(ids, id) + } + return +} + +// ResetModeratedServers resets all changes to the "moderatedServers" edge. +func (m *UserMutation) ResetModeratedServers() { + m.moderatedServers = nil + m.clearedmoderatedServers = false + m.removedmoderatedServers = nil +} + +// AddAdministeredServerIDs adds the "administeredServers" edge to the InstanceMetadata entity by ids. +func (m *UserMutation) AddAdministeredServerIDs(ids ...uuid.UUID) { + if m.administeredServers == nil { + m.administeredServers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + m.administeredServers[ids[i]] = struct{}{} + } +} + +// ClearAdministeredServers clears the "administeredServers" edge to the InstanceMetadata entity. +func (m *UserMutation) ClearAdministeredServers() { + m.clearedadministeredServers = true +} + +// AdministeredServersCleared reports if the "administeredServers" edge to the InstanceMetadata entity was cleared. +func (m *UserMutation) AdministeredServersCleared() bool { + return m.clearedadministeredServers +} + +// RemoveAdministeredServerIDs removes the "administeredServers" edge to the InstanceMetadata entity by IDs. +func (m *UserMutation) RemoveAdministeredServerIDs(ids ...uuid.UUID) { + if m.removedadministeredServers == nil { + m.removedadministeredServers = make(map[uuid.UUID]struct{}) + } + for i := range ids { + delete(m.administeredServers, ids[i]) + m.removedadministeredServers[ids[i]] = struct{}{} + } +} + +// RemovedAdministeredServers returns the removed IDs of the "administeredServers" edge to the InstanceMetadata entity. +func (m *UserMutation) RemovedAdministeredServersIDs() (ids []uuid.UUID) { + for id := range m.removedadministeredServers { + ids = append(ids, id) + } + return +} + +// AdministeredServersIDs returns the "administeredServers" edge IDs in the mutation. +func (m *UserMutation) AdministeredServersIDs() (ids []uuid.UUID) { + for id := range m.administeredServers { + ids = append(ids, id) + } + return +} + +// ResetAdministeredServers resets all changes to the "administeredServers" edge. +func (m *UserMutation) ResetAdministeredServers() { + m.administeredServers = nil + m.clearedadministeredServers = false + m.removedadministeredServers = nil +} + // Where appends a list predicates to the UserMutation builder. func (m *UserMutation) Where(ps ...predicate.User) { m.predicates = append(m.predicates, ps...) @@ -5478,7 +6706,7 @@ func (m *UserMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *UserMutation) Fields() []string { - fields := make([]string, 0, 19) + fields := make([]string, 0, 21) if m.isRemote != nil { fields = append(fields, user.FieldIsRemote) } @@ -5509,6 +6737,12 @@ func (m *UserMutation) Fields() []string { if m.publicKey != nil { fields = append(fields, user.FieldPublicKey) } + if m.publicKeyActor != nil { + fields = append(fields, user.FieldPublicKeyActor) + } + if m.publicKeyAlgorithm != nil { + fields = append(fields, user.FieldPublicKeyAlgorithm) + } if m.privateKey != nil { fields = append(fields, user.FieldPrivateKey) } @@ -5564,6 +6798,10 @@ func (m *UserMutation) Field(name string) (ent.Value, bool) { return m.Biography() case user.FieldPublicKey: return m.PublicKey() + case user.FieldPublicKeyActor: + return m.PublicKeyActor() + case user.FieldPublicKeyAlgorithm: + return m.PublicKeyAlgorithm() case user.FieldPrivateKey: return m.PrivateKey() case user.FieldIndexable: @@ -5611,6 +6849,10 @@ func (m *UserMutation) OldField(ctx context.Context, name string) (ent.Value, er return m.OldBiography(ctx) case user.FieldPublicKey: return m.OldPublicKey(ctx) + case user.FieldPublicKeyActor: + return m.OldPublicKeyActor(ctx) + case user.FieldPublicKeyAlgorithm: + return m.OldPublicKeyAlgorithm(ctx) case user.FieldPrivateKey: return m.OldPrivateKey(ctx) case user.FieldIndexable: @@ -5702,14 +6944,28 @@ func (m *UserMutation) SetField(name string, value ent.Value) error { m.SetBiography(v) return nil case user.FieldPublicKey: - v, ok := value.(ed25519.PublicKey) + v, ok := value.([]byte) if !ok { return fmt.Errorf("unexpected type %T for field %s", value, name) } m.SetPublicKey(v) return nil + case user.FieldPublicKeyActor: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetPublicKeyActor(v) + return nil + case user.FieldPublicKeyAlgorithm: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetPublicKeyAlgorithm(v) + return nil case user.FieldPrivateKey: - v, ok := value.(ed25519.PrivateKey) + v, ok := value.([]byte) if !ok { return fmt.Errorf("unexpected type %T for field %s", value, name) } @@ -5877,6 +7133,12 @@ func (m *UserMutation) ResetField(name string) error { case user.FieldPublicKey: m.ResetPublicKey() return nil + case user.FieldPublicKeyActor: + m.ResetPublicKeyActor() + return nil + case user.FieldPublicKeyAlgorithm: + m.ResetPublicKeyAlgorithm() + return nil case user.FieldPrivateKey: m.ResetPrivateKey() return nil @@ -5910,7 +7172,7 @@ func (m *UserMutation) ResetField(name string) error { // AddedEdges returns all edge names that were set/added in this mutation. func (m *UserMutation) AddedEdges() []string { - edges := make([]string, 0, 4) + edges := make([]string, 0, 7) if m.avatarImage != nil { edges = append(edges, user.EdgeAvatarImage) } @@ -5923,6 +7185,15 @@ func (m *UserMutation) AddedEdges() []string { if m.mentionedNotes != nil { edges = append(edges, user.EdgeMentionedNotes) } + if m.servers != nil { + edges = append(edges, user.EdgeServers) + } + if m.moderatedServers != nil { + edges = append(edges, user.EdgeModeratedServers) + } + if m.administeredServers != nil { + edges = append(edges, user.EdgeAdministeredServers) + } return edges } @@ -5950,19 +7221,46 @@ func (m *UserMutation) AddedIDs(name string) []ent.Value { ids = append(ids, id) } return ids + case user.EdgeServers: + ids := make([]ent.Value, 0, len(m.servers)) + for id := range m.servers { + ids = append(ids, id) + } + return ids + case user.EdgeModeratedServers: + ids := make([]ent.Value, 0, len(m.moderatedServers)) + for id := range m.moderatedServers { + ids = append(ids, id) + } + return ids + case user.EdgeAdministeredServers: + ids := make([]ent.Value, 0, len(m.administeredServers)) + for id := range m.administeredServers { + ids = append(ids, id) + } + return ids } return nil } // RemovedEdges returns all edge names that were removed in this mutation. func (m *UserMutation) RemovedEdges() []string { - edges := make([]string, 0, 4) + edges := make([]string, 0, 7) if m.removedauthoredNotes != nil { edges = append(edges, user.EdgeAuthoredNotes) } if m.removedmentionedNotes != nil { edges = append(edges, user.EdgeMentionedNotes) } + if m.removedservers != nil { + edges = append(edges, user.EdgeServers) + } + if m.removedmoderatedServers != nil { + edges = append(edges, user.EdgeModeratedServers) + } + if m.removedadministeredServers != nil { + edges = append(edges, user.EdgeAdministeredServers) + } return edges } @@ -5982,13 +7280,31 @@ func (m *UserMutation) RemovedIDs(name string) []ent.Value { ids = append(ids, id) } return ids + case user.EdgeServers: + ids := make([]ent.Value, 0, len(m.removedservers)) + for id := range m.removedservers { + ids = append(ids, id) + } + return ids + case user.EdgeModeratedServers: + ids := make([]ent.Value, 0, len(m.removedmoderatedServers)) + for id := range m.removedmoderatedServers { + ids = append(ids, id) + } + return ids + case user.EdgeAdministeredServers: + ids := make([]ent.Value, 0, len(m.removedadministeredServers)) + for id := range m.removedadministeredServers { + ids = append(ids, id) + } + return ids } return nil } // ClearedEdges returns all edge names that were cleared in this mutation. func (m *UserMutation) ClearedEdges() []string { - edges := make([]string, 0, 4) + edges := make([]string, 0, 7) if m.clearedavatarImage { edges = append(edges, user.EdgeAvatarImage) } @@ -6001,6 +7317,15 @@ func (m *UserMutation) ClearedEdges() []string { if m.clearedmentionedNotes { edges = append(edges, user.EdgeMentionedNotes) } + if m.clearedservers { + edges = append(edges, user.EdgeServers) + } + if m.clearedmoderatedServers { + edges = append(edges, user.EdgeModeratedServers) + } + if m.clearedadministeredServers { + edges = append(edges, user.EdgeAdministeredServers) + } return edges } @@ -6016,6 +7341,12 @@ func (m *UserMutation) EdgeCleared(name string) bool { return m.clearedauthoredNotes case user.EdgeMentionedNotes: return m.clearedmentionedNotes + case user.EdgeServers: + return m.clearedservers + case user.EdgeModeratedServers: + return m.clearedmoderatedServers + case user.EdgeAdministeredServers: + return m.clearedadministeredServers } return false } @@ -6050,6 +7381,15 @@ func (m *UserMutation) ResetEdge(name string) error { case user.EdgeMentionedNotes: m.ResetMentionedNotes() return nil + case user.EdgeServers: + m.ResetServers() + return nil + case user.EdgeModeratedServers: + m.ResetModeratedServers() + return nil + case user.EdgeAdministeredServers: + m.ResetAdministeredServers() + return nil } return fmt.Errorf("unknown User edge %s", name) } diff --git a/ent/predicate/predicate.go b/ent/predicate/predicate.go index 76a32b2..e7b83b4 100644 --- a/ent/predicate/predicate.go +++ b/ent/predicate/predicate.go @@ -15,11 +15,11 @@ type Follow func(*sql.Selector) // Image is the predicate function for image builders. type Image func(*sql.Selector) +// InstanceMetadata is the predicate function for instancemetadata builders. +type InstanceMetadata func(*sql.Selector) + // Note is the predicate function for note builders. type Note func(*sql.Selector) -// ServerMetadata is the predicate function for servermetadata builders. -type ServerMetadata func(*sql.Selector) - // User is the predicate function for user builders. type User func(*sql.Selector) diff --git a/ent/runtime.go b/ent/runtime.go index f2ce2c8..d61762e 100644 --- a/ent/runtime.go +++ b/ent/runtime.go @@ -8,9 +8,10 @@ import ( "github.com/google/uuid" "github.com/lysand-org/versia-go/ent/attachment" "github.com/lysand-org/versia-go/ent/follow" + "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" "github.com/lysand-org/versia-go/ent/schema" - "github.com/lysand-org/versia-go/ent/servermetadata" "github.com/lysand-org/versia-go/ent/user" "github.com/lysand-org/versia-go/pkg/lysand" ) @@ -77,6 +78,91 @@ func init() { followDescID := followMixinFields0[0].Descriptor() // follow.DefaultID holds the default value on creation for the id field. follow.DefaultID = followDescID.Default.(func() uuid.UUID) + imageFields := schema.Image{}.Fields() + _ = imageFields + // imageDescURL is the schema descriptor for url field. + imageDescURL := imageFields[0].Descriptor() + // image.URLValidator is a validator for the "url" field. It is called by the builders before save. + image.URLValidator = imageDescURL.Validators[0].(func(string) error) + instancemetadataMixin := schema.InstanceMetadata{}.Mixin() + instancemetadataMixinFields0 := instancemetadataMixin[0].Fields() + _ = instancemetadataMixinFields0 + instancemetadataFields := schema.InstanceMetadata{}.Fields() + _ = instancemetadataFields + // instancemetadataDescURI is the schema descriptor for uri field. + instancemetadataDescURI := instancemetadataMixinFields0[2].Descriptor() + // instancemetadata.URIValidator is a validator for the "uri" field. It is called by the builders before save. + instancemetadata.URIValidator = instancemetadataDescURI.Validators[0].(func(string) error) + // instancemetadataDescExtensions is the schema descriptor for extensions field. + instancemetadataDescExtensions := instancemetadataMixinFields0[3].Descriptor() + // instancemetadata.DefaultExtensions holds the default value on creation for the extensions field. + instancemetadata.DefaultExtensions = instancemetadataDescExtensions.Default.(lysand.Extensions) + // instancemetadataDescCreatedAt is the schema descriptor for created_at field. + instancemetadataDescCreatedAt := instancemetadataMixinFields0[4].Descriptor() + // instancemetadata.DefaultCreatedAt holds the default value on creation for the created_at field. + instancemetadata.DefaultCreatedAt = instancemetadataDescCreatedAt.Default.(func() time.Time) + // instancemetadataDescUpdatedAt is the schema descriptor for updated_at field. + instancemetadataDescUpdatedAt := instancemetadataMixinFields0[5].Descriptor() + // instancemetadata.DefaultUpdatedAt holds the default value on creation for the updated_at field. + instancemetadata.DefaultUpdatedAt = instancemetadataDescUpdatedAt.Default.(func() time.Time) + // instancemetadata.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field. + instancemetadata.UpdateDefaultUpdatedAt = instancemetadataDescUpdatedAt.UpdateDefault.(func() time.Time) + // instancemetadataDescName is the schema descriptor for name field. + instancemetadataDescName := instancemetadataFields[0].Descriptor() + // instancemetadata.NameValidator is a validator for the "name" field. It is called by the builders before save. + instancemetadata.NameValidator = instancemetadataDescName.Validators[0].(func(string) error) + // instancemetadataDescHost is the schema descriptor for host field. + instancemetadataDescHost := instancemetadataFields[2].Descriptor() + // instancemetadata.HostValidator is a validator for the "host" field. It is called by the builders before save. + instancemetadata.HostValidator = instancemetadataDescHost.Validators[0].(func(string) error) + // instancemetadataDescSoftwareName is the schema descriptor for softwareName field. + instancemetadataDescSoftwareName := instancemetadataFields[6].Descriptor() + // instancemetadata.SoftwareNameValidator is a validator for the "softwareName" field. It is called by the builders before save. + instancemetadata.SoftwareNameValidator = instancemetadataDescSoftwareName.Validators[0].(func(string) error) + // instancemetadataDescSoftwareVersion is the schema descriptor for softwareVersion field. + instancemetadataDescSoftwareVersion := instancemetadataFields[7].Descriptor() + // instancemetadata.SoftwareVersionValidator is a validator for the "softwareVersion" field. It is called by the builders before save. + instancemetadata.SoftwareVersionValidator = instancemetadataDescSoftwareVersion.Validators[0].(func(string) error) + // instancemetadataDescSharedInboxURI is the schema descriptor for sharedInboxURI field. + instancemetadataDescSharedInboxURI := instancemetadataFields[8].Descriptor() + // instancemetadata.SharedInboxURIValidator is a validator for the "sharedInboxURI" field. It is called by the builders before save. + instancemetadata.SharedInboxURIValidator = instancemetadataDescSharedInboxURI.Validators[0].(func(string) error) + // instancemetadataDescModeratorsURI is the schema descriptor for moderatorsURI field. + instancemetadataDescModeratorsURI := instancemetadataFields[9].Descriptor() + // instancemetadata.ModeratorsURIValidator is a validator for the "moderatorsURI" field. It is called by the builders before save. + instancemetadata.ModeratorsURIValidator = instancemetadataDescModeratorsURI.Validators[0].(func(string) error) + // instancemetadataDescAdminsURI is the schema descriptor for adminsURI field. + instancemetadataDescAdminsURI := instancemetadataFields[10].Descriptor() + // instancemetadata.AdminsURIValidator is a validator for the "adminsURI" field. It is called by the builders before save. + instancemetadata.AdminsURIValidator = instancemetadataDescAdminsURI.Validators[0].(func(string) error) + // instancemetadataDescLogoEndpoint is the schema descriptor for logoEndpoint field. + instancemetadataDescLogoEndpoint := instancemetadataFields[11].Descriptor() + // instancemetadata.LogoEndpointValidator is a validator for the "logoEndpoint" field. It is called by the builders before save. + instancemetadata.LogoEndpointValidator = instancemetadataDescLogoEndpoint.Validators[0].(func(string) error) + // instancemetadataDescLogoMimeType is the schema descriptor for logoMimeType field. + instancemetadataDescLogoMimeType := instancemetadataFields[12].Descriptor() + // instancemetadata.LogoMimeTypeValidator is a validator for the "logoMimeType" field. It is called by the builders before save. + instancemetadata.LogoMimeTypeValidator = instancemetadataDescLogoMimeType.Validators[0].(func(string) error) + // instancemetadataDescBannerEndpoint is the schema descriptor for bannerEndpoint field. + instancemetadataDescBannerEndpoint := instancemetadataFields[13].Descriptor() + // instancemetadata.BannerEndpointValidator is a validator for the "bannerEndpoint" field. It is called by the builders before save. + instancemetadata.BannerEndpointValidator = instancemetadataDescBannerEndpoint.Validators[0].(func(string) error) + // instancemetadataDescBannerMimeType is the schema descriptor for bannerMimeType field. + instancemetadataDescBannerMimeType := instancemetadataFields[14].Descriptor() + // instancemetadata.BannerMimeTypeValidator is a validator for the "bannerMimeType" field. It is called by the builders before save. + instancemetadata.BannerMimeTypeValidator = instancemetadataDescBannerMimeType.Validators[0].(func(string) error) + // instancemetadataDescSupportedVersions is the schema descriptor for supportedVersions field. + instancemetadataDescSupportedVersions := instancemetadataFields[15].Descriptor() + // instancemetadata.DefaultSupportedVersions holds the default value on creation for the supportedVersions field. + instancemetadata.DefaultSupportedVersions = instancemetadataDescSupportedVersions.Default.([]string) + // instancemetadataDescSupportedExtensions is the schema descriptor for supportedExtensions field. + instancemetadataDescSupportedExtensions := instancemetadataFields[16].Descriptor() + // instancemetadata.DefaultSupportedExtensions holds the default value on creation for the supportedExtensions field. + instancemetadata.DefaultSupportedExtensions = instancemetadataDescSupportedExtensions.Default.([]string) + // instancemetadataDescID is the schema descriptor for id field. + instancemetadataDescID := instancemetadataMixinFields0[0].Descriptor() + // instancemetadata.DefaultID holds the default value on creation for the id field. + instancemetadata.DefaultID = instancemetadataDescID.Default.(func() uuid.UUID) noteMixin := schema.Note{}.Mixin() noteMixinFields0 := noteMixin[0].Fields() _ = noteMixinFields0 @@ -112,45 +198,6 @@ func init() { noteDescID := noteMixinFields0[0].Descriptor() // note.DefaultID holds the default value on creation for the id field. note.DefaultID = noteDescID.Default.(func() uuid.UUID) - servermetadataMixin := schema.ServerMetadata{}.Mixin() - servermetadataMixinFields0 := servermetadataMixin[0].Fields() - _ = servermetadataMixinFields0 - servermetadataFields := schema.ServerMetadata{}.Fields() - _ = servermetadataFields - // servermetadataDescURI is the schema descriptor for uri field. - servermetadataDescURI := servermetadataMixinFields0[2].Descriptor() - // servermetadata.URIValidator is a validator for the "uri" field. It is called by the builders before save. - servermetadata.URIValidator = servermetadataDescURI.Validators[0].(func(string) error) - // servermetadataDescExtensions is the schema descriptor for extensions field. - servermetadataDescExtensions := servermetadataMixinFields0[3].Descriptor() - // servermetadata.DefaultExtensions holds the default value on creation for the extensions field. - servermetadata.DefaultExtensions = servermetadataDescExtensions.Default.(lysand.Extensions) - // servermetadataDescCreatedAt is the schema descriptor for created_at field. - servermetadataDescCreatedAt := servermetadataMixinFields0[4].Descriptor() - // servermetadata.DefaultCreatedAt holds the default value on creation for the created_at field. - servermetadata.DefaultCreatedAt = servermetadataDescCreatedAt.Default.(func() time.Time) - // servermetadataDescUpdatedAt is the schema descriptor for updated_at field. - servermetadataDescUpdatedAt := servermetadataMixinFields0[5].Descriptor() - // servermetadata.DefaultUpdatedAt holds the default value on creation for the updated_at field. - servermetadata.DefaultUpdatedAt = servermetadataDescUpdatedAt.Default.(func() time.Time) - // servermetadata.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field. - servermetadata.UpdateDefaultUpdatedAt = servermetadataDescUpdatedAt.UpdateDefault.(func() time.Time) - // servermetadataDescName is the schema descriptor for name field. - servermetadataDescName := servermetadataFields[0].Descriptor() - // servermetadata.NameValidator is a validator for the "name" field. It is called by the builders before save. - servermetadata.NameValidator = servermetadataDescName.Validators[0].(func(string) error) - // servermetadataDescVersion is the schema descriptor for version field. - servermetadataDescVersion := servermetadataFields[2].Descriptor() - // servermetadata.VersionValidator is a validator for the "version" field. It is called by the builders before save. - servermetadata.VersionValidator = servermetadataDescVersion.Validators[0].(func(string) error) - // servermetadataDescSupportedExtensions is the schema descriptor for supportedExtensions field. - servermetadataDescSupportedExtensions := servermetadataFields[3].Descriptor() - // servermetadata.DefaultSupportedExtensions holds the default value on creation for the supportedExtensions field. - servermetadata.DefaultSupportedExtensions = servermetadataDescSupportedExtensions.Default.([]string) - // servermetadataDescID is the schema descriptor for id field. - servermetadataDescID := servermetadataMixinFields0[0].Descriptor() - // servermetadata.DefaultID holds the default value on creation for the id field. - servermetadata.DefaultID = servermetadataDescID.Default.(func() uuid.UUID) userMixin := schema.User{}.Mixin() userMixinFields0 := userMixin[0].Fields() _ = userMixinFields0 @@ -197,31 +244,31 @@ func init() { // user.DisplayNameValidator is a validator for the "displayName" field. It is called by the builders before save. user.DisplayNameValidator = userDescDisplayName.Validators[0].(func(string) error) // userDescIndexable is the schema descriptor for indexable field. - userDescIndexable := userFields[6].Descriptor() + userDescIndexable := userFields[8].Descriptor() // user.DefaultIndexable holds the default value on creation for the indexable field. user.DefaultIndexable = userDescIndexable.Default.(bool) // userDescFields is the schema descriptor for fields field. - userDescFields := userFields[8].Descriptor() + userDescFields := userFields[10].Descriptor() // user.DefaultFields holds the default value on creation for the fields field. user.DefaultFields = userDescFields.Default.([]lysand.Field) // userDescInbox is the schema descriptor for inbox field. - userDescInbox := userFields[9].Descriptor() + userDescInbox := userFields[11].Descriptor() // user.InboxValidator is a validator for the "inbox" field. It is called by the builders before save. user.InboxValidator = userDescInbox.Validators[0].(func(string) error) // userDescFeatured is the schema descriptor for featured field. - userDescFeatured := userFields[10].Descriptor() + userDescFeatured := userFields[12].Descriptor() // user.FeaturedValidator is a validator for the "featured" field. It is called by the builders before save. user.FeaturedValidator = userDescFeatured.Validators[0].(func(string) error) // userDescFollowers is the schema descriptor for followers field. - userDescFollowers := userFields[11].Descriptor() + userDescFollowers := userFields[13].Descriptor() // user.FollowersValidator is a validator for the "followers" field. It is called by the builders before save. user.FollowersValidator = userDescFollowers.Validators[0].(func(string) error) // userDescFollowing is the schema descriptor for following field. - userDescFollowing := userFields[12].Descriptor() + userDescFollowing := userFields[14].Descriptor() // user.FollowingValidator is a validator for the "following" field. It is called by the builders before save. user.FollowingValidator = userDescFollowing.Validators[0].(func(string) error) // userDescOutbox is the schema descriptor for outbox field. - userDescOutbox := userFields[13].Descriptor() + userDescOutbox := userFields[15].Descriptor() // user.OutboxValidator is a validator for the "outbox" field. It is called by the builders before save. user.OutboxValidator = userDescOutbox.Validators[0].(func(string) error) // userDescID is the schema descriptor for id field. diff --git a/ent/schema/attachment.go b/ent/schema/attachment.go index a3e7334..395c9ad 100644 --- a/ent/schema/attachment.go +++ b/ent/schema/attachment.go @@ -14,10 +14,18 @@ func (Attachment) Fields() []ent.Field { field.Bytes("sha256"), field.Int("size"), - field.String("blurhash").Optional().Nillable(), - field.Int("height").Optional().Nillable(), - field.Int("width").Optional().Nillable(), - field.Int("fps").Optional().Nillable(), + field.String("blurhash"). + Optional(). + Nillable(), + field.Int("height"). + Optional(). + Nillable(), + field.Int("width"). + Optional(). + Nillable(), + field.Int("fps"). + Optional(). + Nillable(), field.String("mimeType"), } diff --git a/ent/schema/follow.go b/ent/schema/follow.go index 0502c2a..d317abc 100644 --- a/ent/schema/follow.go +++ b/ent/schema/follow.go @@ -11,7 +11,9 @@ type Follow struct{ ent.Schema } func (Follow) Fields() []ent.Field { return []ent.Field{ - field.Enum("status").Values("pending", "accepted").Default("pending"), + field.Enum("status"). + Values("pending", "accepted"). + Default("pending"), } } diff --git a/ent/schema/image.go b/ent/schema/image.go index 2f6e72f..627a843 100644 --- a/ent/schema/image.go +++ b/ent/schema/image.go @@ -9,7 +9,7 @@ type Image struct{ ent.Schema } func (Image) Fields() []ent.Field { return []ent.Field{ - field.String("url"), + field.String("url").Validate(ValidateURI), field.String("mimeType"), } } diff --git a/ent/schema/instance_metadata.go b/ent/schema/instance_metadata.go new file mode 100644 index 0000000..57b9a63 --- /dev/null +++ b/ent/schema/instance_metadata.go @@ -0,0 +1,71 @@ +package schema + +import ( + "entgo.io/ent" + "entgo.io/ent/schema/edge" + "entgo.io/ent/schema/field" +) + +type InstanceMetadata struct{ ent.Schema } + +func (InstanceMetadata) Fields() []ent.Field { + return []ent.Field{ + field.String("name").NotEmpty(), + field.String("description"). + Optional(). + Nillable(), + field.String("host"). + NotEmpty(). + Unique(), + + field.Bytes("publicKey"), + field.String("publicKeyAlgorithm"), + field.Bytes("privateKey").Optional(), + + field.String("softwareName").NotEmpty(), + field.String("softwareVersion").NotEmpty(), + + field.String("sharedInboxURI").Validate(ValidateURI), + field.String("moderatorsURI"). + Validate(ValidateURI). + Optional(). + Nillable(), + field.String("adminsURI"). + Validate(ValidateURI). + Optional(). + Nillable(), + + field.String("logoEndpoint"). + Validate(ValidateURI). + Optional(). + Nillable(), + field.String("logoMimeType"). + Validate(ValidateURI). + Optional(). + Nillable(), + field.String("bannerEndpoint"). + Validate(ValidateURI). + Optional(). + Nillable(), + field.String("bannerMimeType"). + Validate(ValidateURI). + Optional(). + Nillable(), + + field.Strings("supportedVersions").Default([]string{}), + field.Strings("supportedExtensions").Default([]string{}), + } +} + +func (InstanceMetadata) Edges() []ent.Edge { + return []ent.Edge{ + edge.To("users", User.Type), + + edge.To("moderators", User.Type), + edge.To("admins", User.Type), + } +} + +func (InstanceMetadata) Mixin() []ent.Mixin { + return []ent.Mixin{LysandEntityMixin{}} +} diff --git a/ent/schema/server_metadata.go b/ent/schema/server_metadata.go deleted file mode 100644 index 1cb2d95..0000000 --- a/ent/schema/server_metadata.go +++ /dev/null @@ -1,43 +0,0 @@ -package schema - -import ( - "entgo.io/ent" - "entgo.io/ent/schema/edge" - "entgo.io/ent/schema/field" - "entgo.io/ent/schema/index" -) - -type ServerMetadata struct{ ent.Schema } - -func (ServerMetadata) Fields() []ent.Field { - return []ent.Field{ - field.String("name"). - NotEmpty(), - field.String("description"). - Optional(). - Nillable(), - - field.String("version"). - NotEmpty(), - - field.Strings("supportedExtensions"). - Default([]string{}), - } -} - -func (ServerMetadata) Edges() []ent.Edge { - return []ent.Edge{ - edge.To("follower", User.Type).Unique().Required(), - edge.To("followee", User.Type).Unique().Required(), - } -} - -func (ServerMetadata) Indexes() []ent.Index { - return []ent.Index{ - index.Edges("follower", "followee").Unique(), - } -} - -func (ServerMetadata) Mixin() []ent.Mixin { - return []ent.Mixin{LysandEntityMixin{}} -} diff --git a/ent/schema/user.go b/ent/schema/user.go index 129007a..5dd6207 100644 --- a/ent/schema/user.go +++ b/ent/schema/user.go @@ -1,7 +1,6 @@ package schema import ( - "crypto/ed25519" "errors" "regexp" @@ -20,17 +19,31 @@ type User struct{ ent.Schema } func (User) Fields() []ent.Field { return []ent.Field{ - field.String("username").Unique().MaxLen(32).Validate(ValidateUsername), - field.Bytes("passwordHash").Optional().Nillable(), + field.String("username"). + Unique(). + MaxLen(32). + Validate(ValidateUsername), + field.Bytes("passwordHash"). + Optional(). + Nillable(), - field.String("displayName").MaxLen(256).Optional().Nillable(), - field.String("biography").Optional().Nillable(), + field.String("displayName"). + MaxLen(256). + Optional(). + Nillable(), + field.String("biography"). + Optional(). + Nillable(), - field.Bytes("publicKey").GoType(ed25519.PublicKey([]byte{})), - field.Bytes("privateKey").GoType(ed25519.PrivateKey([]byte{})).Optional(), + field.Bytes("publicKey"), + field.String("publicKeyActor"), + field.String("publicKeyAlgorithm"), + field.Bytes("privateKey").Optional(), field.Bool("indexable").Default(true), - field.Enum("privacyLevel").Values("public", "restricted", "private").Default("public"), + field.Enum("privacyLevel"). + Values("public", "restricted", "private"). + Default("public"), field.JSON("fields", []lysand.Field{}).Default([]lysand.Field{}), @@ -51,6 +64,10 @@ func (User) Edges() []ent.Edge { edge.From("authoredNotes", Note.Type).Ref("author"), edge.From("mentionedNotes", Note.Type).Ref("mentions"), + + edge.From("servers", InstanceMetadata.Type).Ref("users"), + edge.From("moderatedServers", InstanceMetadata.Type).Ref("moderators"), + edge.From("administeredServers", InstanceMetadata.Type).Ref("admins"), } } diff --git a/ent/servermetadata.go b/ent/servermetadata.go deleted file mode 100644 index 7c50c8d..0000000 --- a/ent/servermetadata.go +++ /dev/null @@ -1,275 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package ent - -import ( - "encoding/json" - "fmt" - "strings" - "time" - - "entgo.io/ent" - "entgo.io/ent/dialect/sql" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/ent/servermetadata" - "github.com/lysand-org/versia-go/ent/user" - "github.com/lysand-org/versia-go/pkg/lysand" -) - -// ServerMetadata is the model entity for the ServerMetadata schema. -type ServerMetadata struct { - config `json:"-"` - // ID of the ent. - ID uuid.UUID `json:"id,omitempty"` - // IsRemote holds the value of the "isRemote" field. - IsRemote bool `json:"isRemote,omitempty"` - // URI holds the value of the "uri" field. - URI string `json:"uri,omitempty"` - // Extensions holds the value of the "extensions" field. - Extensions lysand.Extensions `json:"extensions,omitempty"` - // CreatedAt holds the value of the "created_at" field. - CreatedAt time.Time `json:"created_at,omitempty"` - // UpdatedAt holds the value of the "updated_at" field. - UpdatedAt time.Time `json:"updated_at,omitempty"` - // Name holds the value of the "name" field. - Name string `json:"name,omitempty"` - // Description holds the value of the "description" field. - Description *string `json:"description,omitempty"` - // Version holds the value of the "version" field. - Version string `json:"version,omitempty"` - // SupportedExtensions holds the value of the "supportedExtensions" field. - SupportedExtensions []string `json:"supportedExtensions,omitempty"` - // Edges holds the relations/edges for other nodes in the graph. - // The values are being populated by the ServerMetadataQuery when eager-loading is set. - Edges ServerMetadataEdges `json:"edges"` - server_metadata_follower *uuid.UUID - server_metadata_followee *uuid.UUID - selectValues sql.SelectValues -} - -// ServerMetadataEdges holds the relations/edges for other nodes in the graph. -type ServerMetadataEdges struct { - // Follower holds the value of the follower edge. - Follower *User `json:"follower,omitempty"` - // Followee holds the value of the followee edge. - Followee *User `json:"followee,omitempty"` - // loadedTypes holds the information for reporting if a - // type was loaded (or requested) in eager-loading or not. - loadedTypes [2]bool -} - -// FollowerOrErr returns the Follower value or an error if the edge -// was not loaded in eager-loading, or loaded but was not found. -func (e ServerMetadataEdges) FollowerOrErr() (*User, error) { - if e.Follower != nil { - return e.Follower, nil - } else if e.loadedTypes[0] { - return nil, &NotFoundError{label: user.Label} - } - return nil, &NotLoadedError{edge: "follower"} -} - -// FolloweeOrErr returns the Followee value or an error if the edge -// was not loaded in eager-loading, or loaded but was not found. -func (e ServerMetadataEdges) FolloweeOrErr() (*User, error) { - if e.Followee != nil { - return e.Followee, nil - } else if e.loadedTypes[1] { - return nil, &NotFoundError{label: user.Label} - } - return nil, &NotLoadedError{edge: "followee"} -} - -// scanValues returns the types for scanning values from sql.Rows. -func (*ServerMetadata) scanValues(columns []string) ([]any, error) { - values := make([]any, len(columns)) - for i := range columns { - switch columns[i] { - case servermetadata.FieldExtensions, servermetadata.FieldSupportedExtensions: - values[i] = new([]byte) - case servermetadata.FieldIsRemote: - values[i] = new(sql.NullBool) - case servermetadata.FieldURI, servermetadata.FieldName, servermetadata.FieldDescription, servermetadata.FieldVersion: - values[i] = new(sql.NullString) - case servermetadata.FieldCreatedAt, servermetadata.FieldUpdatedAt: - values[i] = new(sql.NullTime) - case servermetadata.FieldID: - values[i] = new(uuid.UUID) - case servermetadata.ForeignKeys[0]: // server_metadata_follower - values[i] = &sql.NullScanner{S: new(uuid.UUID)} - case servermetadata.ForeignKeys[1]: // server_metadata_followee - values[i] = &sql.NullScanner{S: new(uuid.UUID)} - default: - values[i] = new(sql.UnknownType) - } - } - return values, nil -} - -// assignValues assigns the values that were returned from sql.Rows (after scanning) -// to the ServerMetadata fields. -func (sm *ServerMetadata) assignValues(columns []string, values []any) error { - if m, n := len(values), len(columns); m < n { - return fmt.Errorf("mismatch number of scan values: %d != %d", m, n) - } - for i := range columns { - switch columns[i] { - case servermetadata.FieldID: - if value, ok := values[i].(*uuid.UUID); !ok { - return fmt.Errorf("unexpected type %T for field id", values[i]) - } else if value != nil { - sm.ID = *value - } - case servermetadata.FieldIsRemote: - if value, ok := values[i].(*sql.NullBool); !ok { - return fmt.Errorf("unexpected type %T for field isRemote", values[i]) - } else if value.Valid { - sm.IsRemote = value.Bool - } - case servermetadata.FieldURI: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field uri", values[i]) - } else if value.Valid { - sm.URI = value.String - } - case servermetadata.FieldExtensions: - if value, ok := values[i].(*[]byte); !ok { - return fmt.Errorf("unexpected type %T for field extensions", values[i]) - } else if value != nil && len(*value) > 0 { - if err := json.Unmarshal(*value, &sm.Extensions); err != nil { - return fmt.Errorf("unmarshal field extensions: %w", err) - } - } - case servermetadata.FieldCreatedAt: - if value, ok := values[i].(*sql.NullTime); !ok { - return fmt.Errorf("unexpected type %T for field created_at", values[i]) - } else if value.Valid { - sm.CreatedAt = value.Time - } - case servermetadata.FieldUpdatedAt: - if value, ok := values[i].(*sql.NullTime); !ok { - return fmt.Errorf("unexpected type %T for field updated_at", values[i]) - } else if value.Valid { - sm.UpdatedAt = value.Time - } - case servermetadata.FieldName: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field name", values[i]) - } else if value.Valid { - sm.Name = value.String - } - case servermetadata.FieldDescription: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field description", values[i]) - } else if value.Valid { - sm.Description = new(string) - *sm.Description = value.String - } - case servermetadata.FieldVersion: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field version", values[i]) - } else if value.Valid { - sm.Version = value.String - } - case servermetadata.FieldSupportedExtensions: - if value, ok := values[i].(*[]byte); !ok { - return fmt.Errorf("unexpected type %T for field supportedExtensions", values[i]) - } else if value != nil && len(*value) > 0 { - if err := json.Unmarshal(*value, &sm.SupportedExtensions); err != nil { - return fmt.Errorf("unmarshal field supportedExtensions: %w", err) - } - } - case servermetadata.ForeignKeys[0]: - if value, ok := values[i].(*sql.NullScanner); !ok { - return fmt.Errorf("unexpected type %T for field server_metadata_follower", values[i]) - } else if value.Valid { - sm.server_metadata_follower = new(uuid.UUID) - *sm.server_metadata_follower = *value.S.(*uuid.UUID) - } - case servermetadata.ForeignKeys[1]: - if value, ok := values[i].(*sql.NullScanner); !ok { - return fmt.Errorf("unexpected type %T for field server_metadata_followee", values[i]) - } else if value.Valid { - sm.server_metadata_followee = new(uuid.UUID) - *sm.server_metadata_followee = *value.S.(*uuid.UUID) - } - default: - sm.selectValues.Set(columns[i], values[i]) - } - } - return nil -} - -// Value returns the ent.Value that was dynamically selected and assigned to the ServerMetadata. -// This includes values selected through modifiers, order, etc. -func (sm *ServerMetadata) Value(name string) (ent.Value, error) { - return sm.selectValues.Get(name) -} - -// QueryFollower queries the "follower" edge of the ServerMetadata entity. -func (sm *ServerMetadata) QueryFollower() *UserQuery { - return NewServerMetadataClient(sm.config).QueryFollower(sm) -} - -// QueryFollowee queries the "followee" edge of the ServerMetadata entity. -func (sm *ServerMetadata) QueryFollowee() *UserQuery { - return NewServerMetadataClient(sm.config).QueryFollowee(sm) -} - -// Update returns a builder for updating this ServerMetadata. -// Note that you need to call ServerMetadata.Unwrap() before calling this method if this ServerMetadata -// was returned from a transaction, and the transaction was committed or rolled back. -func (sm *ServerMetadata) Update() *ServerMetadataUpdateOne { - return NewServerMetadataClient(sm.config).UpdateOne(sm) -} - -// Unwrap unwraps the ServerMetadata entity that was returned from a transaction after it was closed, -// so that all future queries will be executed through the driver which created the transaction. -func (sm *ServerMetadata) Unwrap() *ServerMetadata { - _tx, ok := sm.config.driver.(*txDriver) - if !ok { - panic("ent: ServerMetadata is not a transactional entity") - } - sm.config.driver = _tx.drv - return sm -} - -// String implements the fmt.Stringer. -func (sm *ServerMetadata) String() string { - var builder strings.Builder - builder.WriteString("ServerMetadata(") - builder.WriteString(fmt.Sprintf("id=%v, ", sm.ID)) - builder.WriteString("isRemote=") - builder.WriteString(fmt.Sprintf("%v", sm.IsRemote)) - builder.WriteString(", ") - builder.WriteString("uri=") - builder.WriteString(sm.URI) - builder.WriteString(", ") - builder.WriteString("extensions=") - builder.WriteString(fmt.Sprintf("%v", sm.Extensions)) - builder.WriteString(", ") - builder.WriteString("created_at=") - builder.WriteString(sm.CreatedAt.Format(time.ANSIC)) - builder.WriteString(", ") - builder.WriteString("updated_at=") - builder.WriteString(sm.UpdatedAt.Format(time.ANSIC)) - builder.WriteString(", ") - builder.WriteString("name=") - builder.WriteString(sm.Name) - builder.WriteString(", ") - if v := sm.Description; v != nil { - builder.WriteString("description=") - builder.WriteString(*v) - } - builder.WriteString(", ") - builder.WriteString("version=") - builder.WriteString(sm.Version) - builder.WriteString(", ") - builder.WriteString("supportedExtensions=") - builder.WriteString(fmt.Sprintf("%v", sm.SupportedExtensions)) - builder.WriteByte(')') - return builder.String() -} - -// ServerMetadataSlice is a parsable slice of ServerMetadata. -type ServerMetadataSlice []*ServerMetadata diff --git a/ent/servermetadata/servermetadata.go b/ent/servermetadata/servermetadata.go deleted file mode 100644 index f138d27..0000000 --- a/ent/servermetadata/servermetadata.go +++ /dev/null @@ -1,185 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package servermetadata - -import ( - "time" - - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/pkg/lysand" -) - -const ( - // Label holds the string label denoting the servermetadata type in the database. - Label = "server_metadata" - // FieldID holds the string denoting the id field in the database. - FieldID = "id" - // FieldIsRemote holds the string denoting the isremote field in the database. - FieldIsRemote = "is_remote" - // FieldURI holds the string denoting the uri field in the database. - FieldURI = "uri" - // FieldExtensions holds the string denoting the extensions field in the database. - FieldExtensions = "extensions" - // FieldCreatedAt holds the string denoting the created_at field in the database. - FieldCreatedAt = "created_at" - // FieldUpdatedAt holds the string denoting the updated_at field in the database. - FieldUpdatedAt = "updated_at" - // FieldName holds the string denoting the name field in the database. - FieldName = "name" - // FieldDescription holds the string denoting the description field in the database. - FieldDescription = "description" - // FieldVersion holds the string denoting the version field in the database. - FieldVersion = "version" - // FieldSupportedExtensions holds the string denoting the supportedextensions field in the database. - FieldSupportedExtensions = "supported_extensions" - // EdgeFollower holds the string denoting the follower edge name in mutations. - EdgeFollower = "follower" - // EdgeFollowee holds the string denoting the followee edge name in mutations. - EdgeFollowee = "followee" - // Table holds the table name of the servermetadata in the database. - Table = "server_metadata" - // FollowerTable is the table that holds the follower relation/edge. - FollowerTable = "server_metadata" - // FollowerInverseTable is the table name for the User entity. - // It exists in this package in order to avoid circular dependency with the "user" package. - FollowerInverseTable = "users" - // FollowerColumn is the table column denoting the follower relation/edge. - FollowerColumn = "server_metadata_follower" - // FolloweeTable is the table that holds the followee relation/edge. - FolloweeTable = "server_metadata" - // FolloweeInverseTable is the table name for the User entity. - // It exists in this package in order to avoid circular dependency with the "user" package. - FolloweeInverseTable = "users" - // FolloweeColumn is the table column denoting the followee relation/edge. - FolloweeColumn = "server_metadata_followee" -) - -// Columns holds all SQL columns for servermetadata fields. -var Columns = []string{ - FieldID, - FieldIsRemote, - FieldURI, - FieldExtensions, - FieldCreatedAt, - FieldUpdatedAt, - FieldName, - FieldDescription, - FieldVersion, - FieldSupportedExtensions, -} - -// ForeignKeys holds the SQL foreign-keys that are owned by the "server_metadata" -// table and are not defined as standalone fields in the schema. -var ForeignKeys = []string{ - "server_metadata_follower", - "server_metadata_followee", -} - -// ValidColumn reports if the column name is valid (part of the table columns). -func ValidColumn(column string) bool { - for i := range Columns { - if column == Columns[i] { - return true - } - } - for i := range ForeignKeys { - if column == ForeignKeys[i] { - return true - } - } - return false -} - -var ( - // URIValidator is a validator for the "uri" field. It is called by the builders before save. - URIValidator func(string) error - // DefaultExtensions holds the default value on creation for the "extensions" field. - DefaultExtensions lysand.Extensions - // DefaultCreatedAt holds the default value on creation for the "created_at" field. - DefaultCreatedAt func() time.Time - // DefaultUpdatedAt holds the default value on creation for the "updated_at" field. - DefaultUpdatedAt func() time.Time - // UpdateDefaultUpdatedAt holds the default value on update for the "updated_at" field. - UpdateDefaultUpdatedAt func() time.Time - // NameValidator is a validator for the "name" field. It is called by the builders before save. - NameValidator func(string) error - // VersionValidator is a validator for the "version" field. It is called by the builders before save. - VersionValidator func(string) error - // DefaultSupportedExtensions holds the default value on creation for the "supportedExtensions" field. - DefaultSupportedExtensions []string - // DefaultID holds the default value on creation for the "id" field. - DefaultID func() uuid.UUID -) - -// OrderOption defines the ordering options for the ServerMetadata queries. -type OrderOption func(*sql.Selector) - -// ByID orders the results by the id field. -func ByID(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldID, opts...).ToFunc() -} - -// ByIsRemote orders the results by the isRemote field. -func ByIsRemote(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldIsRemote, opts...).ToFunc() -} - -// ByURI orders the results by the uri field. -func ByURI(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldURI, opts...).ToFunc() -} - -// ByCreatedAt orders the results by the created_at field. -func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldCreatedAt, opts...).ToFunc() -} - -// ByUpdatedAt orders the results by the updated_at field. -func ByUpdatedAt(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldUpdatedAt, opts...).ToFunc() -} - -// ByName orders the results by the name field. -func ByName(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldName, opts...).ToFunc() -} - -// ByDescription orders the results by the description field. -func ByDescription(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldDescription, opts...).ToFunc() -} - -// ByVersion orders the results by the version field. -func ByVersion(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldVersion, opts...).ToFunc() -} - -// ByFollowerField orders the results by follower field. -func ByFollowerField(field string, opts ...sql.OrderTermOption) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newFollowerStep(), sql.OrderByField(field, opts...)) - } -} - -// ByFolloweeField orders the results by followee field. -func ByFolloweeField(field string, opts ...sql.OrderTermOption) OrderOption { - return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newFolloweeStep(), sql.OrderByField(field, opts...)) - } -} -func newFollowerStep() *sqlgraph.Step { - return sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.To(FollowerInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, FollowerTable, FollowerColumn), - ) -} -func newFolloweeStep() *sqlgraph.Step { - return sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.To(FolloweeInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, FolloweeTable, FolloweeColumn), - ) -} diff --git a/ent/servermetadata/where.go b/ent/servermetadata/where.go deleted file mode 100644 index cff3789..0000000 --- a/ent/servermetadata/where.go +++ /dev/null @@ -1,513 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package servermetadata - -import ( - "time" - - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/ent/predicate" -) - -// ID filters vertices based on their ID field. -func ID(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldID, id)) -} - -// IDEQ applies the EQ predicate on the ID field. -func IDEQ(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldID, id)) -} - -// IDNEQ applies the NEQ predicate on the ID field. -func IDNEQ(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldID, id)) -} - -// IDIn applies the In predicate on the ID field. -func IDIn(ids ...uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldID, ids...)) -} - -// IDNotIn applies the NotIn predicate on the ID field. -func IDNotIn(ids ...uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldID, ids...)) -} - -// IDGT applies the GT predicate on the ID field. -func IDGT(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldID, id)) -} - -// IDGTE applies the GTE predicate on the ID field. -func IDGTE(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldID, id)) -} - -// IDLT applies the LT predicate on the ID field. -func IDLT(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldID, id)) -} - -// IDLTE applies the LTE predicate on the ID field. -func IDLTE(id uuid.UUID) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldID, id)) -} - -// IsRemote applies equality check predicate on the "isRemote" field. It's identical to IsRemoteEQ. -func IsRemote(v bool) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldIsRemote, v)) -} - -// URI applies equality check predicate on the "uri" field. It's identical to URIEQ. -func URI(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldURI, v)) -} - -// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. -func CreatedAt(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldCreatedAt, v)) -} - -// UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ. -func UpdatedAt(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldUpdatedAt, v)) -} - -// Name applies equality check predicate on the "name" field. It's identical to NameEQ. -func Name(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldName, v)) -} - -// Description applies equality check predicate on the "description" field. It's identical to DescriptionEQ. -func Description(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldDescription, v)) -} - -// Version applies equality check predicate on the "version" field. It's identical to VersionEQ. -func Version(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldVersion, v)) -} - -// IsRemoteEQ applies the EQ predicate on the "isRemote" field. -func IsRemoteEQ(v bool) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldIsRemote, v)) -} - -// IsRemoteNEQ applies the NEQ predicate on the "isRemote" field. -func IsRemoteNEQ(v bool) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldIsRemote, v)) -} - -// URIEQ applies the EQ predicate on the "uri" field. -func URIEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldURI, v)) -} - -// URINEQ applies the NEQ predicate on the "uri" field. -func URINEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldURI, v)) -} - -// URIIn applies the In predicate on the "uri" field. -func URIIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldURI, vs...)) -} - -// URINotIn applies the NotIn predicate on the "uri" field. -func URINotIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldURI, vs...)) -} - -// URIGT applies the GT predicate on the "uri" field. -func URIGT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldURI, v)) -} - -// URIGTE applies the GTE predicate on the "uri" field. -func URIGTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldURI, v)) -} - -// URILT applies the LT predicate on the "uri" field. -func URILT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldURI, v)) -} - -// URILTE applies the LTE predicate on the "uri" field. -func URILTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldURI, v)) -} - -// URIContains applies the Contains predicate on the "uri" field. -func URIContains(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContains(FieldURI, v)) -} - -// URIHasPrefix applies the HasPrefix predicate on the "uri" field. -func URIHasPrefix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasPrefix(FieldURI, v)) -} - -// URIHasSuffix applies the HasSuffix predicate on the "uri" field. -func URIHasSuffix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasSuffix(FieldURI, v)) -} - -// URIEqualFold applies the EqualFold predicate on the "uri" field. -func URIEqualFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEqualFold(FieldURI, v)) -} - -// URIContainsFold applies the ContainsFold predicate on the "uri" field. -func URIContainsFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContainsFold(FieldURI, v)) -} - -// CreatedAtEQ applies the EQ predicate on the "created_at" field. -func CreatedAtEQ(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldCreatedAt, v)) -} - -// CreatedAtNEQ applies the NEQ predicate on the "created_at" field. -func CreatedAtNEQ(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldCreatedAt, v)) -} - -// CreatedAtIn applies the In predicate on the "created_at" field. -func CreatedAtIn(vs ...time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldCreatedAt, vs...)) -} - -// CreatedAtNotIn applies the NotIn predicate on the "created_at" field. -func CreatedAtNotIn(vs ...time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldCreatedAt, vs...)) -} - -// CreatedAtGT applies the GT predicate on the "created_at" field. -func CreatedAtGT(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldCreatedAt, v)) -} - -// CreatedAtGTE applies the GTE predicate on the "created_at" field. -func CreatedAtGTE(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldCreatedAt, v)) -} - -// CreatedAtLT applies the LT predicate on the "created_at" field. -func CreatedAtLT(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldCreatedAt, v)) -} - -// CreatedAtLTE applies the LTE predicate on the "created_at" field. -func CreatedAtLTE(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldCreatedAt, v)) -} - -// UpdatedAtEQ applies the EQ predicate on the "updated_at" field. -func UpdatedAtEQ(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldUpdatedAt, v)) -} - -// UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field. -func UpdatedAtNEQ(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldUpdatedAt, v)) -} - -// UpdatedAtIn applies the In predicate on the "updated_at" field. -func UpdatedAtIn(vs ...time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldUpdatedAt, vs...)) -} - -// UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field. -func UpdatedAtNotIn(vs ...time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldUpdatedAt, vs...)) -} - -// UpdatedAtGT applies the GT predicate on the "updated_at" field. -func UpdatedAtGT(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldUpdatedAt, v)) -} - -// UpdatedAtGTE applies the GTE predicate on the "updated_at" field. -func UpdatedAtGTE(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldUpdatedAt, v)) -} - -// UpdatedAtLT applies the LT predicate on the "updated_at" field. -func UpdatedAtLT(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldUpdatedAt, v)) -} - -// UpdatedAtLTE applies the LTE predicate on the "updated_at" field. -func UpdatedAtLTE(v time.Time) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldUpdatedAt, v)) -} - -// NameEQ applies the EQ predicate on the "name" field. -func NameEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldName, v)) -} - -// NameNEQ applies the NEQ predicate on the "name" field. -func NameNEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldName, v)) -} - -// NameIn applies the In predicate on the "name" field. -func NameIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldName, vs...)) -} - -// NameNotIn applies the NotIn predicate on the "name" field. -func NameNotIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldName, vs...)) -} - -// NameGT applies the GT predicate on the "name" field. -func NameGT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldName, v)) -} - -// NameGTE applies the GTE predicate on the "name" field. -func NameGTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldName, v)) -} - -// NameLT applies the LT predicate on the "name" field. -func NameLT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldName, v)) -} - -// NameLTE applies the LTE predicate on the "name" field. -func NameLTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldName, v)) -} - -// NameContains applies the Contains predicate on the "name" field. -func NameContains(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContains(FieldName, v)) -} - -// NameHasPrefix applies the HasPrefix predicate on the "name" field. -func NameHasPrefix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasPrefix(FieldName, v)) -} - -// NameHasSuffix applies the HasSuffix predicate on the "name" field. -func NameHasSuffix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasSuffix(FieldName, v)) -} - -// NameEqualFold applies the EqualFold predicate on the "name" field. -func NameEqualFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEqualFold(FieldName, v)) -} - -// NameContainsFold applies the ContainsFold predicate on the "name" field. -func NameContainsFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContainsFold(FieldName, v)) -} - -// DescriptionEQ applies the EQ predicate on the "description" field. -func DescriptionEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldDescription, v)) -} - -// DescriptionNEQ applies the NEQ predicate on the "description" field. -func DescriptionNEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldDescription, v)) -} - -// DescriptionIn applies the In predicate on the "description" field. -func DescriptionIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldDescription, vs...)) -} - -// DescriptionNotIn applies the NotIn predicate on the "description" field. -func DescriptionNotIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldDescription, vs...)) -} - -// DescriptionGT applies the GT predicate on the "description" field. -func DescriptionGT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldDescription, v)) -} - -// DescriptionGTE applies the GTE predicate on the "description" field. -func DescriptionGTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldDescription, v)) -} - -// DescriptionLT applies the LT predicate on the "description" field. -func DescriptionLT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldDescription, v)) -} - -// DescriptionLTE applies the LTE predicate on the "description" field. -func DescriptionLTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldDescription, v)) -} - -// DescriptionContains applies the Contains predicate on the "description" field. -func DescriptionContains(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContains(FieldDescription, v)) -} - -// DescriptionHasPrefix applies the HasPrefix predicate on the "description" field. -func DescriptionHasPrefix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasPrefix(FieldDescription, v)) -} - -// DescriptionHasSuffix applies the HasSuffix predicate on the "description" field. -func DescriptionHasSuffix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasSuffix(FieldDescription, v)) -} - -// DescriptionIsNil applies the IsNil predicate on the "description" field. -func DescriptionIsNil() predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIsNull(FieldDescription)) -} - -// DescriptionNotNil applies the NotNil predicate on the "description" field. -func DescriptionNotNil() predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotNull(FieldDescription)) -} - -// DescriptionEqualFold applies the EqualFold predicate on the "description" field. -func DescriptionEqualFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEqualFold(FieldDescription, v)) -} - -// DescriptionContainsFold applies the ContainsFold predicate on the "description" field. -func DescriptionContainsFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContainsFold(FieldDescription, v)) -} - -// VersionEQ applies the EQ predicate on the "version" field. -func VersionEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEQ(FieldVersion, v)) -} - -// VersionNEQ applies the NEQ predicate on the "version" field. -func VersionNEQ(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNEQ(FieldVersion, v)) -} - -// VersionIn applies the In predicate on the "version" field. -func VersionIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldIn(FieldVersion, vs...)) -} - -// VersionNotIn applies the NotIn predicate on the "version" field. -func VersionNotIn(vs ...string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldNotIn(FieldVersion, vs...)) -} - -// VersionGT applies the GT predicate on the "version" field. -func VersionGT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGT(FieldVersion, v)) -} - -// VersionGTE applies the GTE predicate on the "version" field. -func VersionGTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldGTE(FieldVersion, v)) -} - -// VersionLT applies the LT predicate on the "version" field. -func VersionLT(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLT(FieldVersion, v)) -} - -// VersionLTE applies the LTE predicate on the "version" field. -func VersionLTE(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldLTE(FieldVersion, v)) -} - -// VersionContains applies the Contains predicate on the "version" field. -func VersionContains(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContains(FieldVersion, v)) -} - -// VersionHasPrefix applies the HasPrefix predicate on the "version" field. -func VersionHasPrefix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasPrefix(FieldVersion, v)) -} - -// VersionHasSuffix applies the HasSuffix predicate on the "version" field. -func VersionHasSuffix(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldHasSuffix(FieldVersion, v)) -} - -// VersionEqualFold applies the EqualFold predicate on the "version" field. -func VersionEqualFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldEqualFold(FieldVersion, v)) -} - -// VersionContainsFold applies the ContainsFold predicate on the "version" field. -func VersionContainsFold(v string) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.FieldContainsFold(FieldVersion, v)) -} - -// HasFollower applies the HasEdge predicate on the "follower" edge. -func HasFollower() predicate.ServerMetadata { - return predicate.ServerMetadata(func(s *sql.Selector) { - step := sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, FollowerTable, FollowerColumn), - ) - sqlgraph.HasNeighbors(s, step) - }) -} - -// HasFollowerWith applies the HasEdge predicate on the "follower" edge with a given conditions (other predicates). -func HasFollowerWith(preds ...predicate.User) predicate.ServerMetadata { - return predicate.ServerMetadata(func(s *sql.Selector) { - step := newFollowerStep() - sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { - for _, p := range preds { - p(s) - } - }) - }) -} - -// HasFollowee applies the HasEdge predicate on the "followee" edge. -func HasFollowee() predicate.ServerMetadata { - return predicate.ServerMetadata(func(s *sql.Selector) { - step := sqlgraph.NewStep( - sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, FolloweeTable, FolloweeColumn), - ) - sqlgraph.HasNeighbors(s, step) - }) -} - -// HasFolloweeWith applies the HasEdge predicate on the "followee" edge with a given conditions (other predicates). -func HasFolloweeWith(preds ...predicate.User) predicate.ServerMetadata { - return predicate.ServerMetadata(func(s *sql.Selector) { - step := newFolloweeStep() - sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { - for _, p := range preds { - p(s) - } - }) - }) -} - -// And groups predicates with the AND operator between them. -func And(predicates ...predicate.ServerMetadata) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.AndPredicates(predicates...)) -} - -// Or groups predicates with the OR operator between them. -func Or(predicates ...predicate.ServerMetadata) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.OrPredicates(predicates...)) -} - -// Not applies the not operator on the given predicate. -func Not(p predicate.ServerMetadata) predicate.ServerMetadata { - return predicate.ServerMetadata(sql.NotPredicates(p)) -} diff --git a/ent/servermetadata_create.go b/ent/servermetadata_create.go deleted file mode 100644 index 3071138..0000000 --- a/ent/servermetadata_create.go +++ /dev/null @@ -1,1035 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package ent - -import ( - "context" - "errors" - "fmt" - "time" - - "entgo.io/ent/dialect" - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "entgo.io/ent/schema/field" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/ent/servermetadata" - "github.com/lysand-org/versia-go/ent/user" - "github.com/lysand-org/versia-go/pkg/lysand" -) - -// ServerMetadataCreate is the builder for creating a ServerMetadata entity. -type ServerMetadataCreate struct { - config - mutation *ServerMetadataMutation - hooks []Hook - conflict []sql.ConflictOption -} - -// SetIsRemote sets the "isRemote" field. -func (smc *ServerMetadataCreate) SetIsRemote(b bool) *ServerMetadataCreate { - smc.mutation.SetIsRemote(b) - return smc -} - -// SetURI sets the "uri" field. -func (smc *ServerMetadataCreate) SetURI(s string) *ServerMetadataCreate { - smc.mutation.SetURI(s) - return smc -} - -// SetExtensions sets the "extensions" field. -func (smc *ServerMetadataCreate) SetExtensions(l lysand.Extensions) *ServerMetadataCreate { - smc.mutation.SetExtensions(l) - return smc -} - -// SetCreatedAt sets the "created_at" field. -func (smc *ServerMetadataCreate) SetCreatedAt(t time.Time) *ServerMetadataCreate { - smc.mutation.SetCreatedAt(t) - return smc -} - -// SetNillableCreatedAt sets the "created_at" field if the given value is not nil. -func (smc *ServerMetadataCreate) SetNillableCreatedAt(t *time.Time) *ServerMetadataCreate { - if t != nil { - smc.SetCreatedAt(*t) - } - return smc -} - -// SetUpdatedAt sets the "updated_at" field. -func (smc *ServerMetadataCreate) SetUpdatedAt(t time.Time) *ServerMetadataCreate { - smc.mutation.SetUpdatedAt(t) - return smc -} - -// SetNillableUpdatedAt sets the "updated_at" field if the given value is not nil. -func (smc *ServerMetadataCreate) SetNillableUpdatedAt(t *time.Time) *ServerMetadataCreate { - if t != nil { - smc.SetUpdatedAt(*t) - } - return smc -} - -// SetName sets the "name" field. -func (smc *ServerMetadataCreate) SetName(s string) *ServerMetadataCreate { - smc.mutation.SetName(s) - return smc -} - -// SetDescription sets the "description" field. -func (smc *ServerMetadataCreate) SetDescription(s string) *ServerMetadataCreate { - smc.mutation.SetDescription(s) - return smc -} - -// SetNillableDescription sets the "description" field if the given value is not nil. -func (smc *ServerMetadataCreate) SetNillableDescription(s *string) *ServerMetadataCreate { - if s != nil { - smc.SetDescription(*s) - } - return smc -} - -// SetVersion sets the "version" field. -func (smc *ServerMetadataCreate) SetVersion(s string) *ServerMetadataCreate { - smc.mutation.SetVersion(s) - return smc -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (smc *ServerMetadataCreate) SetSupportedExtensions(s []string) *ServerMetadataCreate { - smc.mutation.SetSupportedExtensions(s) - return smc -} - -// SetID sets the "id" field. -func (smc *ServerMetadataCreate) SetID(u uuid.UUID) *ServerMetadataCreate { - smc.mutation.SetID(u) - return smc -} - -// SetNillableID sets the "id" field if the given value is not nil. -func (smc *ServerMetadataCreate) SetNillableID(u *uuid.UUID) *ServerMetadataCreate { - if u != nil { - smc.SetID(*u) - } - return smc -} - -// SetFollowerID sets the "follower" edge to the User entity by ID. -func (smc *ServerMetadataCreate) SetFollowerID(id uuid.UUID) *ServerMetadataCreate { - smc.mutation.SetFollowerID(id) - return smc -} - -// SetFollower sets the "follower" edge to the User entity. -func (smc *ServerMetadataCreate) SetFollower(u *User) *ServerMetadataCreate { - return smc.SetFollowerID(u.ID) -} - -// SetFolloweeID sets the "followee" edge to the User entity by ID. -func (smc *ServerMetadataCreate) SetFolloweeID(id uuid.UUID) *ServerMetadataCreate { - smc.mutation.SetFolloweeID(id) - return smc -} - -// SetFollowee sets the "followee" edge to the User entity. -func (smc *ServerMetadataCreate) SetFollowee(u *User) *ServerMetadataCreate { - return smc.SetFolloweeID(u.ID) -} - -// Mutation returns the ServerMetadataMutation object of the builder. -func (smc *ServerMetadataCreate) Mutation() *ServerMetadataMutation { - return smc.mutation -} - -// Save creates the ServerMetadata in the database. -func (smc *ServerMetadataCreate) Save(ctx context.Context) (*ServerMetadata, error) { - smc.defaults() - return withHooks(ctx, smc.sqlSave, smc.mutation, smc.hooks) -} - -// SaveX calls Save and panics if Save returns an error. -func (smc *ServerMetadataCreate) SaveX(ctx context.Context) *ServerMetadata { - v, err := smc.Save(ctx) - if err != nil { - panic(err) - } - return v -} - -// Exec executes the query. -func (smc *ServerMetadataCreate) Exec(ctx context.Context) error { - _, err := smc.Save(ctx) - return err -} - -// ExecX is like Exec, but panics if an error occurs. -func (smc *ServerMetadataCreate) ExecX(ctx context.Context) { - if err := smc.Exec(ctx); err != nil { - panic(err) - } -} - -// defaults sets the default values of the builder before save. -func (smc *ServerMetadataCreate) defaults() { - if _, ok := smc.mutation.Extensions(); !ok { - v := servermetadata.DefaultExtensions - smc.mutation.SetExtensions(v) - } - if _, ok := smc.mutation.CreatedAt(); !ok { - v := servermetadata.DefaultCreatedAt() - smc.mutation.SetCreatedAt(v) - } - if _, ok := smc.mutation.UpdatedAt(); !ok { - v := servermetadata.DefaultUpdatedAt() - smc.mutation.SetUpdatedAt(v) - } - if _, ok := smc.mutation.SupportedExtensions(); !ok { - v := servermetadata.DefaultSupportedExtensions - smc.mutation.SetSupportedExtensions(v) - } - if _, ok := smc.mutation.ID(); !ok { - v := servermetadata.DefaultID() - smc.mutation.SetID(v) - } -} - -// check runs all checks and user-defined validators on the builder. -func (smc *ServerMetadataCreate) check() error { - if _, ok := smc.mutation.IsRemote(); !ok { - return &ValidationError{Name: "isRemote", err: errors.New(`ent: missing required field "ServerMetadata.isRemote"`)} - } - if _, ok := smc.mutation.URI(); !ok { - return &ValidationError{Name: "uri", err: errors.New(`ent: missing required field "ServerMetadata.uri"`)} - } - if v, ok := smc.mutation.URI(); ok { - if err := servermetadata.URIValidator(v); err != nil { - return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.uri": %w`, err)} - } - } - if _, ok := smc.mutation.Extensions(); !ok { - return &ValidationError{Name: "extensions", err: errors.New(`ent: missing required field "ServerMetadata.extensions"`)} - } - if _, ok := smc.mutation.CreatedAt(); !ok { - return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "ServerMetadata.created_at"`)} - } - if _, ok := smc.mutation.UpdatedAt(); !ok { - return &ValidationError{Name: "updated_at", err: errors.New(`ent: missing required field "ServerMetadata.updated_at"`)} - } - if _, ok := smc.mutation.Name(); !ok { - return &ValidationError{Name: "name", err: errors.New(`ent: missing required field "ServerMetadata.name"`)} - } - if v, ok := smc.mutation.Name(); ok { - if err := servermetadata.NameValidator(v); err != nil { - return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.name": %w`, err)} - } - } - if _, ok := smc.mutation.Version(); !ok { - return &ValidationError{Name: "version", err: errors.New(`ent: missing required field "ServerMetadata.version"`)} - } - if v, ok := smc.mutation.Version(); ok { - if err := servermetadata.VersionValidator(v); err != nil { - return &ValidationError{Name: "version", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.version": %w`, err)} - } - } - if _, ok := smc.mutation.SupportedExtensions(); !ok { - return &ValidationError{Name: "supportedExtensions", err: errors.New(`ent: missing required field "ServerMetadata.supportedExtensions"`)} - } - if _, ok := smc.mutation.FollowerID(); !ok { - return &ValidationError{Name: "follower", err: errors.New(`ent: missing required edge "ServerMetadata.follower"`)} - } - if _, ok := smc.mutation.FolloweeID(); !ok { - return &ValidationError{Name: "followee", err: errors.New(`ent: missing required edge "ServerMetadata.followee"`)} - } - return nil -} - -func (smc *ServerMetadataCreate) sqlSave(ctx context.Context) (*ServerMetadata, error) { - if err := smc.check(); err != nil { - return nil, err - } - _node, _spec := smc.createSpec() - if err := sqlgraph.CreateNode(ctx, smc.driver, _spec); err != nil { - if sqlgraph.IsConstraintError(err) { - err = &ConstraintError{msg: err.Error(), wrap: err} - } - return nil, err - } - if _spec.ID.Value != nil { - if id, ok := _spec.ID.Value.(*uuid.UUID); ok { - _node.ID = *id - } else if err := _node.ID.Scan(_spec.ID.Value); err != nil { - return nil, err - } - } - smc.mutation.id = &_node.ID - smc.mutation.done = true - return _node, nil -} - -func (smc *ServerMetadataCreate) createSpec() (*ServerMetadata, *sqlgraph.CreateSpec) { - var ( - _node = &ServerMetadata{config: smc.config} - _spec = sqlgraph.NewCreateSpec(servermetadata.Table, sqlgraph.NewFieldSpec(servermetadata.FieldID, field.TypeUUID)) - ) - _spec.OnConflict = smc.conflict - if id, ok := smc.mutation.ID(); ok { - _node.ID = id - _spec.ID.Value = &id - } - if value, ok := smc.mutation.IsRemote(); ok { - _spec.SetField(servermetadata.FieldIsRemote, field.TypeBool, value) - _node.IsRemote = value - } - if value, ok := smc.mutation.URI(); ok { - _spec.SetField(servermetadata.FieldURI, field.TypeString, value) - _node.URI = value - } - if value, ok := smc.mutation.Extensions(); ok { - _spec.SetField(servermetadata.FieldExtensions, field.TypeJSON, value) - _node.Extensions = value - } - if value, ok := smc.mutation.CreatedAt(); ok { - _spec.SetField(servermetadata.FieldCreatedAt, field.TypeTime, value) - _node.CreatedAt = value - } - if value, ok := smc.mutation.UpdatedAt(); ok { - _spec.SetField(servermetadata.FieldUpdatedAt, field.TypeTime, value) - _node.UpdatedAt = value - } - if value, ok := smc.mutation.Name(); ok { - _spec.SetField(servermetadata.FieldName, field.TypeString, value) - _node.Name = value - } - if value, ok := smc.mutation.Description(); ok { - _spec.SetField(servermetadata.FieldDescription, field.TypeString, value) - _node.Description = &value - } - if value, ok := smc.mutation.Version(); ok { - _spec.SetField(servermetadata.FieldVersion, field.TypeString, value) - _node.Version = value - } - if value, ok := smc.mutation.SupportedExtensions(); ok { - _spec.SetField(servermetadata.FieldSupportedExtensions, field.TypeJSON, value) - _node.SupportedExtensions = value - } - if nodes := smc.mutation.FollowerIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FollowerTable, - Columns: []string{servermetadata.FollowerColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _node.server_metadata_follower = &nodes[0] - _spec.Edges = append(_spec.Edges, edge) - } - if nodes := smc.mutation.FolloweeIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FolloweeTable, - Columns: []string{servermetadata.FolloweeColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _node.server_metadata_followee = &nodes[0] - _spec.Edges = append(_spec.Edges, edge) - } - return _node, _spec -} - -// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause -// of the `INSERT` statement. For example: -// -// client.ServerMetadata.Create(). -// SetIsRemote(v). -// OnConflict( -// // Update the row with the new values -// // the was proposed for insertion. -// sql.ResolveWithNewValues(), -// ). -// // Override some of the fields with custom -// // update values. -// Update(func(u *ent.ServerMetadataUpsert) { -// SetIsRemote(v+v). -// }). -// Exec(ctx) -func (smc *ServerMetadataCreate) OnConflict(opts ...sql.ConflictOption) *ServerMetadataUpsertOne { - smc.conflict = opts - return &ServerMetadataUpsertOne{ - create: smc, - } -} - -// OnConflictColumns calls `OnConflict` and configures the columns -// as conflict target. Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict(sql.ConflictColumns(columns...)). -// Exec(ctx) -func (smc *ServerMetadataCreate) OnConflictColumns(columns ...string) *ServerMetadataUpsertOne { - smc.conflict = append(smc.conflict, sql.ConflictColumns(columns...)) - return &ServerMetadataUpsertOne{ - create: smc, - } -} - -type ( - // ServerMetadataUpsertOne is the builder for "upsert"-ing - // one ServerMetadata node. - ServerMetadataUpsertOne struct { - create *ServerMetadataCreate - } - - // ServerMetadataUpsert is the "OnConflict" setter. - ServerMetadataUpsert struct { - *sql.UpdateSet - } -) - -// SetIsRemote sets the "isRemote" field. -func (u *ServerMetadataUpsert) SetIsRemote(v bool) *ServerMetadataUpsert { - u.Set(servermetadata.FieldIsRemote, v) - return u -} - -// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateIsRemote() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldIsRemote) - return u -} - -// SetURI sets the "uri" field. -func (u *ServerMetadataUpsert) SetURI(v string) *ServerMetadataUpsert { - u.Set(servermetadata.FieldURI, v) - return u -} - -// UpdateURI sets the "uri" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateURI() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldURI) - return u -} - -// SetExtensions sets the "extensions" field. -func (u *ServerMetadataUpsert) SetExtensions(v lysand.Extensions) *ServerMetadataUpsert { - u.Set(servermetadata.FieldExtensions, v) - return u -} - -// UpdateExtensions sets the "extensions" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateExtensions() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldExtensions) - return u -} - -// SetUpdatedAt sets the "updated_at" field. -func (u *ServerMetadataUpsert) SetUpdatedAt(v time.Time) *ServerMetadataUpsert { - u.Set(servermetadata.FieldUpdatedAt, v) - return u -} - -// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateUpdatedAt() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldUpdatedAt) - return u -} - -// SetName sets the "name" field. -func (u *ServerMetadataUpsert) SetName(v string) *ServerMetadataUpsert { - u.Set(servermetadata.FieldName, v) - return u -} - -// UpdateName sets the "name" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateName() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldName) - return u -} - -// SetDescription sets the "description" field. -func (u *ServerMetadataUpsert) SetDescription(v string) *ServerMetadataUpsert { - u.Set(servermetadata.FieldDescription, v) - return u -} - -// UpdateDescription sets the "description" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateDescription() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldDescription) - return u -} - -// ClearDescription clears the value of the "description" field. -func (u *ServerMetadataUpsert) ClearDescription() *ServerMetadataUpsert { - u.SetNull(servermetadata.FieldDescription) - return u -} - -// SetVersion sets the "version" field. -func (u *ServerMetadataUpsert) SetVersion(v string) *ServerMetadataUpsert { - u.Set(servermetadata.FieldVersion, v) - return u -} - -// UpdateVersion sets the "version" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateVersion() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldVersion) - return u -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (u *ServerMetadataUpsert) SetSupportedExtensions(v []string) *ServerMetadataUpsert { - u.Set(servermetadata.FieldSupportedExtensions, v) - return u -} - -// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. -func (u *ServerMetadataUpsert) UpdateSupportedExtensions() *ServerMetadataUpsert { - u.SetExcluded(servermetadata.FieldSupportedExtensions) - return u -} - -// UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field. -// Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict( -// sql.ResolveWithNewValues(), -// sql.ResolveWith(func(u *sql.UpdateSet) { -// u.SetIgnore(servermetadata.FieldID) -// }), -// ). -// Exec(ctx) -func (u *ServerMetadataUpsertOne) UpdateNewValues() *ServerMetadataUpsertOne { - u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) - u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { - if _, exists := u.create.mutation.ID(); exists { - s.SetIgnore(servermetadata.FieldID) - } - if _, exists := u.create.mutation.CreatedAt(); exists { - s.SetIgnore(servermetadata.FieldCreatedAt) - } - })) - return u -} - -// Ignore sets each column to itself in case of conflict. -// Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict(sql.ResolveWithIgnore()). -// Exec(ctx) -func (u *ServerMetadataUpsertOne) Ignore() *ServerMetadataUpsertOne { - u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) - return u -} - -// DoNothing configures the conflict_action to `DO NOTHING`. -// Supported only by SQLite and PostgreSQL. -func (u *ServerMetadataUpsertOne) DoNothing() *ServerMetadataUpsertOne { - u.create.conflict = append(u.create.conflict, sql.DoNothing()) - return u -} - -// Update allows overriding fields `UPDATE` values. See the ServerMetadataCreate.OnConflict -// documentation for more info. -func (u *ServerMetadataUpsertOne) Update(set func(*ServerMetadataUpsert)) *ServerMetadataUpsertOne { - u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { - set(&ServerMetadataUpsert{UpdateSet: update}) - })) - return u -} - -// SetIsRemote sets the "isRemote" field. -func (u *ServerMetadataUpsertOne) SetIsRemote(v bool) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetIsRemote(v) - }) -} - -// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateIsRemote() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateIsRemote() - }) -} - -// SetURI sets the "uri" field. -func (u *ServerMetadataUpsertOne) SetURI(v string) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetURI(v) - }) -} - -// UpdateURI sets the "uri" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateURI() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateURI() - }) -} - -// SetExtensions sets the "extensions" field. -func (u *ServerMetadataUpsertOne) SetExtensions(v lysand.Extensions) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetExtensions(v) - }) -} - -// UpdateExtensions sets the "extensions" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateExtensions() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateExtensions() - }) -} - -// SetUpdatedAt sets the "updated_at" field. -func (u *ServerMetadataUpsertOne) SetUpdatedAt(v time.Time) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetUpdatedAt(v) - }) -} - -// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateUpdatedAt() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateUpdatedAt() - }) -} - -// SetName sets the "name" field. -func (u *ServerMetadataUpsertOne) SetName(v string) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetName(v) - }) -} - -// UpdateName sets the "name" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateName() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateName() - }) -} - -// SetDescription sets the "description" field. -func (u *ServerMetadataUpsertOne) SetDescription(v string) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetDescription(v) - }) -} - -// UpdateDescription sets the "description" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateDescription() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateDescription() - }) -} - -// ClearDescription clears the value of the "description" field. -func (u *ServerMetadataUpsertOne) ClearDescription() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.ClearDescription() - }) -} - -// SetVersion sets the "version" field. -func (u *ServerMetadataUpsertOne) SetVersion(v string) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetVersion(v) - }) -} - -// UpdateVersion sets the "version" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateVersion() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateVersion() - }) -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (u *ServerMetadataUpsertOne) SetSupportedExtensions(v []string) *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetSupportedExtensions(v) - }) -} - -// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. -func (u *ServerMetadataUpsertOne) UpdateSupportedExtensions() *ServerMetadataUpsertOne { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateSupportedExtensions() - }) -} - -// Exec executes the query. -func (u *ServerMetadataUpsertOne) Exec(ctx context.Context) error { - if len(u.create.conflict) == 0 { - return errors.New("ent: missing options for ServerMetadataCreate.OnConflict") - } - return u.create.Exec(ctx) -} - -// ExecX is like Exec, but panics if an error occurs. -func (u *ServerMetadataUpsertOne) ExecX(ctx context.Context) { - if err := u.create.Exec(ctx); err != nil { - panic(err) - } -} - -// Exec executes the UPSERT query and returns the inserted/updated ID. -func (u *ServerMetadataUpsertOne) ID(ctx context.Context) (id uuid.UUID, err error) { - if u.create.driver.Dialect() == dialect.MySQL { - // In case of "ON CONFLICT", there is no way to get back non-numeric ID - // fields from the database since MySQL does not support the RETURNING clause. - return id, errors.New("ent: ServerMetadataUpsertOne.ID is not supported by MySQL driver. Use ServerMetadataUpsertOne.Exec instead") - } - node, err := u.create.Save(ctx) - if err != nil { - return id, err - } - return node.ID, nil -} - -// IDX is like ID, but panics if an error occurs. -func (u *ServerMetadataUpsertOne) IDX(ctx context.Context) uuid.UUID { - id, err := u.ID(ctx) - if err != nil { - panic(err) - } - return id -} - -// ServerMetadataCreateBulk is the builder for creating many ServerMetadata entities in bulk. -type ServerMetadataCreateBulk struct { - config - err error - builders []*ServerMetadataCreate - conflict []sql.ConflictOption -} - -// Save creates the ServerMetadata entities in the database. -func (smcb *ServerMetadataCreateBulk) Save(ctx context.Context) ([]*ServerMetadata, error) { - if smcb.err != nil { - return nil, smcb.err - } - specs := make([]*sqlgraph.CreateSpec, len(smcb.builders)) - nodes := make([]*ServerMetadata, len(smcb.builders)) - mutators := make([]Mutator, len(smcb.builders)) - for i := range smcb.builders { - func(i int, root context.Context) { - builder := smcb.builders[i] - builder.defaults() - var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) { - mutation, ok := m.(*ServerMetadataMutation) - if !ok { - return nil, fmt.Errorf("unexpected mutation type %T", m) - } - if err := builder.check(); err != nil { - return nil, err - } - builder.mutation = mutation - var err error - nodes[i], specs[i] = builder.createSpec() - if i < len(mutators)-1 { - _, err = mutators[i+1].Mutate(root, smcb.builders[i+1].mutation) - } else { - spec := &sqlgraph.BatchCreateSpec{Nodes: specs} - spec.OnConflict = smcb.conflict - // Invoke the actual operation on the latest mutation in the chain. - if err = sqlgraph.BatchCreate(ctx, smcb.driver, spec); err != nil { - if sqlgraph.IsConstraintError(err) { - err = &ConstraintError{msg: err.Error(), wrap: err} - } - } - } - if err != nil { - return nil, err - } - mutation.id = &nodes[i].ID - mutation.done = true - return nodes[i], nil - }) - for i := len(builder.hooks) - 1; i >= 0; i-- { - mut = builder.hooks[i](mut) - } - mutators[i] = mut - }(i, ctx) - } - if len(mutators) > 0 { - if _, err := mutators[0].Mutate(ctx, smcb.builders[0].mutation); err != nil { - return nil, err - } - } - return nodes, nil -} - -// SaveX is like Save, but panics if an error occurs. -func (smcb *ServerMetadataCreateBulk) SaveX(ctx context.Context) []*ServerMetadata { - v, err := smcb.Save(ctx) - if err != nil { - panic(err) - } - return v -} - -// Exec executes the query. -func (smcb *ServerMetadataCreateBulk) Exec(ctx context.Context) error { - _, err := smcb.Save(ctx) - return err -} - -// ExecX is like Exec, but panics if an error occurs. -func (smcb *ServerMetadataCreateBulk) ExecX(ctx context.Context) { - if err := smcb.Exec(ctx); err != nil { - panic(err) - } -} - -// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause -// of the `INSERT` statement. For example: -// -// client.ServerMetadata.CreateBulk(builders...). -// OnConflict( -// // Update the row with the new values -// // the was proposed for insertion. -// sql.ResolveWithNewValues(), -// ). -// // Override some of the fields with custom -// // update values. -// Update(func(u *ent.ServerMetadataUpsert) { -// SetIsRemote(v+v). -// }). -// Exec(ctx) -func (smcb *ServerMetadataCreateBulk) OnConflict(opts ...sql.ConflictOption) *ServerMetadataUpsertBulk { - smcb.conflict = opts - return &ServerMetadataUpsertBulk{ - create: smcb, - } -} - -// OnConflictColumns calls `OnConflict` and configures the columns -// as conflict target. Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict(sql.ConflictColumns(columns...)). -// Exec(ctx) -func (smcb *ServerMetadataCreateBulk) OnConflictColumns(columns ...string) *ServerMetadataUpsertBulk { - smcb.conflict = append(smcb.conflict, sql.ConflictColumns(columns...)) - return &ServerMetadataUpsertBulk{ - create: smcb, - } -} - -// ServerMetadataUpsertBulk is the builder for "upsert"-ing -// a bulk of ServerMetadata nodes. -type ServerMetadataUpsertBulk struct { - create *ServerMetadataCreateBulk -} - -// UpdateNewValues updates the mutable fields using the new values that -// were set on create. Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict( -// sql.ResolveWithNewValues(), -// sql.ResolveWith(func(u *sql.UpdateSet) { -// u.SetIgnore(servermetadata.FieldID) -// }), -// ). -// Exec(ctx) -func (u *ServerMetadataUpsertBulk) UpdateNewValues() *ServerMetadataUpsertBulk { - u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) - u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { - for _, b := range u.create.builders { - if _, exists := b.mutation.ID(); exists { - s.SetIgnore(servermetadata.FieldID) - } - if _, exists := b.mutation.CreatedAt(); exists { - s.SetIgnore(servermetadata.FieldCreatedAt) - } - } - })) - return u -} - -// Ignore sets each column to itself in case of conflict. -// Using this option is equivalent to using: -// -// client.ServerMetadata.Create(). -// OnConflict(sql.ResolveWithIgnore()). -// Exec(ctx) -func (u *ServerMetadataUpsertBulk) Ignore() *ServerMetadataUpsertBulk { - u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) - return u -} - -// DoNothing configures the conflict_action to `DO NOTHING`. -// Supported only by SQLite and PostgreSQL. -func (u *ServerMetadataUpsertBulk) DoNothing() *ServerMetadataUpsertBulk { - u.create.conflict = append(u.create.conflict, sql.DoNothing()) - return u -} - -// Update allows overriding fields `UPDATE` values. See the ServerMetadataCreateBulk.OnConflict -// documentation for more info. -func (u *ServerMetadataUpsertBulk) Update(set func(*ServerMetadataUpsert)) *ServerMetadataUpsertBulk { - u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { - set(&ServerMetadataUpsert{UpdateSet: update}) - })) - return u -} - -// SetIsRemote sets the "isRemote" field. -func (u *ServerMetadataUpsertBulk) SetIsRemote(v bool) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetIsRemote(v) - }) -} - -// UpdateIsRemote sets the "isRemote" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateIsRemote() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateIsRemote() - }) -} - -// SetURI sets the "uri" field. -func (u *ServerMetadataUpsertBulk) SetURI(v string) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetURI(v) - }) -} - -// UpdateURI sets the "uri" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateURI() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateURI() - }) -} - -// SetExtensions sets the "extensions" field. -func (u *ServerMetadataUpsertBulk) SetExtensions(v lysand.Extensions) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetExtensions(v) - }) -} - -// UpdateExtensions sets the "extensions" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateExtensions() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateExtensions() - }) -} - -// SetUpdatedAt sets the "updated_at" field. -func (u *ServerMetadataUpsertBulk) SetUpdatedAt(v time.Time) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetUpdatedAt(v) - }) -} - -// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateUpdatedAt() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateUpdatedAt() - }) -} - -// SetName sets the "name" field. -func (u *ServerMetadataUpsertBulk) SetName(v string) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetName(v) - }) -} - -// UpdateName sets the "name" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateName() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateName() - }) -} - -// SetDescription sets the "description" field. -func (u *ServerMetadataUpsertBulk) SetDescription(v string) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetDescription(v) - }) -} - -// UpdateDescription sets the "description" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateDescription() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateDescription() - }) -} - -// ClearDescription clears the value of the "description" field. -func (u *ServerMetadataUpsertBulk) ClearDescription() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.ClearDescription() - }) -} - -// SetVersion sets the "version" field. -func (u *ServerMetadataUpsertBulk) SetVersion(v string) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetVersion(v) - }) -} - -// UpdateVersion sets the "version" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateVersion() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateVersion() - }) -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (u *ServerMetadataUpsertBulk) SetSupportedExtensions(v []string) *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.SetSupportedExtensions(v) - }) -} - -// UpdateSupportedExtensions sets the "supportedExtensions" field to the value that was provided on create. -func (u *ServerMetadataUpsertBulk) UpdateSupportedExtensions() *ServerMetadataUpsertBulk { - return u.Update(func(s *ServerMetadataUpsert) { - s.UpdateSupportedExtensions() - }) -} - -// Exec executes the query. -func (u *ServerMetadataUpsertBulk) Exec(ctx context.Context) error { - if u.create.err != nil { - return u.create.err - } - for i, b := range u.create.builders { - if len(b.conflict) != 0 { - return fmt.Errorf("ent: OnConflict was set for builder %d. Set it on the ServerMetadataCreateBulk instead", i) - } - } - if len(u.create.conflict) == 0 { - return errors.New("ent: missing options for ServerMetadataCreateBulk.OnConflict") - } - return u.create.Exec(ctx) -} - -// ExecX is like Exec, but panics if an error occurs. -func (u *ServerMetadataUpsertBulk) ExecX(ctx context.Context) { - if err := u.create.Exec(ctx); err != nil { - panic(err) - } -} diff --git a/ent/servermetadata_delete.go b/ent/servermetadata_delete.go deleted file mode 100644 index 47880c9..0000000 --- a/ent/servermetadata_delete.go +++ /dev/null @@ -1,88 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package ent - -import ( - "context" - - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "entgo.io/ent/schema/field" - "github.com/lysand-org/versia-go/ent/predicate" - "github.com/lysand-org/versia-go/ent/servermetadata" -) - -// ServerMetadataDelete is the builder for deleting a ServerMetadata entity. -type ServerMetadataDelete struct { - config - hooks []Hook - mutation *ServerMetadataMutation -} - -// Where appends a list predicates to the ServerMetadataDelete builder. -func (smd *ServerMetadataDelete) Where(ps ...predicate.ServerMetadata) *ServerMetadataDelete { - smd.mutation.Where(ps...) - return smd -} - -// Exec executes the deletion query and returns how many vertices were deleted. -func (smd *ServerMetadataDelete) Exec(ctx context.Context) (int, error) { - return withHooks(ctx, smd.sqlExec, smd.mutation, smd.hooks) -} - -// ExecX is like Exec, but panics if an error occurs. -func (smd *ServerMetadataDelete) ExecX(ctx context.Context) int { - n, err := smd.Exec(ctx) - if err != nil { - panic(err) - } - return n -} - -func (smd *ServerMetadataDelete) sqlExec(ctx context.Context) (int, error) { - _spec := sqlgraph.NewDeleteSpec(servermetadata.Table, sqlgraph.NewFieldSpec(servermetadata.FieldID, field.TypeUUID)) - if ps := smd.mutation.predicates; len(ps) > 0 { - _spec.Predicate = func(selector *sql.Selector) { - for i := range ps { - ps[i](selector) - } - } - } - affected, err := sqlgraph.DeleteNodes(ctx, smd.driver, _spec) - if err != nil && sqlgraph.IsConstraintError(err) { - err = &ConstraintError{msg: err.Error(), wrap: err} - } - smd.mutation.done = true - return affected, err -} - -// ServerMetadataDeleteOne is the builder for deleting a single ServerMetadata entity. -type ServerMetadataDeleteOne struct { - smd *ServerMetadataDelete -} - -// Where appends a list predicates to the ServerMetadataDelete builder. -func (smdo *ServerMetadataDeleteOne) Where(ps ...predicate.ServerMetadata) *ServerMetadataDeleteOne { - smdo.smd.mutation.Where(ps...) - return smdo -} - -// Exec executes the deletion query. -func (smdo *ServerMetadataDeleteOne) Exec(ctx context.Context) error { - n, err := smdo.smd.Exec(ctx) - switch { - case err != nil: - return err - case n == 0: - return &NotFoundError{servermetadata.Label} - default: - return nil - } -} - -// ExecX is like Exec, but panics if an error occurs. -func (smdo *ServerMetadataDeleteOne) ExecX(ctx context.Context) { - if err := smdo.Exec(ctx); err != nil { - panic(err) - } -} diff --git a/ent/servermetadata_query.go b/ent/servermetadata_query.go deleted file mode 100644 index 48ec4ca..0000000 --- a/ent/servermetadata_query.go +++ /dev/null @@ -1,688 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package ent - -import ( - "context" - "fmt" - "math" - - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "entgo.io/ent/schema/field" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/ent/predicate" - "github.com/lysand-org/versia-go/ent/servermetadata" - "github.com/lysand-org/versia-go/ent/user" -) - -// ServerMetadataQuery is the builder for querying ServerMetadata entities. -type ServerMetadataQuery struct { - config - ctx *QueryContext - order []servermetadata.OrderOption - inters []Interceptor - predicates []predicate.ServerMetadata - withFollower *UserQuery - withFollowee *UserQuery - withFKs bool - // intermediate query (i.e. traversal path). - sql *sql.Selector - path func(context.Context) (*sql.Selector, error) -} - -// Where adds a new predicate for the ServerMetadataQuery builder. -func (smq *ServerMetadataQuery) Where(ps ...predicate.ServerMetadata) *ServerMetadataQuery { - smq.predicates = append(smq.predicates, ps...) - return smq -} - -// Limit the number of records to be returned by this query. -func (smq *ServerMetadataQuery) Limit(limit int) *ServerMetadataQuery { - smq.ctx.Limit = &limit - return smq -} - -// Offset to start from. -func (smq *ServerMetadataQuery) Offset(offset int) *ServerMetadataQuery { - smq.ctx.Offset = &offset - return smq -} - -// Unique configures the query builder to filter duplicate records on query. -// By default, unique is set to true, and can be disabled using this method. -func (smq *ServerMetadataQuery) Unique(unique bool) *ServerMetadataQuery { - smq.ctx.Unique = &unique - return smq -} - -// Order specifies how the records should be ordered. -func (smq *ServerMetadataQuery) Order(o ...servermetadata.OrderOption) *ServerMetadataQuery { - smq.order = append(smq.order, o...) - return smq -} - -// QueryFollower chains the current query on the "follower" edge. -func (smq *ServerMetadataQuery) QueryFollower() *UserQuery { - query := (&UserClient{config: smq.config}).Query() - query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { - if err := smq.prepareQuery(ctx); err != nil { - return nil, err - } - selector := smq.sqlQuery(ctx) - if err := selector.Err(); err != nil { - return nil, err - } - step := sqlgraph.NewStep( - sqlgraph.From(servermetadata.Table, servermetadata.FieldID, selector), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, servermetadata.FollowerTable, servermetadata.FollowerColumn), - ) - fromU = sqlgraph.SetNeighbors(smq.driver.Dialect(), step) - return fromU, nil - } - return query -} - -// QueryFollowee chains the current query on the "followee" edge. -func (smq *ServerMetadataQuery) QueryFollowee() *UserQuery { - query := (&UserClient{config: smq.config}).Query() - query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { - if err := smq.prepareQuery(ctx); err != nil { - return nil, err - } - selector := smq.sqlQuery(ctx) - if err := selector.Err(); err != nil { - return nil, err - } - step := sqlgraph.NewStep( - sqlgraph.From(servermetadata.Table, servermetadata.FieldID, selector), - sqlgraph.To(user.Table, user.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, servermetadata.FolloweeTable, servermetadata.FolloweeColumn), - ) - fromU = sqlgraph.SetNeighbors(smq.driver.Dialect(), step) - return fromU, nil - } - return query -} - -// First returns the first ServerMetadata entity from the query. -// Returns a *NotFoundError when no ServerMetadata was found. -func (smq *ServerMetadataQuery) First(ctx context.Context) (*ServerMetadata, error) { - nodes, err := smq.Limit(1).All(setContextOp(ctx, smq.ctx, "First")) - if err != nil { - return nil, err - } - if len(nodes) == 0 { - return nil, &NotFoundError{servermetadata.Label} - } - return nodes[0], nil -} - -// FirstX is like First, but panics if an error occurs. -func (smq *ServerMetadataQuery) FirstX(ctx context.Context) *ServerMetadata { - node, err := smq.First(ctx) - if err != nil && !IsNotFound(err) { - panic(err) - } - return node -} - -// FirstID returns the first ServerMetadata ID from the query. -// Returns a *NotFoundError when no ServerMetadata ID was found. -func (smq *ServerMetadataQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) { - var ids []uuid.UUID - if ids, err = smq.Limit(1).IDs(setContextOp(ctx, smq.ctx, "FirstID")); err != nil { - return - } - if len(ids) == 0 { - err = &NotFoundError{servermetadata.Label} - return - } - return ids[0], nil -} - -// FirstIDX is like FirstID, but panics if an error occurs. -func (smq *ServerMetadataQuery) FirstIDX(ctx context.Context) uuid.UUID { - id, err := smq.FirstID(ctx) - if err != nil && !IsNotFound(err) { - panic(err) - } - return id -} - -// Only returns a single ServerMetadata entity found by the query, ensuring it only returns one. -// Returns a *NotSingularError when more than one ServerMetadata entity is found. -// Returns a *NotFoundError when no ServerMetadata entities are found. -func (smq *ServerMetadataQuery) Only(ctx context.Context) (*ServerMetadata, error) { - nodes, err := smq.Limit(2).All(setContextOp(ctx, smq.ctx, "Only")) - if err != nil { - return nil, err - } - switch len(nodes) { - case 1: - return nodes[0], nil - case 0: - return nil, &NotFoundError{servermetadata.Label} - default: - return nil, &NotSingularError{servermetadata.Label} - } -} - -// OnlyX is like Only, but panics if an error occurs. -func (smq *ServerMetadataQuery) OnlyX(ctx context.Context) *ServerMetadata { - node, err := smq.Only(ctx) - if err != nil { - panic(err) - } - return node -} - -// OnlyID is like Only, but returns the only ServerMetadata ID in the query. -// Returns a *NotSingularError when more than one ServerMetadata ID is found. -// Returns a *NotFoundError when no entities are found. -func (smq *ServerMetadataQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) { - var ids []uuid.UUID - if ids, err = smq.Limit(2).IDs(setContextOp(ctx, smq.ctx, "OnlyID")); err != nil { - return - } - switch len(ids) { - case 1: - id = ids[0] - case 0: - err = &NotFoundError{servermetadata.Label} - default: - err = &NotSingularError{servermetadata.Label} - } - return -} - -// OnlyIDX is like OnlyID, but panics if an error occurs. -func (smq *ServerMetadataQuery) OnlyIDX(ctx context.Context) uuid.UUID { - id, err := smq.OnlyID(ctx) - if err != nil { - panic(err) - } - return id -} - -// All executes the query and returns a list of ServerMetadataSlice. -func (smq *ServerMetadataQuery) All(ctx context.Context) ([]*ServerMetadata, error) { - ctx = setContextOp(ctx, smq.ctx, "All") - if err := smq.prepareQuery(ctx); err != nil { - return nil, err - } - qr := querierAll[[]*ServerMetadata, *ServerMetadataQuery]() - return withInterceptors[[]*ServerMetadata](ctx, smq, qr, smq.inters) -} - -// AllX is like All, but panics if an error occurs. -func (smq *ServerMetadataQuery) AllX(ctx context.Context) []*ServerMetadata { - nodes, err := smq.All(ctx) - if err != nil { - panic(err) - } - return nodes -} - -// IDs executes the query and returns a list of ServerMetadata IDs. -func (smq *ServerMetadataQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) { - if smq.ctx.Unique == nil && smq.path != nil { - smq.Unique(true) - } - ctx = setContextOp(ctx, smq.ctx, "IDs") - if err = smq.Select(servermetadata.FieldID).Scan(ctx, &ids); err != nil { - return nil, err - } - return ids, nil -} - -// IDsX is like IDs, but panics if an error occurs. -func (smq *ServerMetadataQuery) IDsX(ctx context.Context) []uuid.UUID { - ids, err := smq.IDs(ctx) - if err != nil { - panic(err) - } - return ids -} - -// Count returns the count of the given query. -func (smq *ServerMetadataQuery) Count(ctx context.Context) (int, error) { - ctx = setContextOp(ctx, smq.ctx, "Count") - if err := smq.prepareQuery(ctx); err != nil { - return 0, err - } - return withInterceptors[int](ctx, smq, querierCount[*ServerMetadataQuery](), smq.inters) -} - -// CountX is like Count, but panics if an error occurs. -func (smq *ServerMetadataQuery) CountX(ctx context.Context) int { - count, err := smq.Count(ctx) - if err != nil { - panic(err) - } - return count -} - -// Exist returns true if the query has elements in the graph. -func (smq *ServerMetadataQuery) Exist(ctx context.Context) (bool, error) { - ctx = setContextOp(ctx, smq.ctx, "Exist") - switch _, err := smq.FirstID(ctx); { - case IsNotFound(err): - return false, nil - case err != nil: - return false, fmt.Errorf("ent: check existence: %w", err) - default: - return true, nil - } -} - -// ExistX is like Exist, but panics if an error occurs. -func (smq *ServerMetadataQuery) ExistX(ctx context.Context) bool { - exist, err := smq.Exist(ctx) - if err != nil { - panic(err) - } - return exist -} - -// Clone returns a duplicate of the ServerMetadataQuery builder, including all associated steps. It can be -// used to prepare common query builders and use them differently after the clone is made. -func (smq *ServerMetadataQuery) Clone() *ServerMetadataQuery { - if smq == nil { - return nil - } - return &ServerMetadataQuery{ - config: smq.config, - ctx: smq.ctx.Clone(), - order: append([]servermetadata.OrderOption{}, smq.order...), - inters: append([]Interceptor{}, smq.inters...), - predicates: append([]predicate.ServerMetadata{}, smq.predicates...), - withFollower: smq.withFollower.Clone(), - withFollowee: smq.withFollowee.Clone(), - // clone intermediate query. - sql: smq.sql.Clone(), - path: smq.path, - } -} - -// WithFollower tells the query-builder to eager-load the nodes that are connected to -// the "follower" edge. The optional arguments are used to configure the query builder of the edge. -func (smq *ServerMetadataQuery) WithFollower(opts ...func(*UserQuery)) *ServerMetadataQuery { - query := (&UserClient{config: smq.config}).Query() - for _, opt := range opts { - opt(query) - } - smq.withFollower = query - return smq -} - -// WithFollowee tells the query-builder to eager-load the nodes that are connected to -// the "followee" edge. The optional arguments are used to configure the query builder of the edge. -func (smq *ServerMetadataQuery) WithFollowee(opts ...func(*UserQuery)) *ServerMetadataQuery { - query := (&UserClient{config: smq.config}).Query() - for _, opt := range opts { - opt(query) - } - smq.withFollowee = query - return smq -} - -// GroupBy is used to group vertices by one or more fields/columns. -// It is often used with aggregate functions, like: count, max, mean, min, sum. -// -// Example: -// -// var v []struct { -// IsRemote bool `json:"isRemote,omitempty"` -// Count int `json:"count,omitempty"` -// } -// -// client.ServerMetadata.Query(). -// GroupBy(servermetadata.FieldIsRemote). -// Aggregate(ent.Count()). -// Scan(ctx, &v) -func (smq *ServerMetadataQuery) GroupBy(field string, fields ...string) *ServerMetadataGroupBy { - smq.ctx.Fields = append([]string{field}, fields...) - grbuild := &ServerMetadataGroupBy{build: smq} - grbuild.flds = &smq.ctx.Fields - grbuild.label = servermetadata.Label - grbuild.scan = grbuild.Scan - return grbuild -} - -// Select allows the selection one or more fields/columns for the given query, -// instead of selecting all fields in the entity. -// -// Example: -// -// var v []struct { -// IsRemote bool `json:"isRemote,omitempty"` -// } -// -// client.ServerMetadata.Query(). -// Select(servermetadata.FieldIsRemote). -// Scan(ctx, &v) -func (smq *ServerMetadataQuery) Select(fields ...string) *ServerMetadataSelect { - smq.ctx.Fields = append(smq.ctx.Fields, fields...) - sbuild := &ServerMetadataSelect{ServerMetadataQuery: smq} - sbuild.label = servermetadata.Label - sbuild.flds, sbuild.scan = &smq.ctx.Fields, sbuild.Scan - return sbuild -} - -// Aggregate returns a ServerMetadataSelect configured with the given aggregations. -func (smq *ServerMetadataQuery) Aggregate(fns ...AggregateFunc) *ServerMetadataSelect { - return smq.Select().Aggregate(fns...) -} - -func (smq *ServerMetadataQuery) prepareQuery(ctx context.Context) error { - for _, inter := range smq.inters { - if inter == nil { - return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)") - } - if trv, ok := inter.(Traverser); ok { - if err := trv.Traverse(ctx, smq); err != nil { - return err - } - } - } - for _, f := range smq.ctx.Fields { - if !servermetadata.ValidColumn(f) { - return &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} - } - } - if smq.path != nil { - prev, err := smq.path(ctx) - if err != nil { - return err - } - smq.sql = prev - } - return nil -} - -func (smq *ServerMetadataQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*ServerMetadata, error) { - var ( - nodes = []*ServerMetadata{} - withFKs = smq.withFKs - _spec = smq.querySpec() - loadedTypes = [2]bool{ - smq.withFollower != nil, - smq.withFollowee != nil, - } - ) - if smq.withFollower != nil || smq.withFollowee != nil { - withFKs = true - } - if withFKs { - _spec.Node.Columns = append(_spec.Node.Columns, servermetadata.ForeignKeys...) - } - _spec.ScanValues = func(columns []string) ([]any, error) { - return (*ServerMetadata).scanValues(nil, columns) - } - _spec.Assign = func(columns []string, values []any) error { - node := &ServerMetadata{config: smq.config} - nodes = append(nodes, node) - node.Edges.loadedTypes = loadedTypes - return node.assignValues(columns, values) - } - for i := range hooks { - hooks[i](ctx, _spec) - } - if err := sqlgraph.QueryNodes(ctx, smq.driver, _spec); err != nil { - return nil, err - } - if len(nodes) == 0 { - return nodes, nil - } - if query := smq.withFollower; query != nil { - if err := smq.loadFollower(ctx, query, nodes, nil, - func(n *ServerMetadata, e *User) { n.Edges.Follower = e }); err != nil { - return nil, err - } - } - if query := smq.withFollowee; query != nil { - if err := smq.loadFollowee(ctx, query, nodes, nil, - func(n *ServerMetadata, e *User) { n.Edges.Followee = e }); err != nil { - return nil, err - } - } - return nodes, nil -} - -func (smq *ServerMetadataQuery) loadFollower(ctx context.Context, query *UserQuery, nodes []*ServerMetadata, init func(*ServerMetadata), assign func(*ServerMetadata, *User)) error { - ids := make([]uuid.UUID, 0, len(nodes)) - nodeids := make(map[uuid.UUID][]*ServerMetadata) - for i := range nodes { - if nodes[i].server_metadata_follower == nil { - continue - } - fk := *nodes[i].server_metadata_follower - if _, ok := nodeids[fk]; !ok { - ids = append(ids, fk) - } - nodeids[fk] = append(nodeids[fk], nodes[i]) - } - if len(ids) == 0 { - return nil - } - query.Where(user.IDIn(ids...)) - neighbors, err := query.All(ctx) - if err != nil { - return err - } - for _, n := range neighbors { - nodes, ok := nodeids[n.ID] - if !ok { - return fmt.Errorf(`unexpected foreign-key "server_metadata_follower" returned %v`, n.ID) - } - for i := range nodes { - assign(nodes[i], n) - } - } - return nil -} -func (smq *ServerMetadataQuery) loadFollowee(ctx context.Context, query *UserQuery, nodes []*ServerMetadata, init func(*ServerMetadata), assign func(*ServerMetadata, *User)) error { - ids := make([]uuid.UUID, 0, len(nodes)) - nodeids := make(map[uuid.UUID][]*ServerMetadata) - for i := range nodes { - if nodes[i].server_metadata_followee == nil { - continue - } - fk := *nodes[i].server_metadata_followee - if _, ok := nodeids[fk]; !ok { - ids = append(ids, fk) - } - nodeids[fk] = append(nodeids[fk], nodes[i]) - } - if len(ids) == 0 { - return nil - } - query.Where(user.IDIn(ids...)) - neighbors, err := query.All(ctx) - if err != nil { - return err - } - for _, n := range neighbors { - nodes, ok := nodeids[n.ID] - if !ok { - return fmt.Errorf(`unexpected foreign-key "server_metadata_followee" returned %v`, n.ID) - } - for i := range nodes { - assign(nodes[i], n) - } - } - return nil -} - -func (smq *ServerMetadataQuery) sqlCount(ctx context.Context) (int, error) { - _spec := smq.querySpec() - _spec.Node.Columns = smq.ctx.Fields - if len(smq.ctx.Fields) > 0 { - _spec.Unique = smq.ctx.Unique != nil && *smq.ctx.Unique - } - return sqlgraph.CountNodes(ctx, smq.driver, _spec) -} - -func (smq *ServerMetadataQuery) querySpec() *sqlgraph.QuerySpec { - _spec := sqlgraph.NewQuerySpec(servermetadata.Table, servermetadata.Columns, sqlgraph.NewFieldSpec(servermetadata.FieldID, field.TypeUUID)) - _spec.From = smq.sql - if unique := smq.ctx.Unique; unique != nil { - _spec.Unique = *unique - } else if smq.path != nil { - _spec.Unique = true - } - if fields := smq.ctx.Fields; len(fields) > 0 { - _spec.Node.Columns = make([]string, 0, len(fields)) - _spec.Node.Columns = append(_spec.Node.Columns, servermetadata.FieldID) - for i := range fields { - if fields[i] != servermetadata.FieldID { - _spec.Node.Columns = append(_spec.Node.Columns, fields[i]) - } - } - } - if ps := smq.predicates; len(ps) > 0 { - _spec.Predicate = func(selector *sql.Selector) { - for i := range ps { - ps[i](selector) - } - } - } - if limit := smq.ctx.Limit; limit != nil { - _spec.Limit = *limit - } - if offset := smq.ctx.Offset; offset != nil { - _spec.Offset = *offset - } - if ps := smq.order; len(ps) > 0 { - _spec.Order = func(selector *sql.Selector) { - for i := range ps { - ps[i](selector) - } - } - } - return _spec -} - -func (smq *ServerMetadataQuery) sqlQuery(ctx context.Context) *sql.Selector { - builder := sql.Dialect(smq.driver.Dialect()) - t1 := builder.Table(servermetadata.Table) - columns := smq.ctx.Fields - if len(columns) == 0 { - columns = servermetadata.Columns - } - selector := builder.Select(t1.Columns(columns...)...).From(t1) - if smq.sql != nil { - selector = smq.sql - selector.Select(selector.Columns(columns...)...) - } - if smq.ctx.Unique != nil && *smq.ctx.Unique { - selector.Distinct() - } - for _, p := range smq.predicates { - p(selector) - } - for _, p := range smq.order { - p(selector) - } - if offset := smq.ctx.Offset; offset != nil { - // limit is mandatory for offset clause. We start - // with default value, and override it below if needed. - selector.Offset(*offset).Limit(math.MaxInt32) - } - if limit := smq.ctx.Limit; limit != nil { - selector.Limit(*limit) - } - return selector -} - -// ServerMetadataGroupBy is the group-by builder for ServerMetadata entities. -type ServerMetadataGroupBy struct { - selector - build *ServerMetadataQuery -} - -// Aggregate adds the given aggregation functions to the group-by query. -func (smgb *ServerMetadataGroupBy) Aggregate(fns ...AggregateFunc) *ServerMetadataGroupBy { - smgb.fns = append(smgb.fns, fns...) - return smgb -} - -// Scan applies the selector query and scans the result into the given value. -func (smgb *ServerMetadataGroupBy) Scan(ctx context.Context, v any) error { - ctx = setContextOp(ctx, smgb.build.ctx, "GroupBy") - if err := smgb.build.prepareQuery(ctx); err != nil { - return err - } - return scanWithInterceptors[*ServerMetadataQuery, *ServerMetadataGroupBy](ctx, smgb.build, smgb, smgb.build.inters, v) -} - -func (smgb *ServerMetadataGroupBy) sqlScan(ctx context.Context, root *ServerMetadataQuery, v any) error { - selector := root.sqlQuery(ctx).Select() - aggregation := make([]string, 0, len(smgb.fns)) - for _, fn := range smgb.fns { - aggregation = append(aggregation, fn(selector)) - } - if len(selector.SelectedColumns()) == 0 { - columns := make([]string, 0, len(*smgb.flds)+len(smgb.fns)) - for _, f := range *smgb.flds { - columns = append(columns, selector.C(f)) - } - columns = append(columns, aggregation...) - selector.Select(columns...) - } - selector.GroupBy(selector.Columns(*smgb.flds...)...) - if err := selector.Err(); err != nil { - return err - } - rows := &sql.Rows{} - query, args := selector.Query() - if err := smgb.build.driver.Query(ctx, query, args, rows); err != nil { - return err - } - defer rows.Close() - return sql.ScanSlice(rows, v) -} - -// ServerMetadataSelect is the builder for selecting fields of ServerMetadata entities. -type ServerMetadataSelect struct { - *ServerMetadataQuery - selector -} - -// Aggregate adds the given aggregation functions to the selector query. -func (sms *ServerMetadataSelect) Aggregate(fns ...AggregateFunc) *ServerMetadataSelect { - sms.fns = append(sms.fns, fns...) - return sms -} - -// Scan applies the selector query and scans the result into the given value. -func (sms *ServerMetadataSelect) Scan(ctx context.Context, v any) error { - ctx = setContextOp(ctx, sms.ctx, "Select") - if err := sms.prepareQuery(ctx); err != nil { - return err - } - return scanWithInterceptors[*ServerMetadataQuery, *ServerMetadataSelect](ctx, sms.ServerMetadataQuery, sms, sms.inters, v) -} - -func (sms *ServerMetadataSelect) sqlScan(ctx context.Context, root *ServerMetadataQuery, v any) error { - selector := root.sqlQuery(ctx) - aggregation := make([]string, 0, len(sms.fns)) - for _, fn := range sms.fns { - aggregation = append(aggregation, fn(selector)) - } - switch n := len(*sms.selector.flds); { - case n == 0 && len(aggregation) > 0: - selector.Select(aggregation...) - case n != 0 && len(aggregation) > 0: - selector.AppendSelect(aggregation...) - } - rows := &sql.Rows{} - query, args := selector.Query() - if err := sms.driver.Query(ctx, query, args, rows); err != nil { - return err - } - defer rows.Close() - return sql.ScanSlice(rows, v) -} diff --git a/ent/servermetadata_update.go b/ent/servermetadata_update.go deleted file mode 100644 index 44c76fd..0000000 --- a/ent/servermetadata_update.go +++ /dev/null @@ -1,704 +0,0 @@ -// Code generated by ent, DO NOT EDIT. - -package ent - -import ( - "context" - "errors" - "fmt" - "time" - - "entgo.io/ent/dialect/sql" - "entgo.io/ent/dialect/sql/sqlgraph" - "entgo.io/ent/dialect/sql/sqljson" - "entgo.io/ent/schema/field" - "github.com/google/uuid" - "github.com/lysand-org/versia-go/ent/predicate" - "github.com/lysand-org/versia-go/ent/servermetadata" - "github.com/lysand-org/versia-go/ent/user" - "github.com/lysand-org/versia-go/pkg/lysand" -) - -// ServerMetadataUpdate is the builder for updating ServerMetadata entities. -type ServerMetadataUpdate struct { - config - hooks []Hook - mutation *ServerMetadataMutation -} - -// Where appends a list predicates to the ServerMetadataUpdate builder. -func (smu *ServerMetadataUpdate) Where(ps ...predicate.ServerMetadata) *ServerMetadataUpdate { - smu.mutation.Where(ps...) - return smu -} - -// SetIsRemote sets the "isRemote" field. -func (smu *ServerMetadataUpdate) SetIsRemote(b bool) *ServerMetadataUpdate { - smu.mutation.SetIsRemote(b) - return smu -} - -// SetNillableIsRemote sets the "isRemote" field if the given value is not nil. -func (smu *ServerMetadataUpdate) SetNillableIsRemote(b *bool) *ServerMetadataUpdate { - if b != nil { - smu.SetIsRemote(*b) - } - return smu -} - -// SetURI sets the "uri" field. -func (smu *ServerMetadataUpdate) SetURI(s string) *ServerMetadataUpdate { - smu.mutation.SetURI(s) - return smu -} - -// SetNillableURI sets the "uri" field if the given value is not nil. -func (smu *ServerMetadataUpdate) SetNillableURI(s *string) *ServerMetadataUpdate { - if s != nil { - smu.SetURI(*s) - } - return smu -} - -// SetExtensions sets the "extensions" field. -func (smu *ServerMetadataUpdate) SetExtensions(l lysand.Extensions) *ServerMetadataUpdate { - smu.mutation.SetExtensions(l) - return smu -} - -// SetUpdatedAt sets the "updated_at" field. -func (smu *ServerMetadataUpdate) SetUpdatedAt(t time.Time) *ServerMetadataUpdate { - smu.mutation.SetUpdatedAt(t) - return smu -} - -// SetName sets the "name" field. -func (smu *ServerMetadataUpdate) SetName(s string) *ServerMetadataUpdate { - smu.mutation.SetName(s) - return smu -} - -// SetNillableName sets the "name" field if the given value is not nil. -func (smu *ServerMetadataUpdate) SetNillableName(s *string) *ServerMetadataUpdate { - if s != nil { - smu.SetName(*s) - } - return smu -} - -// SetDescription sets the "description" field. -func (smu *ServerMetadataUpdate) SetDescription(s string) *ServerMetadataUpdate { - smu.mutation.SetDescription(s) - return smu -} - -// SetNillableDescription sets the "description" field if the given value is not nil. -func (smu *ServerMetadataUpdate) SetNillableDescription(s *string) *ServerMetadataUpdate { - if s != nil { - smu.SetDescription(*s) - } - return smu -} - -// ClearDescription clears the value of the "description" field. -func (smu *ServerMetadataUpdate) ClearDescription() *ServerMetadataUpdate { - smu.mutation.ClearDescription() - return smu -} - -// SetVersion sets the "version" field. -func (smu *ServerMetadataUpdate) SetVersion(s string) *ServerMetadataUpdate { - smu.mutation.SetVersion(s) - return smu -} - -// SetNillableVersion sets the "version" field if the given value is not nil. -func (smu *ServerMetadataUpdate) SetNillableVersion(s *string) *ServerMetadataUpdate { - if s != nil { - smu.SetVersion(*s) - } - return smu -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (smu *ServerMetadataUpdate) SetSupportedExtensions(s []string) *ServerMetadataUpdate { - smu.mutation.SetSupportedExtensions(s) - return smu -} - -// AppendSupportedExtensions appends s to the "supportedExtensions" field. -func (smu *ServerMetadataUpdate) AppendSupportedExtensions(s []string) *ServerMetadataUpdate { - smu.mutation.AppendSupportedExtensions(s) - return smu -} - -// SetFollowerID sets the "follower" edge to the User entity by ID. -func (smu *ServerMetadataUpdate) SetFollowerID(id uuid.UUID) *ServerMetadataUpdate { - smu.mutation.SetFollowerID(id) - return smu -} - -// SetFollower sets the "follower" edge to the User entity. -func (smu *ServerMetadataUpdate) SetFollower(u *User) *ServerMetadataUpdate { - return smu.SetFollowerID(u.ID) -} - -// SetFolloweeID sets the "followee" edge to the User entity by ID. -func (smu *ServerMetadataUpdate) SetFolloweeID(id uuid.UUID) *ServerMetadataUpdate { - smu.mutation.SetFolloweeID(id) - return smu -} - -// SetFollowee sets the "followee" edge to the User entity. -func (smu *ServerMetadataUpdate) SetFollowee(u *User) *ServerMetadataUpdate { - return smu.SetFolloweeID(u.ID) -} - -// Mutation returns the ServerMetadataMutation object of the builder. -func (smu *ServerMetadataUpdate) Mutation() *ServerMetadataMutation { - return smu.mutation -} - -// ClearFollower clears the "follower" edge to the User entity. -func (smu *ServerMetadataUpdate) ClearFollower() *ServerMetadataUpdate { - smu.mutation.ClearFollower() - return smu -} - -// ClearFollowee clears the "followee" edge to the User entity. -func (smu *ServerMetadataUpdate) ClearFollowee() *ServerMetadataUpdate { - smu.mutation.ClearFollowee() - return smu -} - -// Save executes the query and returns the number of nodes affected by the update operation. -func (smu *ServerMetadataUpdate) Save(ctx context.Context) (int, error) { - smu.defaults() - return withHooks(ctx, smu.sqlSave, smu.mutation, smu.hooks) -} - -// SaveX is like Save, but panics if an error occurs. -func (smu *ServerMetadataUpdate) SaveX(ctx context.Context) int { - affected, err := smu.Save(ctx) - if err != nil { - panic(err) - } - return affected -} - -// Exec executes the query. -func (smu *ServerMetadataUpdate) Exec(ctx context.Context) error { - _, err := smu.Save(ctx) - return err -} - -// ExecX is like Exec, but panics if an error occurs. -func (smu *ServerMetadataUpdate) ExecX(ctx context.Context) { - if err := smu.Exec(ctx); err != nil { - panic(err) - } -} - -// defaults sets the default values of the builder before save. -func (smu *ServerMetadataUpdate) defaults() { - if _, ok := smu.mutation.UpdatedAt(); !ok { - v := servermetadata.UpdateDefaultUpdatedAt() - smu.mutation.SetUpdatedAt(v) - } -} - -// check runs all checks and user-defined validators on the builder. -func (smu *ServerMetadataUpdate) check() error { - if v, ok := smu.mutation.URI(); ok { - if err := servermetadata.URIValidator(v); err != nil { - return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.uri": %w`, err)} - } - } - if v, ok := smu.mutation.Name(); ok { - if err := servermetadata.NameValidator(v); err != nil { - return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.name": %w`, err)} - } - } - if v, ok := smu.mutation.Version(); ok { - if err := servermetadata.VersionValidator(v); err != nil { - return &ValidationError{Name: "version", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.version": %w`, err)} - } - } - if _, ok := smu.mutation.FollowerID(); smu.mutation.FollowerCleared() && !ok { - return errors.New(`ent: clearing a required unique edge "ServerMetadata.follower"`) - } - if _, ok := smu.mutation.FolloweeID(); smu.mutation.FolloweeCleared() && !ok { - return errors.New(`ent: clearing a required unique edge "ServerMetadata.followee"`) - } - return nil -} - -func (smu *ServerMetadataUpdate) sqlSave(ctx context.Context) (n int, err error) { - if err := smu.check(); err != nil { - return n, err - } - _spec := sqlgraph.NewUpdateSpec(servermetadata.Table, servermetadata.Columns, sqlgraph.NewFieldSpec(servermetadata.FieldID, field.TypeUUID)) - if ps := smu.mutation.predicates; len(ps) > 0 { - _spec.Predicate = func(selector *sql.Selector) { - for i := range ps { - ps[i](selector) - } - } - } - if value, ok := smu.mutation.IsRemote(); ok { - _spec.SetField(servermetadata.FieldIsRemote, field.TypeBool, value) - } - if value, ok := smu.mutation.URI(); ok { - _spec.SetField(servermetadata.FieldURI, field.TypeString, value) - } - if value, ok := smu.mutation.Extensions(); ok { - _spec.SetField(servermetadata.FieldExtensions, field.TypeJSON, value) - } - if value, ok := smu.mutation.UpdatedAt(); ok { - _spec.SetField(servermetadata.FieldUpdatedAt, field.TypeTime, value) - } - if value, ok := smu.mutation.Name(); ok { - _spec.SetField(servermetadata.FieldName, field.TypeString, value) - } - if value, ok := smu.mutation.Description(); ok { - _spec.SetField(servermetadata.FieldDescription, field.TypeString, value) - } - if smu.mutation.DescriptionCleared() { - _spec.ClearField(servermetadata.FieldDescription, field.TypeString) - } - if value, ok := smu.mutation.Version(); ok { - _spec.SetField(servermetadata.FieldVersion, field.TypeString, value) - } - if value, ok := smu.mutation.SupportedExtensions(); ok { - _spec.SetField(servermetadata.FieldSupportedExtensions, field.TypeJSON, value) - } - if value, ok := smu.mutation.AppendedSupportedExtensions(); ok { - _spec.AddModifier(func(u *sql.UpdateBuilder) { - sqljson.Append(u, servermetadata.FieldSupportedExtensions, value) - }) - } - if smu.mutation.FollowerCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FollowerTable, - Columns: []string{servermetadata.FollowerColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := smu.mutation.FollowerIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FollowerTable, - Columns: []string{servermetadata.FollowerColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - if smu.mutation.FolloweeCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FolloweeTable, - Columns: []string{servermetadata.FolloweeColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := smu.mutation.FolloweeIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FolloweeTable, - Columns: []string{servermetadata.FolloweeColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - if n, err = sqlgraph.UpdateNodes(ctx, smu.driver, _spec); err != nil { - if _, ok := err.(*sqlgraph.NotFoundError); ok { - err = &NotFoundError{servermetadata.Label} - } else if sqlgraph.IsConstraintError(err) { - err = &ConstraintError{msg: err.Error(), wrap: err} - } - return 0, err - } - smu.mutation.done = true - return n, nil -} - -// ServerMetadataUpdateOne is the builder for updating a single ServerMetadata entity. -type ServerMetadataUpdateOne struct { - config - fields []string - hooks []Hook - mutation *ServerMetadataMutation -} - -// SetIsRemote sets the "isRemote" field. -func (smuo *ServerMetadataUpdateOne) SetIsRemote(b bool) *ServerMetadataUpdateOne { - smuo.mutation.SetIsRemote(b) - return smuo -} - -// SetNillableIsRemote sets the "isRemote" field if the given value is not nil. -func (smuo *ServerMetadataUpdateOne) SetNillableIsRemote(b *bool) *ServerMetadataUpdateOne { - if b != nil { - smuo.SetIsRemote(*b) - } - return smuo -} - -// SetURI sets the "uri" field. -func (smuo *ServerMetadataUpdateOne) SetURI(s string) *ServerMetadataUpdateOne { - smuo.mutation.SetURI(s) - return smuo -} - -// SetNillableURI sets the "uri" field if the given value is not nil. -func (smuo *ServerMetadataUpdateOne) SetNillableURI(s *string) *ServerMetadataUpdateOne { - if s != nil { - smuo.SetURI(*s) - } - return smuo -} - -// SetExtensions sets the "extensions" field. -func (smuo *ServerMetadataUpdateOne) SetExtensions(l lysand.Extensions) *ServerMetadataUpdateOne { - smuo.mutation.SetExtensions(l) - return smuo -} - -// SetUpdatedAt sets the "updated_at" field. -func (smuo *ServerMetadataUpdateOne) SetUpdatedAt(t time.Time) *ServerMetadataUpdateOne { - smuo.mutation.SetUpdatedAt(t) - return smuo -} - -// SetName sets the "name" field. -func (smuo *ServerMetadataUpdateOne) SetName(s string) *ServerMetadataUpdateOne { - smuo.mutation.SetName(s) - return smuo -} - -// SetNillableName sets the "name" field if the given value is not nil. -func (smuo *ServerMetadataUpdateOne) SetNillableName(s *string) *ServerMetadataUpdateOne { - if s != nil { - smuo.SetName(*s) - } - return smuo -} - -// SetDescription sets the "description" field. -func (smuo *ServerMetadataUpdateOne) SetDescription(s string) *ServerMetadataUpdateOne { - smuo.mutation.SetDescription(s) - return smuo -} - -// SetNillableDescription sets the "description" field if the given value is not nil. -func (smuo *ServerMetadataUpdateOne) SetNillableDescription(s *string) *ServerMetadataUpdateOne { - if s != nil { - smuo.SetDescription(*s) - } - return smuo -} - -// ClearDescription clears the value of the "description" field. -func (smuo *ServerMetadataUpdateOne) ClearDescription() *ServerMetadataUpdateOne { - smuo.mutation.ClearDescription() - return smuo -} - -// SetVersion sets the "version" field. -func (smuo *ServerMetadataUpdateOne) SetVersion(s string) *ServerMetadataUpdateOne { - smuo.mutation.SetVersion(s) - return smuo -} - -// SetNillableVersion sets the "version" field if the given value is not nil. -func (smuo *ServerMetadataUpdateOne) SetNillableVersion(s *string) *ServerMetadataUpdateOne { - if s != nil { - smuo.SetVersion(*s) - } - return smuo -} - -// SetSupportedExtensions sets the "supportedExtensions" field. -func (smuo *ServerMetadataUpdateOne) SetSupportedExtensions(s []string) *ServerMetadataUpdateOne { - smuo.mutation.SetSupportedExtensions(s) - return smuo -} - -// AppendSupportedExtensions appends s to the "supportedExtensions" field. -func (smuo *ServerMetadataUpdateOne) AppendSupportedExtensions(s []string) *ServerMetadataUpdateOne { - smuo.mutation.AppendSupportedExtensions(s) - return smuo -} - -// SetFollowerID sets the "follower" edge to the User entity by ID. -func (smuo *ServerMetadataUpdateOne) SetFollowerID(id uuid.UUID) *ServerMetadataUpdateOne { - smuo.mutation.SetFollowerID(id) - return smuo -} - -// SetFollower sets the "follower" edge to the User entity. -func (smuo *ServerMetadataUpdateOne) SetFollower(u *User) *ServerMetadataUpdateOne { - return smuo.SetFollowerID(u.ID) -} - -// SetFolloweeID sets the "followee" edge to the User entity by ID. -func (smuo *ServerMetadataUpdateOne) SetFolloweeID(id uuid.UUID) *ServerMetadataUpdateOne { - smuo.mutation.SetFolloweeID(id) - return smuo -} - -// SetFollowee sets the "followee" edge to the User entity. -func (smuo *ServerMetadataUpdateOne) SetFollowee(u *User) *ServerMetadataUpdateOne { - return smuo.SetFolloweeID(u.ID) -} - -// Mutation returns the ServerMetadataMutation object of the builder. -func (smuo *ServerMetadataUpdateOne) Mutation() *ServerMetadataMutation { - return smuo.mutation -} - -// ClearFollower clears the "follower" edge to the User entity. -func (smuo *ServerMetadataUpdateOne) ClearFollower() *ServerMetadataUpdateOne { - smuo.mutation.ClearFollower() - return smuo -} - -// ClearFollowee clears the "followee" edge to the User entity. -func (smuo *ServerMetadataUpdateOne) ClearFollowee() *ServerMetadataUpdateOne { - smuo.mutation.ClearFollowee() - return smuo -} - -// Where appends a list predicates to the ServerMetadataUpdate builder. -func (smuo *ServerMetadataUpdateOne) Where(ps ...predicate.ServerMetadata) *ServerMetadataUpdateOne { - smuo.mutation.Where(ps...) - return smuo -} - -// Select allows selecting one or more fields (columns) of the returned entity. -// The default is selecting all fields defined in the entity schema. -func (smuo *ServerMetadataUpdateOne) Select(field string, fields ...string) *ServerMetadataUpdateOne { - smuo.fields = append([]string{field}, fields...) - return smuo -} - -// Save executes the query and returns the updated ServerMetadata entity. -func (smuo *ServerMetadataUpdateOne) Save(ctx context.Context) (*ServerMetadata, error) { - smuo.defaults() - return withHooks(ctx, smuo.sqlSave, smuo.mutation, smuo.hooks) -} - -// SaveX is like Save, but panics if an error occurs. -func (smuo *ServerMetadataUpdateOne) SaveX(ctx context.Context) *ServerMetadata { - node, err := smuo.Save(ctx) - if err != nil { - panic(err) - } - return node -} - -// Exec executes the query on the entity. -func (smuo *ServerMetadataUpdateOne) Exec(ctx context.Context) error { - _, err := smuo.Save(ctx) - return err -} - -// ExecX is like Exec, but panics if an error occurs. -func (smuo *ServerMetadataUpdateOne) ExecX(ctx context.Context) { - if err := smuo.Exec(ctx); err != nil { - panic(err) - } -} - -// defaults sets the default values of the builder before save. -func (smuo *ServerMetadataUpdateOne) defaults() { - if _, ok := smuo.mutation.UpdatedAt(); !ok { - v := servermetadata.UpdateDefaultUpdatedAt() - smuo.mutation.SetUpdatedAt(v) - } -} - -// check runs all checks and user-defined validators on the builder. -func (smuo *ServerMetadataUpdateOne) check() error { - if v, ok := smuo.mutation.URI(); ok { - if err := servermetadata.URIValidator(v); err != nil { - return &ValidationError{Name: "uri", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.uri": %w`, err)} - } - } - if v, ok := smuo.mutation.Name(); ok { - if err := servermetadata.NameValidator(v); err != nil { - return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.name": %w`, err)} - } - } - if v, ok := smuo.mutation.Version(); ok { - if err := servermetadata.VersionValidator(v); err != nil { - return &ValidationError{Name: "version", err: fmt.Errorf(`ent: validator failed for field "ServerMetadata.version": %w`, err)} - } - } - if _, ok := smuo.mutation.FollowerID(); smuo.mutation.FollowerCleared() && !ok { - return errors.New(`ent: clearing a required unique edge "ServerMetadata.follower"`) - } - if _, ok := smuo.mutation.FolloweeID(); smuo.mutation.FolloweeCleared() && !ok { - return errors.New(`ent: clearing a required unique edge "ServerMetadata.followee"`) - } - return nil -} - -func (smuo *ServerMetadataUpdateOne) sqlSave(ctx context.Context) (_node *ServerMetadata, err error) { - if err := smuo.check(); err != nil { - return _node, err - } - _spec := sqlgraph.NewUpdateSpec(servermetadata.Table, servermetadata.Columns, sqlgraph.NewFieldSpec(servermetadata.FieldID, field.TypeUUID)) - id, ok := smuo.mutation.ID() - if !ok { - return nil, &ValidationError{Name: "id", err: errors.New(`ent: missing "ServerMetadata.id" for update`)} - } - _spec.Node.ID.Value = id - if fields := smuo.fields; len(fields) > 0 { - _spec.Node.Columns = make([]string, 0, len(fields)) - _spec.Node.Columns = append(_spec.Node.Columns, servermetadata.FieldID) - for _, f := range fields { - if !servermetadata.ValidColumn(f) { - return nil, &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} - } - if f != servermetadata.FieldID { - _spec.Node.Columns = append(_spec.Node.Columns, f) - } - } - } - if ps := smuo.mutation.predicates; len(ps) > 0 { - _spec.Predicate = func(selector *sql.Selector) { - for i := range ps { - ps[i](selector) - } - } - } - if value, ok := smuo.mutation.IsRemote(); ok { - _spec.SetField(servermetadata.FieldIsRemote, field.TypeBool, value) - } - if value, ok := smuo.mutation.URI(); ok { - _spec.SetField(servermetadata.FieldURI, field.TypeString, value) - } - if value, ok := smuo.mutation.Extensions(); ok { - _spec.SetField(servermetadata.FieldExtensions, field.TypeJSON, value) - } - if value, ok := smuo.mutation.UpdatedAt(); ok { - _spec.SetField(servermetadata.FieldUpdatedAt, field.TypeTime, value) - } - if value, ok := smuo.mutation.Name(); ok { - _spec.SetField(servermetadata.FieldName, field.TypeString, value) - } - if value, ok := smuo.mutation.Description(); ok { - _spec.SetField(servermetadata.FieldDescription, field.TypeString, value) - } - if smuo.mutation.DescriptionCleared() { - _spec.ClearField(servermetadata.FieldDescription, field.TypeString) - } - if value, ok := smuo.mutation.Version(); ok { - _spec.SetField(servermetadata.FieldVersion, field.TypeString, value) - } - if value, ok := smuo.mutation.SupportedExtensions(); ok { - _spec.SetField(servermetadata.FieldSupportedExtensions, field.TypeJSON, value) - } - if value, ok := smuo.mutation.AppendedSupportedExtensions(); ok { - _spec.AddModifier(func(u *sql.UpdateBuilder) { - sqljson.Append(u, servermetadata.FieldSupportedExtensions, value) - }) - } - if smuo.mutation.FollowerCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FollowerTable, - Columns: []string{servermetadata.FollowerColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := smuo.mutation.FollowerIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FollowerTable, - Columns: []string{servermetadata.FollowerColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - if smuo.mutation.FolloweeCleared() { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FolloweeTable, - Columns: []string{servermetadata.FolloweeColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - _spec.Edges.Clear = append(_spec.Edges.Clear, edge) - } - if nodes := smuo.mutation.FolloweeIDs(); len(nodes) > 0 { - edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, - Inverse: false, - Table: servermetadata.FolloweeTable, - Columns: []string{servermetadata.FolloweeColumn}, - Bidi: false, - Target: &sqlgraph.EdgeTarget{ - IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeUUID), - }, - } - for _, k := range nodes { - edge.Target.Nodes = append(edge.Target.Nodes, k) - } - _spec.Edges.Add = append(_spec.Edges.Add, edge) - } - _node = &ServerMetadata{config: smuo.config} - _spec.Assign = _node.assignValues - _spec.ScanValues = _node.scanValues - if err = sqlgraph.UpdateNode(ctx, smuo.driver, _spec); err != nil { - if _, ok := err.(*sqlgraph.NotFoundError); ok { - err = &NotFoundError{servermetadata.Label} - } else if sqlgraph.IsConstraintError(err) { - err = &ConstraintError{msg: err.Error(), wrap: err} - } - return nil, err - } - smuo.mutation.done = true - return _node, nil -} diff --git a/ent/tx.go b/ent/tx.go index 1642262..06661c0 100644 --- a/ent/tx.go +++ b/ent/tx.go @@ -18,10 +18,10 @@ type Tx struct { Follow *FollowClient // Image is the client for interacting with the Image builders. Image *ImageClient + // InstanceMetadata is the client for interacting with the InstanceMetadata builders. + InstanceMetadata *InstanceMetadataClient // Note is the client for interacting with the Note builders. Note *NoteClient - // ServerMetadata is the client for interacting with the ServerMetadata builders. - ServerMetadata *ServerMetadataClient // User is the client for interacting with the User builders. User *UserClient @@ -158,8 +158,8 @@ func (tx *Tx) init() { tx.Attachment = NewAttachmentClient(tx.config) tx.Follow = NewFollowClient(tx.config) tx.Image = NewImageClient(tx.config) + tx.InstanceMetadata = NewInstanceMetadataClient(tx.config) tx.Note = NewNoteClient(tx.config) - tx.ServerMetadata = NewServerMetadataClient(tx.config) tx.User = NewUserClient(tx.config) } diff --git a/ent/user.go b/ent/user.go index c550964..4575448 100644 --- a/ent/user.go +++ b/ent/user.go @@ -3,7 +3,6 @@ package ent import ( - "crypto/ed25519" "encoding/json" "fmt" "strings" @@ -41,9 +40,13 @@ type User struct { // Biography holds the value of the "biography" field. Biography *string `json:"biography,omitempty"` // PublicKey holds the value of the "publicKey" field. - PublicKey ed25519.PublicKey `json:"publicKey,omitempty"` + PublicKey []byte `json:"publicKey,omitempty"` + // PublicKeyActor holds the value of the "publicKeyActor" field. + PublicKeyActor string `json:"publicKeyActor,omitempty"` + // PublicKeyAlgorithm holds the value of the "publicKeyAlgorithm" field. + PublicKeyAlgorithm string `json:"publicKeyAlgorithm,omitempty"` // PrivateKey holds the value of the "privateKey" field. - PrivateKey ed25519.PrivateKey `json:"privateKey,omitempty"` + PrivateKey []byte `json:"privateKey,omitempty"` // Indexable holds the value of the "indexable" field. Indexable bool `json:"indexable,omitempty"` // PrivacyLevel holds the value of the "privacyLevel" field. @@ -78,9 +81,15 @@ type UserEdges struct { AuthoredNotes []*Note `json:"authoredNotes,omitempty"` // MentionedNotes holds the value of the mentionedNotes edge. MentionedNotes []*Note `json:"mentionedNotes,omitempty"` + // Servers holds the value of the servers edge. + Servers []*InstanceMetadata `json:"servers,omitempty"` + // ModeratedServers holds the value of the moderatedServers edge. + ModeratedServers []*InstanceMetadata `json:"moderatedServers,omitempty"` + // AdministeredServers holds the value of the administeredServers edge. + AdministeredServers []*InstanceMetadata `json:"administeredServers,omitempty"` // loadedTypes holds the information for reporting if a // type was loaded (or requested) in eager-loading or not. - loadedTypes [4]bool + loadedTypes [7]bool } // AvatarImageOrErr returns the AvatarImage value or an error if the edge @@ -123,6 +132,33 @@ func (e UserEdges) MentionedNotesOrErr() ([]*Note, error) { return nil, &NotLoadedError{edge: "mentionedNotes"} } +// ServersOrErr returns the Servers value or an error if the edge +// was not loaded in eager-loading. +func (e UserEdges) ServersOrErr() ([]*InstanceMetadata, error) { + if e.loadedTypes[4] { + return e.Servers, nil + } + return nil, &NotLoadedError{edge: "servers"} +} + +// ModeratedServersOrErr returns the ModeratedServers value or an error if the edge +// was not loaded in eager-loading. +func (e UserEdges) ModeratedServersOrErr() ([]*InstanceMetadata, error) { + if e.loadedTypes[5] { + return e.ModeratedServers, nil + } + return nil, &NotLoadedError{edge: "moderatedServers"} +} + +// AdministeredServersOrErr returns the AdministeredServers value or an error if the edge +// was not loaded in eager-loading. +func (e UserEdges) AdministeredServersOrErr() ([]*InstanceMetadata, error) { + if e.loadedTypes[6] { + return e.AdministeredServers, nil + } + return nil, &NotLoadedError{edge: "administeredServers"} +} + // scanValues returns the types for scanning values from sql.Rows. func (*User) scanValues(columns []string) ([]any, error) { values := make([]any, len(columns)) @@ -132,7 +168,7 @@ func (*User) scanValues(columns []string) ([]any, error) { values[i] = new([]byte) case user.FieldIsRemote, user.FieldIndexable: values[i] = new(sql.NullBool) - case user.FieldURI, user.FieldUsername, user.FieldDisplayName, user.FieldBiography, user.FieldPrivacyLevel, user.FieldInbox, user.FieldFeatured, user.FieldFollowers, user.FieldFollowing, user.FieldOutbox: + case user.FieldURI, user.FieldUsername, user.FieldDisplayName, user.FieldBiography, user.FieldPublicKeyActor, user.FieldPublicKeyAlgorithm, user.FieldPrivacyLevel, user.FieldInbox, user.FieldFeatured, user.FieldFollowers, user.FieldFollowing, user.FieldOutbox: values[i] = new(sql.NullString) case user.FieldCreatedAt, user.FieldUpdatedAt: values[i] = new(sql.NullTime) @@ -227,6 +263,18 @@ func (u *User) assignValues(columns []string, values []any) error { } else if value != nil { u.PublicKey = *value } + case user.FieldPublicKeyActor: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field publicKeyActor", values[i]) + } else if value.Valid { + u.PublicKeyActor = value.String + } + case user.FieldPublicKeyAlgorithm: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field publicKeyAlgorithm", values[i]) + } else if value.Valid { + u.PublicKeyAlgorithm = value.String + } case user.FieldPrivateKey: if value, ok := values[i].(*[]byte); !ok { return fmt.Errorf("unexpected type %T for field privateKey", values[i]) @@ -330,6 +378,21 @@ func (u *User) QueryMentionedNotes() *NoteQuery { return NewUserClient(u.config).QueryMentionedNotes(u) } +// QueryServers queries the "servers" edge of the User entity. +func (u *User) QueryServers() *InstanceMetadataQuery { + return NewUserClient(u.config).QueryServers(u) +} + +// QueryModeratedServers queries the "moderatedServers" edge of the User entity. +func (u *User) QueryModeratedServers() *InstanceMetadataQuery { + return NewUserClient(u.config).QueryModeratedServers(u) +} + +// QueryAdministeredServers queries the "administeredServers" edge of the User entity. +func (u *User) QueryAdministeredServers() *InstanceMetadataQuery { + return NewUserClient(u.config).QueryAdministeredServers(u) +} + // Update returns a builder for updating this User. // Note that you need to call User.Unwrap() before calling this method if this User // was returned from a transaction, and the transaction was committed or rolled back. @@ -389,6 +452,12 @@ func (u *User) String() string { builder.WriteString("publicKey=") builder.WriteString(fmt.Sprintf("%v", u.PublicKey)) builder.WriteString(", ") + builder.WriteString("publicKeyActor=") + builder.WriteString(u.PublicKeyActor) + builder.WriteString(", ") + builder.WriteString("publicKeyAlgorithm=") + builder.WriteString(u.PublicKeyAlgorithm) + builder.WriteString(", ") builder.WriteString("privateKey=") builder.WriteString(fmt.Sprintf("%v", u.PrivateKey)) builder.WriteString(", ") diff --git a/ent/user/user.go b/ent/user/user.go index fb0739e..56feed8 100644 --- a/ent/user/user.go +++ b/ent/user/user.go @@ -37,6 +37,10 @@ const ( FieldBiography = "biography" // FieldPublicKey holds the string denoting the publickey field in the database. FieldPublicKey = "public_key" + // FieldPublicKeyActor holds the string denoting the publickeyactor field in the database. + FieldPublicKeyActor = "public_key_actor" + // FieldPublicKeyAlgorithm holds the string denoting the publickeyalgorithm field in the database. + FieldPublicKeyAlgorithm = "public_key_algorithm" // FieldPrivateKey holds the string denoting the privatekey field in the database. FieldPrivateKey = "private_key" // FieldIndexable holds the string denoting the indexable field in the database. @@ -63,6 +67,12 @@ const ( EdgeAuthoredNotes = "authoredNotes" // EdgeMentionedNotes holds the string denoting the mentionednotes edge name in mutations. EdgeMentionedNotes = "mentionedNotes" + // EdgeServers holds the string denoting the servers edge name in mutations. + EdgeServers = "servers" + // EdgeModeratedServers holds the string denoting the moderatedservers edge name in mutations. + EdgeModeratedServers = "moderatedServers" + // EdgeAdministeredServers holds the string denoting the administeredservers edge name in mutations. + EdgeAdministeredServers = "administeredServers" // Table holds the table name of the user in the database. Table = "users" // AvatarImageTable is the table that holds the avatarImage relation/edge. @@ -91,6 +101,21 @@ const ( // MentionedNotesInverseTable is the table name for the Note entity. // It exists in this package in order to avoid circular dependency with the "note" package. MentionedNotesInverseTable = "notes" + // ServersTable is the table that holds the servers relation/edge. The primary key declared below. + ServersTable = "instance_metadata_users" + // ServersInverseTable is the table name for the InstanceMetadata entity. + // It exists in this package in order to avoid circular dependency with the "instancemetadata" package. + ServersInverseTable = "instance_metadata" + // ModeratedServersTable is the table that holds the moderatedServers relation/edge. The primary key declared below. + ModeratedServersTable = "instance_metadata_moderators" + // ModeratedServersInverseTable is the table name for the InstanceMetadata entity. + // It exists in this package in order to avoid circular dependency with the "instancemetadata" package. + ModeratedServersInverseTable = "instance_metadata" + // AdministeredServersTable is the table that holds the administeredServers relation/edge. The primary key declared below. + AdministeredServersTable = "instance_metadata_admins" + // AdministeredServersInverseTable is the table name for the InstanceMetadata entity. + // It exists in this package in order to avoid circular dependency with the "instancemetadata" package. + AdministeredServersInverseTable = "instance_metadata" ) // Columns holds all SQL columns for user fields. @@ -106,6 +131,8 @@ var Columns = []string{ FieldDisplayName, FieldBiography, FieldPublicKey, + FieldPublicKeyActor, + FieldPublicKeyAlgorithm, FieldPrivateKey, FieldIndexable, FieldPrivacyLevel, @@ -128,6 +155,15 @@ var ( // MentionedNotesPrimaryKey and MentionedNotesColumn2 are the table columns denoting the // primary key for the mentionedNotes relation (M2M). MentionedNotesPrimaryKey = []string{"note_id", "user_id"} + // ServersPrimaryKey and ServersColumn2 are the table columns denoting the + // primary key for the servers relation (M2M). + ServersPrimaryKey = []string{"instance_metadata_id", "user_id"} + // ModeratedServersPrimaryKey and ModeratedServersColumn2 are the table columns denoting the + // primary key for the moderatedServers relation (M2M). + ModeratedServersPrimaryKey = []string{"instance_metadata_id", "user_id"} + // AdministeredServersPrimaryKey and AdministeredServersColumn2 are the table columns denoting the + // primary key for the administeredServers relation (M2M). + AdministeredServersPrimaryKey = []string{"instance_metadata_id", "user_id"} ) // ValidColumn reports if the column name is valid (part of the table columns). @@ -248,6 +284,16 @@ func ByBiography(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldBiography, opts...).ToFunc() } +// ByPublicKeyActor orders the results by the publicKeyActor field. +func ByPublicKeyActor(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldPublicKeyActor, opts...).ToFunc() +} + +// ByPublicKeyAlgorithm orders the results by the publicKeyAlgorithm field. +func ByPublicKeyAlgorithm(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldPublicKeyAlgorithm, opts...).ToFunc() +} + // ByIndexable orders the results by the indexable field. func ByIndexable(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldIndexable, opts...).ToFunc() @@ -324,6 +370,48 @@ func ByMentionedNotes(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { sqlgraph.OrderByNeighborTerms(s, newMentionedNotesStep(), append([]sql.OrderTerm{term}, terms...)...) } } + +// ByServersCount orders the results by servers count. +func ByServersCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newServersStep(), opts...) + } +} + +// ByServers orders the results by servers terms. +func ByServers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newServersStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} + +// ByModeratedServersCount orders the results by moderatedServers count. +func ByModeratedServersCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newModeratedServersStep(), opts...) + } +} + +// ByModeratedServers orders the results by moderatedServers terms. +func ByModeratedServers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newModeratedServersStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} + +// ByAdministeredServersCount orders the results by administeredServers count. +func ByAdministeredServersCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newAdministeredServersStep(), opts...) + } +} + +// ByAdministeredServers orders the results by administeredServers terms. +func ByAdministeredServers(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborTerms(s, newAdministeredServersStep(), append([]sql.OrderTerm{term}, terms...)...) + } +} func newAvatarImageStep() *sqlgraph.Step { return sqlgraph.NewStep( sqlgraph.From(Table, FieldID), @@ -352,3 +440,24 @@ func newMentionedNotesStep() *sqlgraph.Step { sqlgraph.Edge(sqlgraph.M2M, true, MentionedNotesTable, MentionedNotesPrimaryKey...), ) } +func newServersStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(ServersInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, ServersTable, ServersPrimaryKey...), + ) +} +func newModeratedServersStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(ModeratedServersInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, ModeratedServersTable, ModeratedServersPrimaryKey...), + ) +} +func newAdministeredServersStep() *sqlgraph.Step { + return sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.To(AdministeredServersInverseTable, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, AdministeredServersTable, AdministeredServersPrimaryKey...), + ) +} diff --git a/ent/user/where.go b/ent/user/where.go index 085dc0a..ca2cd0d 100644 --- a/ent/user/where.go +++ b/ent/user/where.go @@ -3,7 +3,6 @@ package user import ( - "crypto/ed25519" "time" "entgo.io/ent/dialect/sql" @@ -98,15 +97,23 @@ func Biography(v string) predicate.User { } // PublicKey applies equality check predicate on the "publicKey" field. It's identical to PublicKeyEQ. -func PublicKey(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldEQ(FieldPublicKey, vc)) +func PublicKey(v []byte) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKey, v)) +} + +// PublicKeyActor applies equality check predicate on the "publicKeyActor" field. It's identical to PublicKeyActorEQ. +func PublicKeyActor(v string) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKeyActor, v)) +} + +// PublicKeyAlgorithm applies equality check predicate on the "publicKeyAlgorithm" field. It's identical to PublicKeyAlgorithmEQ. +func PublicKeyAlgorithm(v string) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKeyAlgorithm, v)) } // PrivateKey applies equality check predicate on the "privateKey" field. It's identical to PrivateKeyEQ. -func PrivateKey(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldEQ(FieldPrivateKey, vc)) +func PrivateKey(v []byte) predicate.User { + return predicate.User(sql.FieldEQ(FieldPrivateKey, v)) } // Indexable applies equality check predicate on the "indexable" field. It's identical to IndexableEQ. @@ -560,111 +567,213 @@ func BiographyContainsFold(v string) predicate.User { } // PublicKeyEQ applies the EQ predicate on the "publicKey" field. -func PublicKeyEQ(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldEQ(FieldPublicKey, vc)) +func PublicKeyEQ(v []byte) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKey, v)) } // PublicKeyNEQ applies the NEQ predicate on the "publicKey" field. -func PublicKeyNEQ(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldNEQ(FieldPublicKey, vc)) +func PublicKeyNEQ(v []byte) predicate.User { + return predicate.User(sql.FieldNEQ(FieldPublicKey, v)) } // PublicKeyIn applies the In predicate on the "publicKey" field. -func PublicKeyIn(vs ...ed25519.PublicKey) predicate.User { - v := make([]any, len(vs)) - for i := range v { - v[i] = []byte(vs[i]) - } - return predicate.User(sql.FieldIn(FieldPublicKey, v...)) +func PublicKeyIn(vs ...[]byte) predicate.User { + return predicate.User(sql.FieldIn(FieldPublicKey, vs...)) } // PublicKeyNotIn applies the NotIn predicate on the "publicKey" field. -func PublicKeyNotIn(vs ...ed25519.PublicKey) predicate.User { - v := make([]any, len(vs)) - for i := range v { - v[i] = []byte(vs[i]) - } - return predicate.User(sql.FieldNotIn(FieldPublicKey, v...)) +func PublicKeyNotIn(vs ...[]byte) predicate.User { + return predicate.User(sql.FieldNotIn(FieldPublicKey, vs...)) } // PublicKeyGT applies the GT predicate on the "publicKey" field. -func PublicKeyGT(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldGT(FieldPublicKey, vc)) +func PublicKeyGT(v []byte) predicate.User { + return predicate.User(sql.FieldGT(FieldPublicKey, v)) } // PublicKeyGTE applies the GTE predicate on the "publicKey" field. -func PublicKeyGTE(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldGTE(FieldPublicKey, vc)) +func PublicKeyGTE(v []byte) predicate.User { + return predicate.User(sql.FieldGTE(FieldPublicKey, v)) } // PublicKeyLT applies the LT predicate on the "publicKey" field. -func PublicKeyLT(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldLT(FieldPublicKey, vc)) +func PublicKeyLT(v []byte) predicate.User { + return predicate.User(sql.FieldLT(FieldPublicKey, v)) } // PublicKeyLTE applies the LTE predicate on the "publicKey" field. -func PublicKeyLTE(v ed25519.PublicKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldLTE(FieldPublicKey, vc)) +func PublicKeyLTE(v []byte) predicate.User { + return predicate.User(sql.FieldLTE(FieldPublicKey, v)) +} + +// PublicKeyActorEQ applies the EQ predicate on the "publicKeyActor" field. +func PublicKeyActorEQ(v string) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKeyActor, v)) +} + +// PublicKeyActorNEQ applies the NEQ predicate on the "publicKeyActor" field. +func PublicKeyActorNEQ(v string) predicate.User { + return predicate.User(sql.FieldNEQ(FieldPublicKeyActor, v)) +} + +// PublicKeyActorIn applies the In predicate on the "publicKeyActor" field. +func PublicKeyActorIn(vs ...string) predicate.User { + return predicate.User(sql.FieldIn(FieldPublicKeyActor, vs...)) +} + +// PublicKeyActorNotIn applies the NotIn predicate on the "publicKeyActor" field. +func PublicKeyActorNotIn(vs ...string) predicate.User { + return predicate.User(sql.FieldNotIn(FieldPublicKeyActor, vs...)) +} + +// PublicKeyActorGT applies the GT predicate on the "publicKeyActor" field. +func PublicKeyActorGT(v string) predicate.User { + return predicate.User(sql.FieldGT(FieldPublicKeyActor, v)) +} + +// PublicKeyActorGTE applies the GTE predicate on the "publicKeyActor" field. +func PublicKeyActorGTE(v string) predicate.User { + return predicate.User(sql.FieldGTE(FieldPublicKeyActor, v)) +} + +// PublicKeyActorLT applies the LT predicate on the "publicKeyActor" field. +func PublicKeyActorLT(v string) predicate.User { + return predicate.User(sql.FieldLT(FieldPublicKeyActor, v)) +} + +// PublicKeyActorLTE applies the LTE predicate on the "publicKeyActor" field. +func PublicKeyActorLTE(v string) predicate.User { + return predicate.User(sql.FieldLTE(FieldPublicKeyActor, v)) +} + +// PublicKeyActorContains applies the Contains predicate on the "publicKeyActor" field. +func PublicKeyActorContains(v string) predicate.User { + return predicate.User(sql.FieldContains(FieldPublicKeyActor, v)) +} + +// PublicKeyActorHasPrefix applies the HasPrefix predicate on the "publicKeyActor" field. +func PublicKeyActorHasPrefix(v string) predicate.User { + return predicate.User(sql.FieldHasPrefix(FieldPublicKeyActor, v)) +} + +// PublicKeyActorHasSuffix applies the HasSuffix predicate on the "publicKeyActor" field. +func PublicKeyActorHasSuffix(v string) predicate.User { + return predicate.User(sql.FieldHasSuffix(FieldPublicKeyActor, v)) +} + +// PublicKeyActorEqualFold applies the EqualFold predicate on the "publicKeyActor" field. +func PublicKeyActorEqualFold(v string) predicate.User { + return predicate.User(sql.FieldEqualFold(FieldPublicKeyActor, v)) +} + +// PublicKeyActorContainsFold applies the ContainsFold predicate on the "publicKeyActor" field. +func PublicKeyActorContainsFold(v string) predicate.User { + return predicate.User(sql.FieldContainsFold(FieldPublicKeyActor, v)) +} + +// PublicKeyAlgorithmEQ applies the EQ predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmEQ(v string) predicate.User { + return predicate.User(sql.FieldEQ(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmNEQ applies the NEQ predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmNEQ(v string) predicate.User { + return predicate.User(sql.FieldNEQ(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmIn applies the In predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmIn(vs ...string) predicate.User { + return predicate.User(sql.FieldIn(FieldPublicKeyAlgorithm, vs...)) +} + +// PublicKeyAlgorithmNotIn applies the NotIn predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmNotIn(vs ...string) predicate.User { + return predicate.User(sql.FieldNotIn(FieldPublicKeyAlgorithm, vs...)) +} + +// PublicKeyAlgorithmGT applies the GT predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmGT(v string) predicate.User { + return predicate.User(sql.FieldGT(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmGTE applies the GTE predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmGTE(v string) predicate.User { + return predicate.User(sql.FieldGTE(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmLT applies the LT predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmLT(v string) predicate.User { + return predicate.User(sql.FieldLT(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmLTE applies the LTE predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmLTE(v string) predicate.User { + return predicate.User(sql.FieldLTE(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmContains applies the Contains predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmContains(v string) predicate.User { + return predicate.User(sql.FieldContains(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmHasPrefix applies the HasPrefix predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmHasPrefix(v string) predicate.User { + return predicate.User(sql.FieldHasPrefix(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmHasSuffix applies the HasSuffix predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmHasSuffix(v string) predicate.User { + return predicate.User(sql.FieldHasSuffix(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmEqualFold applies the EqualFold predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmEqualFold(v string) predicate.User { + return predicate.User(sql.FieldEqualFold(FieldPublicKeyAlgorithm, v)) +} + +// PublicKeyAlgorithmContainsFold applies the ContainsFold predicate on the "publicKeyAlgorithm" field. +func PublicKeyAlgorithmContainsFold(v string) predicate.User { + return predicate.User(sql.FieldContainsFold(FieldPublicKeyAlgorithm, v)) } // PrivateKeyEQ applies the EQ predicate on the "privateKey" field. -func PrivateKeyEQ(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldEQ(FieldPrivateKey, vc)) +func PrivateKeyEQ(v []byte) predicate.User { + return predicate.User(sql.FieldEQ(FieldPrivateKey, v)) } // PrivateKeyNEQ applies the NEQ predicate on the "privateKey" field. -func PrivateKeyNEQ(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldNEQ(FieldPrivateKey, vc)) +func PrivateKeyNEQ(v []byte) predicate.User { + return predicate.User(sql.FieldNEQ(FieldPrivateKey, v)) } // PrivateKeyIn applies the In predicate on the "privateKey" field. -func PrivateKeyIn(vs ...ed25519.PrivateKey) predicate.User { - v := make([]any, len(vs)) - for i := range v { - v[i] = []byte(vs[i]) - } - return predicate.User(sql.FieldIn(FieldPrivateKey, v...)) +func PrivateKeyIn(vs ...[]byte) predicate.User { + return predicate.User(sql.FieldIn(FieldPrivateKey, vs...)) } // PrivateKeyNotIn applies the NotIn predicate on the "privateKey" field. -func PrivateKeyNotIn(vs ...ed25519.PrivateKey) predicate.User { - v := make([]any, len(vs)) - for i := range v { - v[i] = []byte(vs[i]) - } - return predicate.User(sql.FieldNotIn(FieldPrivateKey, v...)) +func PrivateKeyNotIn(vs ...[]byte) predicate.User { + return predicate.User(sql.FieldNotIn(FieldPrivateKey, vs...)) } // PrivateKeyGT applies the GT predicate on the "privateKey" field. -func PrivateKeyGT(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldGT(FieldPrivateKey, vc)) +func PrivateKeyGT(v []byte) predicate.User { + return predicate.User(sql.FieldGT(FieldPrivateKey, v)) } // PrivateKeyGTE applies the GTE predicate on the "privateKey" field. -func PrivateKeyGTE(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldGTE(FieldPrivateKey, vc)) +func PrivateKeyGTE(v []byte) predicate.User { + return predicate.User(sql.FieldGTE(FieldPrivateKey, v)) } // PrivateKeyLT applies the LT predicate on the "privateKey" field. -func PrivateKeyLT(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldLT(FieldPrivateKey, vc)) +func PrivateKeyLT(v []byte) predicate.User { + return predicate.User(sql.FieldLT(FieldPrivateKey, v)) } // PrivateKeyLTE applies the LTE predicate on the "privateKey" field. -func PrivateKeyLTE(v ed25519.PrivateKey) predicate.User { - vc := []byte(v) - return predicate.User(sql.FieldLTE(FieldPrivateKey, vc)) +func PrivateKeyLTE(v []byte) predicate.User { + return predicate.User(sql.FieldLTE(FieldPrivateKey, v)) } // PrivateKeyIsNil applies the IsNil predicate on the "privateKey" field. @@ -1124,6 +1233,75 @@ func HasMentionedNotesWith(preds ...predicate.Note) predicate.User { }) } +// HasServers applies the HasEdge predicate on the "servers" edge. +func HasServers() predicate.User { + return predicate.User(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, ServersTable, ServersPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasServersWith applies the HasEdge predicate on the "servers" edge with a given conditions (other predicates). +func HasServersWith(preds ...predicate.InstanceMetadata) predicate.User { + return predicate.User(func(s *sql.Selector) { + step := newServersStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + +// HasModeratedServers applies the HasEdge predicate on the "moderatedServers" edge. +func HasModeratedServers() predicate.User { + return predicate.User(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, ModeratedServersTable, ModeratedServersPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasModeratedServersWith applies the HasEdge predicate on the "moderatedServers" edge with a given conditions (other predicates). +func HasModeratedServersWith(preds ...predicate.InstanceMetadata) predicate.User { + return predicate.User(func(s *sql.Selector) { + step := newModeratedServersStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + +// HasAdministeredServers applies the HasEdge predicate on the "administeredServers" edge. +func HasAdministeredServers() predicate.User { + return predicate.User(func(s *sql.Selector) { + step := sqlgraph.NewStep( + sqlgraph.From(Table, FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, AdministeredServersTable, AdministeredServersPrimaryKey...), + ) + sqlgraph.HasNeighbors(s, step) + }) +} + +// HasAdministeredServersWith applies the HasEdge predicate on the "administeredServers" edge with a given conditions (other predicates). +func HasAdministeredServersWith(preds ...predicate.InstanceMetadata) predicate.User { + return predicate.User(func(s *sql.Selector) { + step := newAdministeredServersStep() + sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { + for _, p := range preds { + p(s) + } + }) + }) +} + // And groups predicates with the AND operator between them. func And(predicates ...predicate.User) predicate.User { return predicate.User(sql.AndPredicates(predicates...)) diff --git a/ent/user_create.go b/ent/user_create.go index d6a4d44..38ccd9e 100644 --- a/ent/user_create.go +++ b/ent/user_create.go @@ -4,7 +4,6 @@ package ent import ( "context" - "crypto/ed25519" "errors" "fmt" "time" @@ -15,6 +14,7 @@ import ( "entgo.io/ent/schema/field" "github.com/google/uuid" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" "github.com/lysand-org/versia-go/ent/user" "github.com/lysand-org/versia-go/pkg/lysand" @@ -115,14 +115,26 @@ func (uc *UserCreate) SetNillableBiography(s *string) *UserCreate { } // SetPublicKey sets the "publicKey" field. -func (uc *UserCreate) SetPublicKey(ek ed25519.PublicKey) *UserCreate { - uc.mutation.SetPublicKey(ek) +func (uc *UserCreate) SetPublicKey(b []byte) *UserCreate { + uc.mutation.SetPublicKey(b) + return uc +} + +// SetPublicKeyActor sets the "publicKeyActor" field. +func (uc *UserCreate) SetPublicKeyActor(s string) *UserCreate { + uc.mutation.SetPublicKeyActor(s) + return uc +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (uc *UserCreate) SetPublicKeyAlgorithm(s string) *UserCreate { + uc.mutation.SetPublicKeyAlgorithm(s) return uc } // SetPrivateKey sets the "privateKey" field. -func (uc *UserCreate) SetPrivateKey(ek ed25519.PrivateKey) *UserCreate { - uc.mutation.SetPrivateKey(ek) +func (uc *UserCreate) SetPrivateKey(b []byte) *UserCreate { + uc.mutation.SetPrivateKey(b) return uc } @@ -272,6 +284,51 @@ func (uc *UserCreate) AddMentionedNotes(n ...*Note) *UserCreate { return uc.AddMentionedNoteIDs(ids...) } +// AddServerIDs adds the "servers" edge to the InstanceMetadata entity by IDs. +func (uc *UserCreate) AddServerIDs(ids ...uuid.UUID) *UserCreate { + uc.mutation.AddServerIDs(ids...) + return uc +} + +// AddServers adds the "servers" edges to the InstanceMetadata entity. +func (uc *UserCreate) AddServers(i ...*InstanceMetadata) *UserCreate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uc.AddServerIDs(ids...) +} + +// AddModeratedServerIDs adds the "moderatedServers" edge to the InstanceMetadata entity by IDs. +func (uc *UserCreate) AddModeratedServerIDs(ids ...uuid.UUID) *UserCreate { + uc.mutation.AddModeratedServerIDs(ids...) + return uc +} + +// AddModeratedServers adds the "moderatedServers" edges to the InstanceMetadata entity. +func (uc *UserCreate) AddModeratedServers(i ...*InstanceMetadata) *UserCreate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uc.AddModeratedServerIDs(ids...) +} + +// AddAdministeredServerIDs adds the "administeredServers" edge to the InstanceMetadata entity by IDs. +func (uc *UserCreate) AddAdministeredServerIDs(ids ...uuid.UUID) *UserCreate { + uc.mutation.AddAdministeredServerIDs(ids...) + return uc +} + +// AddAdministeredServers adds the "administeredServers" edges to the InstanceMetadata entity. +func (uc *UserCreate) AddAdministeredServers(i ...*InstanceMetadata) *UserCreate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uc.AddAdministeredServerIDs(ids...) +} + // Mutation returns the UserMutation object of the builder. func (uc *UserCreate) Mutation() *UserMutation { return uc.mutation @@ -375,6 +432,12 @@ func (uc *UserCreate) check() error { if _, ok := uc.mutation.PublicKey(); !ok { return &ValidationError{Name: "publicKey", err: errors.New(`ent: missing required field "User.publicKey"`)} } + if _, ok := uc.mutation.PublicKeyActor(); !ok { + return &ValidationError{Name: "publicKeyActor", err: errors.New(`ent: missing required field "User.publicKeyActor"`)} + } + if _, ok := uc.mutation.PublicKeyAlgorithm(); !ok { + return &ValidationError{Name: "publicKeyAlgorithm", err: errors.New(`ent: missing required field "User.publicKeyAlgorithm"`)} + } if _, ok := uc.mutation.Indexable(); !ok { return &ValidationError{Name: "indexable", err: errors.New(`ent: missing required field "User.indexable"`)} } @@ -505,6 +568,14 @@ func (uc *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) { _spec.SetField(user.FieldPublicKey, field.TypeBytes, value) _node.PublicKey = value } + if value, ok := uc.mutation.PublicKeyActor(); ok { + _spec.SetField(user.FieldPublicKeyActor, field.TypeString, value) + _node.PublicKeyActor = value + } + if value, ok := uc.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(user.FieldPublicKeyAlgorithm, field.TypeString, value) + _node.PublicKeyAlgorithm = value + } if value, ok := uc.mutation.PrivateKey(); ok { _spec.SetField(user.FieldPrivateKey, field.TypeBytes, value) _node.PrivateKey = value @@ -607,6 +678,54 @@ func (uc *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) { } _spec.Edges = append(_spec.Edges, edge) } + if nodes := uc.mutation.ServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } + if nodes := uc.mutation.ModeratedServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } + if nodes := uc.mutation.AdministeredServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges = append(_spec.Edges, edge) + } return _node, _spec } @@ -774,7 +893,7 @@ func (u *UserUpsert) ClearBiography() *UserUpsert { } // SetPublicKey sets the "publicKey" field. -func (u *UserUpsert) SetPublicKey(v ed25519.PublicKey) *UserUpsert { +func (u *UserUpsert) SetPublicKey(v []byte) *UserUpsert { u.Set(user.FieldPublicKey, v) return u } @@ -785,8 +904,32 @@ func (u *UserUpsert) UpdatePublicKey() *UserUpsert { return u } +// SetPublicKeyActor sets the "publicKeyActor" field. +func (u *UserUpsert) SetPublicKeyActor(v string) *UserUpsert { + u.Set(user.FieldPublicKeyActor, v) + return u +} + +// UpdatePublicKeyActor sets the "publicKeyActor" field to the value that was provided on create. +func (u *UserUpsert) UpdatePublicKeyActor() *UserUpsert { + u.SetExcluded(user.FieldPublicKeyActor) + return u +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *UserUpsert) SetPublicKeyAlgorithm(v string) *UserUpsert { + u.Set(user.FieldPublicKeyAlgorithm, v) + return u +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *UserUpsert) UpdatePublicKeyAlgorithm() *UserUpsert { + u.SetExcluded(user.FieldPublicKeyAlgorithm) + return u +} + // SetPrivateKey sets the "privateKey" field. -func (u *UserUpsert) SetPrivateKey(v ed25519.PrivateKey) *UserUpsert { +func (u *UserUpsert) SetPrivateKey(v []byte) *UserUpsert { u.Set(user.FieldPrivateKey, v) return u } @@ -1084,7 +1227,7 @@ func (u *UserUpsertOne) ClearBiography() *UserUpsertOne { } // SetPublicKey sets the "publicKey" field. -func (u *UserUpsertOne) SetPublicKey(v ed25519.PublicKey) *UserUpsertOne { +func (u *UserUpsertOne) SetPublicKey(v []byte) *UserUpsertOne { return u.Update(func(s *UserUpsert) { s.SetPublicKey(v) }) @@ -1097,8 +1240,36 @@ func (u *UserUpsertOne) UpdatePublicKey() *UserUpsertOne { }) } +// SetPublicKeyActor sets the "publicKeyActor" field. +func (u *UserUpsertOne) SetPublicKeyActor(v string) *UserUpsertOne { + return u.Update(func(s *UserUpsert) { + s.SetPublicKeyActor(v) + }) +} + +// UpdatePublicKeyActor sets the "publicKeyActor" field to the value that was provided on create. +func (u *UserUpsertOne) UpdatePublicKeyActor() *UserUpsertOne { + return u.Update(func(s *UserUpsert) { + s.UpdatePublicKeyActor() + }) +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *UserUpsertOne) SetPublicKeyAlgorithm(v string) *UserUpsertOne { + return u.Update(func(s *UserUpsert) { + s.SetPublicKeyAlgorithm(v) + }) +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *UserUpsertOne) UpdatePublicKeyAlgorithm() *UserUpsertOne { + return u.Update(func(s *UserUpsert) { + s.UpdatePublicKeyAlgorithm() + }) +} + // SetPrivateKey sets the "privateKey" field. -func (u *UserUpsertOne) SetPrivateKey(v ed25519.PrivateKey) *UserUpsertOne { +func (u *UserUpsertOne) SetPrivateKey(v []byte) *UserUpsertOne { return u.Update(func(s *UserUpsert) { s.SetPrivateKey(v) }) @@ -1582,7 +1753,7 @@ func (u *UserUpsertBulk) ClearBiography() *UserUpsertBulk { } // SetPublicKey sets the "publicKey" field. -func (u *UserUpsertBulk) SetPublicKey(v ed25519.PublicKey) *UserUpsertBulk { +func (u *UserUpsertBulk) SetPublicKey(v []byte) *UserUpsertBulk { return u.Update(func(s *UserUpsert) { s.SetPublicKey(v) }) @@ -1595,8 +1766,36 @@ func (u *UserUpsertBulk) UpdatePublicKey() *UserUpsertBulk { }) } +// SetPublicKeyActor sets the "publicKeyActor" field. +func (u *UserUpsertBulk) SetPublicKeyActor(v string) *UserUpsertBulk { + return u.Update(func(s *UserUpsert) { + s.SetPublicKeyActor(v) + }) +} + +// UpdatePublicKeyActor sets the "publicKeyActor" field to the value that was provided on create. +func (u *UserUpsertBulk) UpdatePublicKeyActor() *UserUpsertBulk { + return u.Update(func(s *UserUpsert) { + s.UpdatePublicKeyActor() + }) +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (u *UserUpsertBulk) SetPublicKeyAlgorithm(v string) *UserUpsertBulk { + return u.Update(func(s *UserUpsert) { + s.SetPublicKeyAlgorithm(v) + }) +} + +// UpdatePublicKeyAlgorithm sets the "publicKeyAlgorithm" field to the value that was provided on create. +func (u *UserUpsertBulk) UpdatePublicKeyAlgorithm() *UserUpsertBulk { + return u.Update(func(s *UserUpsert) { + s.UpdatePublicKeyAlgorithm() + }) +} + // SetPrivateKey sets the "privateKey" field. -func (u *UserUpsertBulk) SetPrivateKey(v ed25519.PrivateKey) *UserUpsertBulk { +func (u *UserUpsertBulk) SetPrivateKey(v []byte) *UserUpsertBulk { return u.Update(func(s *UserUpsert) { s.SetPrivateKey(v) }) diff --git a/ent/user_query.go b/ent/user_query.go index e06d775..e5fa2bb 100644 --- a/ent/user_query.go +++ b/ent/user_query.go @@ -13,6 +13,7 @@ import ( "entgo.io/ent/schema/field" "github.com/google/uuid" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" "github.com/lysand-org/versia-go/ent/predicate" "github.com/lysand-org/versia-go/ent/user" @@ -21,15 +22,18 @@ import ( // UserQuery is the builder for querying User entities. type UserQuery struct { config - ctx *QueryContext - order []user.OrderOption - inters []Interceptor - predicates []predicate.User - withAvatarImage *ImageQuery - withHeaderImage *ImageQuery - withAuthoredNotes *NoteQuery - withMentionedNotes *NoteQuery - withFKs bool + ctx *QueryContext + order []user.OrderOption + inters []Interceptor + predicates []predicate.User + withAvatarImage *ImageQuery + withHeaderImage *ImageQuery + withAuthoredNotes *NoteQuery + withMentionedNotes *NoteQuery + withServers *InstanceMetadataQuery + withModeratedServers *InstanceMetadataQuery + withAdministeredServers *InstanceMetadataQuery + withFKs bool // intermediate query (i.e. traversal path). sql *sql.Selector path func(context.Context) (*sql.Selector, error) @@ -154,6 +158,72 @@ func (uq *UserQuery) QueryMentionedNotes() *NoteQuery { return query } +// QueryServers chains the current query on the "servers" edge. +func (uq *UserQuery) QueryServers() *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := uq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := uq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, selector), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.ServersTable, user.ServersPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) + return fromU, nil + } + return query +} + +// QueryModeratedServers chains the current query on the "moderatedServers" edge. +func (uq *UserQuery) QueryModeratedServers() *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := uq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := uq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, selector), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.ModeratedServersTable, user.ModeratedServersPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) + return fromU, nil + } + return query +} + +// QueryAdministeredServers chains the current query on the "administeredServers" edge. +func (uq *UserQuery) QueryAdministeredServers() *InstanceMetadataQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { + if err := uq.prepareQuery(ctx); err != nil { + return nil, err + } + selector := uq.sqlQuery(ctx) + if err := selector.Err(); err != nil { + return nil, err + } + step := sqlgraph.NewStep( + sqlgraph.From(user.Table, user.FieldID, selector), + sqlgraph.To(instancemetadata.Table, instancemetadata.FieldID), + sqlgraph.Edge(sqlgraph.M2M, true, user.AdministeredServersTable, user.AdministeredServersPrimaryKey...), + ) + fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) + return fromU, nil + } + return query +} + // First returns the first User entity from the query. // Returns a *NotFoundError when no User was found. func (uq *UserQuery) First(ctx context.Context) (*User, error) { @@ -341,15 +411,18 @@ func (uq *UserQuery) Clone() *UserQuery { return nil } return &UserQuery{ - config: uq.config, - ctx: uq.ctx.Clone(), - order: append([]user.OrderOption{}, uq.order...), - inters: append([]Interceptor{}, uq.inters...), - predicates: append([]predicate.User{}, uq.predicates...), - withAvatarImage: uq.withAvatarImage.Clone(), - withHeaderImage: uq.withHeaderImage.Clone(), - withAuthoredNotes: uq.withAuthoredNotes.Clone(), - withMentionedNotes: uq.withMentionedNotes.Clone(), + config: uq.config, + ctx: uq.ctx.Clone(), + order: append([]user.OrderOption{}, uq.order...), + inters: append([]Interceptor{}, uq.inters...), + predicates: append([]predicate.User{}, uq.predicates...), + withAvatarImage: uq.withAvatarImage.Clone(), + withHeaderImage: uq.withHeaderImage.Clone(), + withAuthoredNotes: uq.withAuthoredNotes.Clone(), + withMentionedNotes: uq.withMentionedNotes.Clone(), + withServers: uq.withServers.Clone(), + withModeratedServers: uq.withModeratedServers.Clone(), + withAdministeredServers: uq.withAdministeredServers.Clone(), // clone intermediate query. sql: uq.sql.Clone(), path: uq.path, @@ -400,6 +473,39 @@ func (uq *UserQuery) WithMentionedNotes(opts ...func(*NoteQuery)) *UserQuery { return uq } +// WithServers tells the query-builder to eager-load the nodes that are connected to +// the "servers" edge. The optional arguments are used to configure the query builder of the edge. +func (uq *UserQuery) WithServers(opts ...func(*InstanceMetadataQuery)) *UserQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + for _, opt := range opts { + opt(query) + } + uq.withServers = query + return uq +} + +// WithModeratedServers tells the query-builder to eager-load the nodes that are connected to +// the "moderatedServers" edge. The optional arguments are used to configure the query builder of the edge. +func (uq *UserQuery) WithModeratedServers(opts ...func(*InstanceMetadataQuery)) *UserQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + for _, opt := range opts { + opt(query) + } + uq.withModeratedServers = query + return uq +} + +// WithAdministeredServers tells the query-builder to eager-load the nodes that are connected to +// the "administeredServers" edge. The optional arguments are used to configure the query builder of the edge. +func (uq *UserQuery) WithAdministeredServers(opts ...func(*InstanceMetadataQuery)) *UserQuery { + query := (&InstanceMetadataClient{config: uq.config}).Query() + for _, opt := range opts { + opt(query) + } + uq.withAdministeredServers = query + return uq +} + // GroupBy is used to group vertices by one or more fields/columns. // It is often used with aggregate functions, like: count, max, mean, min, sum. // @@ -479,11 +585,14 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e nodes = []*User{} withFKs = uq.withFKs _spec = uq.querySpec() - loadedTypes = [4]bool{ + loadedTypes = [7]bool{ uq.withAvatarImage != nil, uq.withHeaderImage != nil, uq.withAuthoredNotes != nil, uq.withMentionedNotes != nil, + uq.withServers != nil, + uq.withModeratedServers != nil, + uq.withAdministeredServers != nil, } ) if uq.withAvatarImage != nil || uq.withHeaderImage != nil { @@ -536,6 +645,29 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e return nil, err } } + if query := uq.withServers; query != nil { + if err := uq.loadServers(ctx, query, nodes, + func(n *User) { n.Edges.Servers = []*InstanceMetadata{} }, + func(n *User, e *InstanceMetadata) { n.Edges.Servers = append(n.Edges.Servers, e) }); err != nil { + return nil, err + } + } + if query := uq.withModeratedServers; query != nil { + if err := uq.loadModeratedServers(ctx, query, nodes, + func(n *User) { n.Edges.ModeratedServers = []*InstanceMetadata{} }, + func(n *User, e *InstanceMetadata) { n.Edges.ModeratedServers = append(n.Edges.ModeratedServers, e) }); err != nil { + return nil, err + } + } + if query := uq.withAdministeredServers; query != nil { + if err := uq.loadAdministeredServers(ctx, query, nodes, + func(n *User) { n.Edges.AdministeredServers = []*InstanceMetadata{} }, + func(n *User, e *InstanceMetadata) { + n.Edges.AdministeredServers = append(n.Edges.AdministeredServers, e) + }); err != nil { + return nil, err + } + } return nodes, nil } @@ -695,6 +827,189 @@ func (uq *UserQuery) loadMentionedNotes(ctx context.Context, query *NoteQuery, n } return nil } +func (uq *UserQuery) loadServers(ctx context.Context, query *InstanceMetadataQuery, nodes []*User, init func(*User), assign func(*User, *InstanceMetadata)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*User) + nids := make(map[uuid.UUID]map[*User]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(user.ServersTable) + s.Join(joinT).On(s.C(instancemetadata.FieldID), joinT.C(user.ServersPrimaryKey[0])) + s.Where(sql.InValues(joinT.C(user.ServersPrimaryKey[1]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(user.ServersPrimaryKey[1])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*User]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*InstanceMetadata](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "servers" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} +func (uq *UserQuery) loadModeratedServers(ctx context.Context, query *InstanceMetadataQuery, nodes []*User, init func(*User), assign func(*User, *InstanceMetadata)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*User) + nids := make(map[uuid.UUID]map[*User]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(user.ModeratedServersTable) + s.Join(joinT).On(s.C(instancemetadata.FieldID), joinT.C(user.ModeratedServersPrimaryKey[0])) + s.Where(sql.InValues(joinT.C(user.ModeratedServersPrimaryKey[1]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(user.ModeratedServersPrimaryKey[1])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*User]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*InstanceMetadata](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "moderatedServers" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} +func (uq *UserQuery) loadAdministeredServers(ctx context.Context, query *InstanceMetadataQuery, nodes []*User, init func(*User), assign func(*User, *InstanceMetadata)) error { + edgeIDs := make([]driver.Value, len(nodes)) + byID := make(map[uuid.UUID]*User) + nids := make(map[uuid.UUID]map[*User]struct{}) + for i, node := range nodes { + edgeIDs[i] = node.ID + byID[node.ID] = node + if init != nil { + init(node) + } + } + query.Where(func(s *sql.Selector) { + joinT := sql.Table(user.AdministeredServersTable) + s.Join(joinT).On(s.C(instancemetadata.FieldID), joinT.C(user.AdministeredServersPrimaryKey[0])) + s.Where(sql.InValues(joinT.C(user.AdministeredServersPrimaryKey[1]), edgeIDs...)) + columns := s.SelectedColumns() + s.Select(joinT.C(user.AdministeredServersPrimaryKey[1])) + s.AppendSelect(columns...) + s.SetDistinct(false) + }) + if err := query.prepareQuery(ctx); err != nil { + return err + } + qr := QuerierFunc(func(ctx context.Context, q Query) (Value, error) { + return query.sqlAll(ctx, func(_ context.Context, spec *sqlgraph.QuerySpec) { + assign := spec.Assign + values := spec.ScanValues + spec.ScanValues = func(columns []string) ([]any, error) { + values, err := values(columns[1:]) + if err != nil { + return nil, err + } + return append([]any{new(uuid.UUID)}, values...), nil + } + spec.Assign = func(columns []string, values []any) error { + outValue := *values[0].(*uuid.UUID) + inValue := *values[1].(*uuid.UUID) + if nids[inValue] == nil { + nids[inValue] = map[*User]struct{}{byID[outValue]: {}} + return assign(columns[1:], values[1:]) + } + nids[inValue][byID[outValue]] = struct{}{} + return nil + } + }) + }) + neighbors, err := withInterceptors[[]*InstanceMetadata](ctx, query, qr, query.inters) + if err != nil { + return err + } + for _, n := range neighbors { + nodes, ok := nids[n.ID] + if !ok { + return fmt.Errorf(`unexpected "administeredServers" node returned %v`, n.ID) + } + for kn := range nodes { + assign(kn, n) + } + } + return nil +} func (uq *UserQuery) sqlCount(ctx context.Context) (int, error) { _spec := uq.querySpec() diff --git a/ent/user_update.go b/ent/user_update.go index 7a3014f..b703b6b 100644 --- a/ent/user_update.go +++ b/ent/user_update.go @@ -4,7 +4,6 @@ package ent import ( "context" - "crypto/ed25519" "errors" "fmt" "time" @@ -15,6 +14,7 @@ import ( "entgo.io/ent/schema/field" "github.com/google/uuid" "github.com/lysand-org/versia-go/ent/image" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/ent/note" "github.com/lysand-org/versia-go/ent/predicate" "github.com/lysand-org/versia-go/ent/user" @@ -141,14 +141,42 @@ func (uu *UserUpdate) ClearBiography() *UserUpdate { } // SetPublicKey sets the "publicKey" field. -func (uu *UserUpdate) SetPublicKey(ek ed25519.PublicKey) *UserUpdate { - uu.mutation.SetPublicKey(ek) +func (uu *UserUpdate) SetPublicKey(b []byte) *UserUpdate { + uu.mutation.SetPublicKey(b) + return uu +} + +// SetPublicKeyActor sets the "publicKeyActor" field. +func (uu *UserUpdate) SetPublicKeyActor(s string) *UserUpdate { + uu.mutation.SetPublicKeyActor(s) + return uu +} + +// SetNillablePublicKeyActor sets the "publicKeyActor" field if the given value is not nil. +func (uu *UserUpdate) SetNillablePublicKeyActor(s *string) *UserUpdate { + if s != nil { + uu.SetPublicKeyActor(*s) + } + return uu +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (uu *UserUpdate) SetPublicKeyAlgorithm(s string) *UserUpdate { + uu.mutation.SetPublicKeyAlgorithm(s) + return uu +} + +// SetNillablePublicKeyAlgorithm sets the "publicKeyAlgorithm" field if the given value is not nil. +func (uu *UserUpdate) SetNillablePublicKeyAlgorithm(s *string) *UserUpdate { + if s != nil { + uu.SetPublicKeyAlgorithm(*s) + } return uu } // SetPrivateKey sets the "privateKey" field. -func (uu *UserUpdate) SetPrivateKey(ek ed25519.PrivateKey) *UserUpdate { - uu.mutation.SetPrivateKey(ek) +func (uu *UserUpdate) SetPrivateKey(b []byte) *UserUpdate { + uu.mutation.SetPrivateKey(b) return uu } @@ -336,6 +364,51 @@ func (uu *UserUpdate) AddMentionedNotes(n ...*Note) *UserUpdate { return uu.AddMentionedNoteIDs(ids...) } +// AddServerIDs adds the "servers" edge to the InstanceMetadata entity by IDs. +func (uu *UserUpdate) AddServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.AddServerIDs(ids...) + return uu +} + +// AddServers adds the "servers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) AddServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.AddServerIDs(ids...) +} + +// AddModeratedServerIDs adds the "moderatedServers" edge to the InstanceMetadata entity by IDs. +func (uu *UserUpdate) AddModeratedServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.AddModeratedServerIDs(ids...) + return uu +} + +// AddModeratedServers adds the "moderatedServers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) AddModeratedServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.AddModeratedServerIDs(ids...) +} + +// AddAdministeredServerIDs adds the "administeredServers" edge to the InstanceMetadata entity by IDs. +func (uu *UserUpdate) AddAdministeredServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.AddAdministeredServerIDs(ids...) + return uu +} + +// AddAdministeredServers adds the "administeredServers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) AddAdministeredServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.AddAdministeredServerIDs(ids...) +} + // Mutation returns the UserMutation object of the builder. func (uu *UserUpdate) Mutation() *UserMutation { return uu.mutation @@ -395,6 +468,69 @@ func (uu *UserUpdate) RemoveMentionedNotes(n ...*Note) *UserUpdate { return uu.RemoveMentionedNoteIDs(ids...) } +// ClearServers clears all "servers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) ClearServers() *UserUpdate { + uu.mutation.ClearServers() + return uu +} + +// RemoveServerIDs removes the "servers" edge to InstanceMetadata entities by IDs. +func (uu *UserUpdate) RemoveServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.RemoveServerIDs(ids...) + return uu +} + +// RemoveServers removes "servers" edges to InstanceMetadata entities. +func (uu *UserUpdate) RemoveServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.RemoveServerIDs(ids...) +} + +// ClearModeratedServers clears all "moderatedServers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) ClearModeratedServers() *UserUpdate { + uu.mutation.ClearModeratedServers() + return uu +} + +// RemoveModeratedServerIDs removes the "moderatedServers" edge to InstanceMetadata entities by IDs. +func (uu *UserUpdate) RemoveModeratedServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.RemoveModeratedServerIDs(ids...) + return uu +} + +// RemoveModeratedServers removes "moderatedServers" edges to InstanceMetadata entities. +func (uu *UserUpdate) RemoveModeratedServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.RemoveModeratedServerIDs(ids...) +} + +// ClearAdministeredServers clears all "administeredServers" edges to the InstanceMetadata entity. +func (uu *UserUpdate) ClearAdministeredServers() *UserUpdate { + uu.mutation.ClearAdministeredServers() + return uu +} + +// RemoveAdministeredServerIDs removes the "administeredServers" edge to InstanceMetadata entities by IDs. +func (uu *UserUpdate) RemoveAdministeredServerIDs(ids ...uuid.UUID) *UserUpdate { + uu.mutation.RemoveAdministeredServerIDs(ids...) + return uu +} + +// RemoveAdministeredServers removes "administeredServers" edges to InstanceMetadata entities. +func (uu *UserUpdate) RemoveAdministeredServers(i ...*InstanceMetadata) *UserUpdate { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uu.RemoveAdministeredServerIDs(ids...) +} + // Save executes the query and returns the number of nodes affected by the update operation. func (uu *UserUpdate) Save(ctx context.Context) (int, error) { uu.defaults() @@ -529,6 +665,12 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { if value, ok := uu.mutation.PublicKey(); ok { _spec.SetField(user.FieldPublicKey, field.TypeBytes, value) } + if value, ok := uu.mutation.PublicKeyActor(); ok { + _spec.SetField(user.FieldPublicKeyActor, field.TypeString, value) + } + if value, ok := uu.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(user.FieldPublicKeyAlgorithm, field.TypeString, value) + } if value, ok := uu.mutation.PrivateKey(); ok { _spec.SetField(user.FieldPrivateKey, field.TypeBytes, value) } @@ -712,6 +854,141 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { } _spec.Edges.Add = append(_spec.Edges.Add, edge) } + if uu.mutation.ServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.RemovedServersIDs(); len(nodes) > 0 && !uu.mutation.ServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.ServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if uu.mutation.ModeratedServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.RemovedModeratedServersIDs(); len(nodes) > 0 && !uu.mutation.ModeratedServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.ModeratedServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if uu.mutation.AdministeredServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.RemovedAdministeredServersIDs(); len(nodes) > 0 && !uu.mutation.AdministeredServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uu.mutation.AdministeredServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } if n, err = sqlgraph.UpdateNodes(ctx, uu.driver, _spec); err != nil { if _, ok := err.(*sqlgraph.NotFoundError); ok { err = &NotFoundError{user.Label} @@ -839,14 +1116,42 @@ func (uuo *UserUpdateOne) ClearBiography() *UserUpdateOne { } // SetPublicKey sets the "publicKey" field. -func (uuo *UserUpdateOne) SetPublicKey(ek ed25519.PublicKey) *UserUpdateOne { - uuo.mutation.SetPublicKey(ek) +func (uuo *UserUpdateOne) SetPublicKey(b []byte) *UserUpdateOne { + uuo.mutation.SetPublicKey(b) + return uuo +} + +// SetPublicKeyActor sets the "publicKeyActor" field. +func (uuo *UserUpdateOne) SetPublicKeyActor(s string) *UserUpdateOne { + uuo.mutation.SetPublicKeyActor(s) + return uuo +} + +// SetNillablePublicKeyActor sets the "publicKeyActor" field if the given value is not nil. +func (uuo *UserUpdateOne) SetNillablePublicKeyActor(s *string) *UserUpdateOne { + if s != nil { + uuo.SetPublicKeyActor(*s) + } + return uuo +} + +// SetPublicKeyAlgorithm sets the "publicKeyAlgorithm" field. +func (uuo *UserUpdateOne) SetPublicKeyAlgorithm(s string) *UserUpdateOne { + uuo.mutation.SetPublicKeyAlgorithm(s) + return uuo +} + +// SetNillablePublicKeyAlgorithm sets the "publicKeyAlgorithm" field if the given value is not nil. +func (uuo *UserUpdateOne) SetNillablePublicKeyAlgorithm(s *string) *UserUpdateOne { + if s != nil { + uuo.SetPublicKeyAlgorithm(*s) + } return uuo } // SetPrivateKey sets the "privateKey" field. -func (uuo *UserUpdateOne) SetPrivateKey(ek ed25519.PrivateKey) *UserUpdateOne { - uuo.mutation.SetPrivateKey(ek) +func (uuo *UserUpdateOne) SetPrivateKey(b []byte) *UserUpdateOne { + uuo.mutation.SetPrivateKey(b) return uuo } @@ -1034,6 +1339,51 @@ func (uuo *UserUpdateOne) AddMentionedNotes(n ...*Note) *UserUpdateOne { return uuo.AddMentionedNoteIDs(ids...) } +// AddServerIDs adds the "servers" edge to the InstanceMetadata entity by IDs. +func (uuo *UserUpdateOne) AddServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.AddServerIDs(ids...) + return uuo +} + +// AddServers adds the "servers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) AddServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.AddServerIDs(ids...) +} + +// AddModeratedServerIDs adds the "moderatedServers" edge to the InstanceMetadata entity by IDs. +func (uuo *UserUpdateOne) AddModeratedServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.AddModeratedServerIDs(ids...) + return uuo +} + +// AddModeratedServers adds the "moderatedServers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) AddModeratedServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.AddModeratedServerIDs(ids...) +} + +// AddAdministeredServerIDs adds the "administeredServers" edge to the InstanceMetadata entity by IDs. +func (uuo *UserUpdateOne) AddAdministeredServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.AddAdministeredServerIDs(ids...) + return uuo +} + +// AddAdministeredServers adds the "administeredServers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) AddAdministeredServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.AddAdministeredServerIDs(ids...) +} + // Mutation returns the UserMutation object of the builder. func (uuo *UserUpdateOne) Mutation() *UserMutation { return uuo.mutation @@ -1093,6 +1443,69 @@ func (uuo *UserUpdateOne) RemoveMentionedNotes(n ...*Note) *UserUpdateOne { return uuo.RemoveMentionedNoteIDs(ids...) } +// ClearServers clears all "servers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) ClearServers() *UserUpdateOne { + uuo.mutation.ClearServers() + return uuo +} + +// RemoveServerIDs removes the "servers" edge to InstanceMetadata entities by IDs. +func (uuo *UserUpdateOne) RemoveServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.RemoveServerIDs(ids...) + return uuo +} + +// RemoveServers removes "servers" edges to InstanceMetadata entities. +func (uuo *UserUpdateOne) RemoveServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.RemoveServerIDs(ids...) +} + +// ClearModeratedServers clears all "moderatedServers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) ClearModeratedServers() *UserUpdateOne { + uuo.mutation.ClearModeratedServers() + return uuo +} + +// RemoveModeratedServerIDs removes the "moderatedServers" edge to InstanceMetadata entities by IDs. +func (uuo *UserUpdateOne) RemoveModeratedServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.RemoveModeratedServerIDs(ids...) + return uuo +} + +// RemoveModeratedServers removes "moderatedServers" edges to InstanceMetadata entities. +func (uuo *UserUpdateOne) RemoveModeratedServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.RemoveModeratedServerIDs(ids...) +} + +// ClearAdministeredServers clears all "administeredServers" edges to the InstanceMetadata entity. +func (uuo *UserUpdateOne) ClearAdministeredServers() *UserUpdateOne { + uuo.mutation.ClearAdministeredServers() + return uuo +} + +// RemoveAdministeredServerIDs removes the "administeredServers" edge to InstanceMetadata entities by IDs. +func (uuo *UserUpdateOne) RemoveAdministeredServerIDs(ids ...uuid.UUID) *UserUpdateOne { + uuo.mutation.RemoveAdministeredServerIDs(ids...) + return uuo +} + +// RemoveAdministeredServers removes "administeredServers" edges to InstanceMetadata entities. +func (uuo *UserUpdateOne) RemoveAdministeredServers(i ...*InstanceMetadata) *UserUpdateOne { + ids := make([]uuid.UUID, len(i)) + for j := range i { + ids[j] = i[j].ID + } + return uuo.RemoveAdministeredServerIDs(ids...) +} + // Where appends a list predicates to the UserUpdate builder. func (uuo *UserUpdateOne) Where(ps ...predicate.User) *UserUpdateOne { uuo.mutation.Where(ps...) @@ -1257,6 +1670,12 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) if value, ok := uuo.mutation.PublicKey(); ok { _spec.SetField(user.FieldPublicKey, field.TypeBytes, value) } + if value, ok := uuo.mutation.PublicKeyActor(); ok { + _spec.SetField(user.FieldPublicKeyActor, field.TypeString, value) + } + if value, ok := uuo.mutation.PublicKeyAlgorithm(); ok { + _spec.SetField(user.FieldPublicKeyAlgorithm, field.TypeString, value) + } if value, ok := uuo.mutation.PrivateKey(); ok { _spec.SetField(user.FieldPrivateKey, field.TypeBytes, value) } @@ -1440,6 +1859,141 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) } _spec.Edges.Add = append(_spec.Edges.Add, edge) } + if uuo.mutation.ServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.RemovedServersIDs(); len(nodes) > 0 && !uuo.mutation.ServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.ServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ServersTable, + Columns: user.ServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if uuo.mutation.ModeratedServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.RemovedModeratedServersIDs(); len(nodes) > 0 && !uuo.mutation.ModeratedServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.ModeratedServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.ModeratedServersTable, + Columns: user.ModeratedServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } + if uuo.mutation.AdministeredServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.RemovedAdministeredServersIDs(); len(nodes) > 0 && !uuo.mutation.AdministeredServersCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := uuo.mutation.AdministeredServersIDs(); len(nodes) > 0 { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.M2M, + Inverse: true, + Table: user.AdministeredServersTable, + Columns: user.AdministeredServersPrimaryKey, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(instancemetadata.FieldID, field.TypeUUID), + }, + } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } + _spec.Edges.Add = append(_spec.Edges.Add, edge) + } _node = &User{config: uuo.config} _spec.Assign = _node.assignValues _spec.ScanValues = _node.scanValues diff --git a/internal/api_schema/errors.go b/internal/api_schema/errors.go index 5c469e3..f11e643 100644 --- a/internal/api_schema/errors.go +++ b/internal/api_schema/errors.go @@ -6,6 +6,7 @@ var ( ErrUnauthorized = NewAPIError(401, "Unauthorized") ErrForbidden = NewAPIError(403, "Forbidden") ErrNotFound = NewAPIError(404, "Not found") + ErrUserNotFound = ErrNotFound(map[string]any{"reason": "user not found"}) ErrConflict = NewAPIError(409, "Conflict") ErrUsernameTaken = NewAPIError(409, "Username is taken") ErrRateLimitExceeded = NewAPIError(429, "Rate limit exceeded") diff --git a/internal/api_schema/users.go b/internal/api_schema/users.go index ad9c4e2..f222215 100644 --- a/internal/api_schema/users.go +++ b/internal/api_schema/users.go @@ -2,6 +2,7 @@ package api_schema import ( "github.com/google/uuid" + "github.com/lysand-org/versia-go/pkg/lysand" ) type User struct { @@ -9,9 +10,16 @@ type User struct { Username string `json:"username"` } +type LysandUser lysand.User + type FetchUserResponse = APIResponse[User] type CreateUserRequest struct { - Username string `json:"username" validate:"required,username_regex,min=3,max=32"` + Username string `json:"username" validate:"required,username_regex,min=1,max=32"` Password string `json:"password" validate:"required,min=8,max=256"` } + +type SearchUserRequest struct { + Username string `query:"username" validate:"required,username_regex,min=1,max=32"` + Domain *string `query:"domain" validate:"domain_regex"` +} diff --git a/internal/entity/server_metadata.go b/internal/entity/server_metadata.go new file mode 100644 index 0000000..554b523 --- /dev/null +++ b/internal/entity/server_metadata.go @@ -0,0 +1,96 @@ +package entity + +import ( + "github.com/lysand-org/versia-go/ent" + "github.com/lysand-org/versia-go/pkg/lysand" + versiacrypto "github.com/lysand-org/versia-go/pkg/lysand/crypto" +) + +type InstanceMetadata struct { + *ent.InstanceMetadata + + Moderators []User + ModeratorsCollection *lysand.URL + + Admins []User + AdminsCollection *lysand.URL + + SharedInbox *lysand.URL + + PublicKey *lysand.SPKIPublicKey + + Logo *lysand.ImageContentTypeMap + Banner *lysand.ImageContentTypeMap +} + +func NewInstanceMetadata(dbData *ent.InstanceMetadata) (*InstanceMetadata, error) { + n := &InstanceMetadata{ + InstanceMetadata: dbData, + PublicKey: &lysand.SPKIPublicKey{}, + } + + var err error + if n.PublicKey.Key, err = versiacrypto.ToTypedKey(dbData.PublicKeyAlgorithm, dbData.PublicKey); err != nil { + return nil, err + } + + if n.SharedInbox, err = lysand.ParseURL(dbData.SharedInboxURI); err != nil { + return nil, err + } + if dbData.ModeratorsURI != nil { + if n.ModeratorsCollection, err = lysand.ParseURL(*dbData.ModeratorsURI); err != nil { + return nil, err + } + } + if dbData.AdminsURI != nil { + if n.AdminsCollection, err = lysand.ParseURL(*dbData.AdminsURI); err != nil { + return nil, err + } + } + + for _, r := range dbData.Edges.Moderators { + u, err := NewUser(r) + if err != nil { + return nil, err + } + + n.Moderators = append(n.Moderators, *u) + } + + for _, r := range dbData.Edges.Admins { + u, err := NewUser(r) + if err != nil { + return nil, err + } + + n.Admins = append(n.Admins, *u) + } + + return n, nil +} + +func (m InstanceMetadata) ToLysand() lysand.InstanceMetadata { + return lysand.InstanceMetadata{ + Extensions: m.Extensions, + Name: m.Name, + Description: m.Description, + Host: m.Host, + SharedInbox: m.SharedInbox, + Moderators: m.ModeratorsCollection, + Admins: m.AdminsCollection, + Logo: m.Logo, + Banner: m.Banner, + PublicKey: lysand.InstancePublicKey{ + Algorithm: m.PublicKeyAlgorithm, + Key: m.PublicKey, + }, + Software: lysand.InstanceSoftware{ + Name: m.SoftwareName, + Version: m.SoftwareVersion, + }, + Compatibility: lysand.InstanceCompatibility{ + Versions: m.SupportedVersions, + Extensions: m.SupportedExtensions, + }, + } +} diff --git a/internal/entity/user.go b/internal/entity/user.go index d44f52d..15e956c 100644 --- a/internal/entity/user.go +++ b/internal/entity/user.go @@ -2,6 +2,7 @@ package entity import ( "github.com/lysand-org/versia-go/internal/helpers" + versiacrypto "github.com/lysand-org/versia-go/pkg/lysand/crypto" "net/url" "github.com/lysand-org/versia-go/ent" @@ -12,12 +13,14 @@ import ( type User struct { *ent.User - URI *lysand.URL - Inbox *lysand.URL - Outbox *lysand.URL - Featured *lysand.URL - Followers *lysand.URL - Following *lysand.URL + URI *lysand.URL + PKActorURI *lysand.URL + PublicKey *lysand.SPKIPublicKey + Inbox *lysand.URL + Outbox *lysand.URL + Featured *lysand.URL + Followers *lysand.URL + Following *lysand.URL DisplayName string LysandAvatar lysand.ImageContentTypeMap @@ -25,38 +28,52 @@ type User struct { Signer lysand.Signer } -func NewUser(dbUser *ent.User) (*User, error) { - u := &User{User: dbUser} +func NewUser(dbData *ent.User) (*User, error) { + u := &User{ + User: dbData, + PublicKey: &lysand.SPKIPublicKey{ + Key: nil, + Algorithm: dbData.PublicKeyAlgorithm, + }, + DisplayName: dbData.Username, - u.DisplayName = u.Username - if dbUser.DisplayName != nil { - u.DisplayName = *dbUser.DisplayName + LysandAvatar: lysandAvatar(dbData), + LysandBiography: lysandBiography(dbData), + } + + if dbData.DisplayName != nil { + u.DisplayName = *dbData.DisplayName } var err error - if u.URI, err = lysand.ParseURL(dbUser.URI); err != nil { - return nil, err - } - if u.Inbox, err = lysand.ParseURL(dbUser.Inbox); err != nil { - return nil, err - } - if u.Outbox, err = lysand.ParseURL(dbUser.Outbox); err != nil { - return nil, err - } - if u.Featured, err = lysand.ParseURL(dbUser.Featured); err != nil { - return nil, err - } - if u.Followers, err = lysand.ParseURL(dbUser.Followers); err != nil { - return nil, err - } - if u.Following, err = lysand.ParseURL(dbUser.Following); err != nil { + if u.PublicKey.Key, err = versiacrypto.ToTypedKey(dbData.PublicKeyAlgorithm, dbData.PublicKey); err != nil { + return nil, err + } + + if u.URI, err = lysand.ParseURL(dbData.URI); err != nil { + return nil, err + } + if u.PKActorURI, err = lysand.ParseURL(dbData.PublicKeyActor); err != nil { + return nil, err + } + if u.Inbox, err = lysand.ParseURL(dbData.Inbox); err != nil { + return nil, err + } + if u.Outbox, err = lysand.ParseURL(dbData.Outbox); err != nil { + return nil, err + } + if u.Featured, err = lysand.ParseURL(dbData.Featured); err != nil { + return nil, err + } + if u.Followers, err = lysand.ParseURL(dbData.Followers); err != nil { + return nil, err + } + if u.Following, err = lysand.ParseURL(dbData.Following); err != nil { return nil, err } - u.LysandAvatar = lysandAvatar(dbUser) - u.LysandBiography = lysandBiography(dbUser) u.Signer = lysand.Signer{ - PrivateKey: dbUser.PrivateKey, + PrivateKey: dbData.PrivateKey, UserURL: u.URI.ToStd(), } @@ -76,9 +93,10 @@ func (u User) ToLysand() *lysand.User { Avatar: u.LysandAvatar, Header: imageMap(u.Edges.HeaderImage), Indexable: u.Indexable, - PublicKey: lysand.PublicKey{ - Actor: utils.UserAPIURL(u.ID), - PublicKey: lysand.SPKIPublicKey(u.PublicKey), + PublicKey: lysand.UserPublicKey{ + Actor: u.PKActorURI, + Algorithm: u.PublicKeyAlgorithm, + Key: u.PublicKey, }, Bio: u.LysandBiography, Fields: u.Fields, @@ -88,10 +106,6 @@ func (u User) ToLysand() *lysand.User { Featured: u.Featured, Followers: u.Followers, Following: u.Following, - - // TODO: Remove these, they got deprecated and moved into an extension - Likes: utils.UserLikesAPIURL(u.ID), - Dislikes: utils.UserDislikesAPIURL(u.ID), } } diff --git a/internal/handlers/meta_handler/handler.go b/internal/handlers/meta_handler/handler.go index b27b415..5cf1b65 100644 --- a/internal/handlers/meta_handler/handler.go +++ b/internal/handlers/meta_handler/handler.go @@ -4,17 +4,22 @@ import ( "github.com/go-logr/logr" "github.com/gofiber/fiber/v2" "github.com/lysand-org/versia-go/config" + "github.com/lysand-org/versia-go/internal/service" "github.com/lysand-org/versia-go/pkg/webfinger" ) type Handler struct { + instanceMetadataService service.InstanceMetadataService + hostMeta webfinger.HostMeta log logr.Logger } -func New(log logr.Logger) *Handler { +func New(instanceMetadataService service.InstanceMetadataService, log logr.Logger) *Handler { return &Handler{ + instanceMetadataService: instanceMetadataService, + hostMeta: webfinger.NewHostMeta(config.C.PublicAddress), log: log.WithName("users"), @@ -22,7 +27,11 @@ func New(log logr.Logger) *Handler { } func (i *Handler) Register(r fiber.Router) { - r.Get("/.well-known/lysand", i.GetLysandServerMetadata) + r.Get("/.well-known/versia", i.GetLysandInstanceMetadata) + r.Get("/.well-known/versia/admins", i.GetLysandInstanceMetadata) + r.Get("/.well-known/versia/moderators", i.GetLysandInstanceMetadata) + + // Webfinger host meta spec r.Get("/.well-known/host-meta", i.GetHostMeta) r.Get("/.well-known/host-meta.json", i.GetHostMetaJSON) } diff --git a/internal/handlers/meta_handler/lysand_instance_metadata_get.go b/internal/handlers/meta_handler/lysand_instance_metadata_get.go new file mode 100644 index 0000000..9c57cdd --- /dev/null +++ b/internal/handlers/meta_handler/lysand_instance_metadata_get.go @@ -0,0 +1,14 @@ +package meta_handler + +import ( + "github.com/gofiber/fiber/v2" +) + +func (i *Handler) GetLysandInstanceMetadata(c *fiber.Ctx) error { + m, err := i.instanceMetadataService.Ours(c.UserContext()) + if err != nil { + return err + } + + return c.JSON(m.ToLysand()) +} diff --git a/internal/handlers/meta_handler/lysand_server_metadata_get.go b/internal/handlers/meta_handler/lysand_server_metadata_get.go deleted file mode 100644 index e2400fa..0000000 --- a/internal/handlers/meta_handler/lysand_server_metadata_get.go +++ /dev/null @@ -1,28 +0,0 @@ -package meta_handler - -import ( - "github.com/Masterminds/semver" - "github.com/gofiber/fiber/v2" - "github.com/lysand-org/versia-go/config" - "github.com/lysand-org/versia-go/pkg/lysand" -) - -func (i *Handler) GetLysandServerMetadata(c *fiber.Ctx) error { - return c.JSON(lysand.ServerMetadata{ - // TODO: Get version from build linker flags - Version: semver.MustParse("0.0.0-dev"), - - Name: config.C.InstanceName, - Description: config.C.InstanceDescription, - Website: lysand.URLFromStd(config.C.PublicAddress), - - // TODO: Get more info - Moderators: nil, - Admins: nil, - Logo: nil, - Banner: nil, - - SupportedExtensions: []string{}, - Extensions: map[string]any{}, - }) -} diff --git a/internal/handlers/user_handler/app_user_search.go b/internal/handlers/user_handler/app_user_search.go new file mode 100644 index 0000000..fc64570 --- /dev/null +++ b/internal/handlers/user_handler/app_user_search.go @@ -0,0 +1,51 @@ +package user_handler + +import ( + "errors" + "fmt" + "github.com/gofiber/fiber/v2" + "github.com/lysand-org/versia-go/internal/api_schema" + "github.com/lysand-org/versia-go/pkg/webfinger" + "net" + "syscall" +) + +func (i *Handler) SearchUser(c *fiber.Ctx) error { + var req api_schema.SearchUserRequest + if err := c.QueryParser(&req); err != nil { + return api_schema.ErrInvalidRequestBody(nil) + } + + if err := i.bodyValidator.Validate(req); err != nil { + return err + } + + u, err := i.userService.Search(c.UserContext(), req) + if err != nil { + // TODO: Move into service error + if errors.Is(err, syscall.ECONNREFUSED) { + return api_schema.ErrBadRequest(map[string]any{"reason": "Remote server is offline"}) + } + + if errors.Is(err, webfinger.ErrUserNotFound) { + return api_schema.ErrUserNotFound + } + + var dnsErr *net.DNSError + if errors.As(err, &dnsErr) { + if dnsErr.IsNotFound { + return api_schema.ErrBadRequest(map[string]any{"reason": fmt.Sprintf("Could not resolve %s", dnsErr.Name)}) + } + + if dnsErr.IsTimeout { + return api_schema.ErrInternalServerError(map[string]any{"reason": "Local DNS server timed out"}) + } + } + + i.log.Error(err, "Failed to search for user", "username", req.Username) + + return api_schema.ErrInternalServerError(nil) + } + + return c.JSON((*api_schema.LysandUser)(u.ToLysand())) +} diff --git a/internal/handlers/user_handler/handler.go b/internal/handlers/user_handler/handler.go index c7177e7..6b9052b 100644 --- a/internal/handlers/user_handler/handler.go +++ b/internal/handlers/user_handler/handler.go @@ -8,9 +8,11 @@ import ( ) type Handler struct { - userService service.UserService federationService service.FederationService - inboxService service.InboxService + requestSigner service.RequestSigner + + userService service.UserService + inboxService service.InboxService bodyValidator validators.BodyValidator requestValidator validators.RequestValidator @@ -18,11 +20,13 @@ type Handler struct { log logr.Logger } -func New(userService service.UserService, federationService service.FederationService, inboxService service.InboxService, bodyValidator validators.BodyValidator, requestValidator validators.RequestValidator, log logr.Logger) *Handler { +func New(federationService service.FederationService, requestSigner service.RequestSigner, userService service.UserService, inboxService service.InboxService, bodyValidator validators.BodyValidator, requestValidator validators.RequestValidator, log logr.Logger) *Handler { return &Handler{ - userService: userService, federationService: federationService, - inboxService: inboxService, + requestSigner: requestSigner, + + userService: userService, + inboxService: inboxService, bodyValidator: bodyValidator, requestValidator: requestValidator, @@ -41,6 +45,7 @@ func (i *Handler) Register(r fiber.Router) { r.Get("/api/app/users/:id", i.GetUser) r.Post("/api/app/users/", i.CreateUser) + r.Get("/api/users/search", i.SearchUser) r.Get("/api/users/:id", i.GetLysandUser) r.Post("/api/users/:id/inbox", i.LysandInbox) } diff --git a/internal/handlers/user_handler/lysand_user_get.go b/internal/handlers/user_handler/lysand_user_get.go index 842f690..ebdf06c 100644 --- a/internal/handlers/user_handler/lysand_user_get.go +++ b/internal/handlers/user_handler/lysand_user_get.go @@ -27,5 +27,5 @@ func (i *Handler) GetLysandUser(c *fiber.Ctx) error { return api_schema.ErrNotFound(map[string]any{"id": parsedRequestedUserID}) } - return c.JSON(u.ToLysand()) + return i.requestSigner.Sign(c, u.Signer, u.ToLysand()) } diff --git a/internal/handlers/user_handler/wellknown_webfinger.go b/internal/handlers/user_handler/wellknown_webfinger.go index 8ff7dac..ae44475 100644 --- a/internal/handlers/user_handler/wellknown_webfinger.go +++ b/internal/handlers/user_handler/wellknown_webfinger.go @@ -1,8 +1,10 @@ package user_handler import ( + "errors" "github.com/gofiber/fiber/v2" "github.com/lysand-org/versia-go/config" + "github.com/lysand-org/versia-go/internal/api_schema" "github.com/lysand-org/versia-go/internal/helpers" "github.com/lysand-org/versia-go/pkg/webfinger" ) @@ -16,13 +18,19 @@ func (i *Handler) Webfinger(c *fiber.Ctx) error { } if userID.Domain != config.C.PublicAddress.Host { - return c.Status(fiber.StatusNotFound).JSON(webfinger.Response{ + return c.Status(fiber.StatusBadRequest).JSON(webfinger.Response{ Error: helpers.StringPtr("The requested user is a remote user"), }) } wf, err := i.userService.GetWebfingerForUser(c.UserContext(), userID.ID) if err != nil { + if errors.Is(err, api_schema.ErrUserNotFound) { + return c.Status(fiber.StatusNotFound).JSON(webfinger.Response{ + Error: helpers.StringPtr("User could not be found"), + }) + } + return c.Status(fiber.StatusInternalServerError).JSON(webfinger.Response{ Error: helpers.StringPtr("Failed to query user"), }) diff --git a/internal/repository/repo_impls/follow_repository_impl.go b/internal/repository/repo_impls/follow_repository_impl.go index b7a8c1e..01a0f45 100644 --- a/internal/repository/repo_impls/follow_repository_impl.go +++ b/internal/repository/repo_impls/follow_repository_impl.go @@ -36,7 +36,7 @@ func NewFollowRepositoryImpl(db *ent.Client, log logr.Logger, telemetry *unitel. } func (i FollowRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entity.Follow, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.FollowRepositoryImpl.GetByID"). + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/FollowRepositoryImpl.GetByID"). AddAttribute("followID", id) defer s.End() ctx = s.Context() @@ -58,7 +58,7 @@ func (i FollowRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entit } func (i FollowRepositoryImpl) Follow(ctx context.Context, follower, followee *entity.User) (*entity.Follow, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.FollowRepositoryImpl.Follow"). + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/FollowRepositoryImpl.Follow"). AddAttribute("follower", follower.URI). AddAttribute("followee", followee.URI) defer s.End() @@ -101,7 +101,7 @@ func (i FollowRepositoryImpl) Follow(ctx context.Context, follower, followee *en } func (i FollowRepositoryImpl) Unfollow(ctx context.Context, follower, followee *entity.User) error { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.FollowRepositoryImpl.Unfollow"). + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/FollowRepositoryImpl.Unfollow"). AddAttribute("follower", follower.URI). AddAttribute("followee", followee.URI) defer s.End() @@ -121,7 +121,7 @@ func (i FollowRepositoryImpl) Unfollow(ctx context.Context, follower, followee * } func (i FollowRepositoryImpl) AcceptFollow(ctx context.Context, follower, followee *entity.User) error { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.FollowRepositoryImpl.AcceptFollow"). + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/FollowRepositoryImpl.AcceptFollow"). AddAttribute("follower", follower.URI). AddAttribute("followee", followee.URI) defer s.End() @@ -141,7 +141,7 @@ func (i FollowRepositoryImpl) AcceptFollow(ctx context.Context, follower, follow } func (i FollowRepositoryImpl) RejectFollow(ctx context.Context, follower, followee *entity.User) error { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.FollowRepositoryImpl.RejectFollow"). + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/FollowRepositoryImpl.RejectFollow"). AddAttribute("follower", follower.URI). AddAttribute("followee", followee.URI) defer s.End() diff --git a/internal/repository/repo_impls/instance_metadata_repository_impl.go b/internal/repository/repo_impls/instance_metadata_repository_impl.go new file mode 100644 index 0000000..9573258 --- /dev/null +++ b/internal/repository/repo_impls/instance_metadata_repository_impl.go @@ -0,0 +1,62 @@ +package repo_impls + +import ( + "context" + "git.devminer.xyz/devminer/unitel" + "github.com/go-logr/logr" + "github.com/lysand-org/versia-go/ent" + "github.com/lysand-org/versia-go/ent/instancemetadata" + "github.com/lysand-org/versia-go/internal/entity" + "github.com/lysand-org/versia-go/internal/repository" + "github.com/lysand-org/versia-go/internal/service" + "github.com/lysand-org/versia-go/pkg/lysand" +) + +var _ repository.InstanceMetadataRepository = (*InstanceMetadataRepositoryImpl)(nil) + +type InstanceMetadataRepositoryImpl struct { + federationService service.FederationService + + db *ent.Client + log logr.Logger + telemetry *unitel.Telemetry +} + +func NewInstanceMetadataRepositoryImpl(federationService service.FederationService, db *ent.Client, log logr.Logger, telemetry *unitel.Telemetry) repository.InstanceMetadataRepository { + return &InstanceMetadataRepositoryImpl{ + federationService: federationService, + + db: db, + log: log, + telemetry: telemetry, + } +} + +func (i *InstanceMetadataRepositoryImpl) GetByHost(ctx context.Context, host string) (*entity.InstanceMetadata, error) { + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/InstanceMetadataRepositoryImpl.GetByHost"). + AddAttribute("host", host) + defer s.End() + ctx = s.Context() + + m, err := i.db.InstanceMetadata.Query(). + Where(instancemetadata.Host(host)). + WithAdmins(). + WithModerators(). + Only(ctx) + if err != nil { + return nil, err + } + + return entity.NewInstanceMetadata(m) +} + +func (i *InstanceMetadataRepositoryImpl) ImportFromLysandByURI(ctx context.Context, uri *lysand.URL) (*entity.InstanceMetadata, error) { + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/InstanceMetadataRepositoryImpl.ImportFromLysandByURI"). + AddAttribute("uri", uri.String()) + defer s.End() + ctx = s.Context() + + //i.federationService. + + return nil, nil +} diff --git a/internal/repository/repo_impls/manager.go b/internal/repository/repo_impls/manager.go index 327c084..b86dc0d 100644 --- a/internal/repository/repo_impls/manager.go +++ b/internal/repository/repo_impls/manager.go @@ -15,32 +15,38 @@ type Factory[T any] func(db *ent.Client, log logr.Logger, telemetry *unitel.Tele var _ repository.Manager = (*ManagerImpl)(nil) type ManagerImpl struct { - users repository.UserRepository - notes repository.NoteRepository - follows repository.FollowRepository + users repository.UserRepository + notes repository.NoteRepository + follows repository.FollowRepository + instanceMetadata repository.InstanceMetadataRepository - uRFactory Factory[repository.UserRepository] - nRFactory Factory[repository.NoteRepository] - fRFactory Factory[repository.FollowRepository] + uRFactory Factory[repository.UserRepository] + nRFactory Factory[repository.NoteRepository] + fRFactory Factory[repository.FollowRepository] + imRFactory Factory[repository.InstanceMetadataRepository] db *ent.Client log logr.Logger telemetry *unitel.Telemetry } -func NewManagerImpl(db *ent.Client, telemetry *unitel.Telemetry, log logr.Logger, userRepositoryFunc Factory[repository.UserRepository], noteRepositoryFunc Factory[repository.NoteRepository], followRepositoryFunc Factory[repository.FollowRepository]) *ManagerImpl { - userRepository := userRepositoryFunc(db, log.WithName("users"), telemetry) - noteRepository := noteRepositoryFunc(db, log.WithName("notes"), telemetry) - followRepository := followRepositoryFunc(db, log.WithName("follows"), telemetry) - +func NewManagerImpl( + db *ent.Client, telemetry *unitel.Telemetry, log logr.Logger, + userRepositoryFunc Factory[repository.UserRepository], + noteRepositoryFunc Factory[repository.NoteRepository], + followRepositoryFunc Factory[repository.FollowRepository], + instanceMetadataRepositoryFunc Factory[repository.InstanceMetadataRepository], +) *ManagerImpl { return &ManagerImpl{ - users: userRepository, - notes: noteRepository, - follows: followRepository, + users: userRepositoryFunc(db, log.WithName("users"), telemetry), + notes: noteRepositoryFunc(db, log.WithName("notes"), telemetry), + follows: followRepositoryFunc(db, log.WithName("follows"), telemetry), + instanceMetadata: instanceMetadataRepositoryFunc(db, log.WithName("instanceMetadata"), telemetry), - uRFactory: userRepositoryFunc, - nRFactory: noteRepositoryFunc, - fRFactory: followRepositoryFunc, + uRFactory: userRepositoryFunc, + nRFactory: noteRepositoryFunc, + fRFactory: followRepositoryFunc, + imRFactory: instanceMetadataRepositoryFunc, db: db, log: log, @@ -49,11 +55,17 @@ func NewManagerImpl(db *ent.Client, telemetry *unitel.Telemetry, log logr.Logger } func (i *ManagerImpl) withDB(db *ent.Client) *ManagerImpl { - return NewManagerImpl(db, i.telemetry, i.log, i.uRFactory, i.nRFactory, i.fRFactory) + return NewManagerImpl( + db, i.telemetry, i.log, + i.uRFactory, + i.nRFactory, + i.fRFactory, + i.imRFactory, + ) } func (i *ManagerImpl) Atomic(ctx context.Context, fn func(ctx context.Context, tx repository.Manager) error) error { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.ManagerImpl.Atomic") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/ManagerImpl.Atomic") defer s.End() ctx = s.Context() @@ -88,3 +100,7 @@ func (i *ManagerImpl) Notes() repository.NoteRepository { func (i *ManagerImpl) Follows() repository.FollowRepository { return i.follows } + +func (i *ManagerImpl) InstanceMetadata() repository.InstanceMetadataRepository { + return i.instanceMetadata +} diff --git a/internal/repository/repo_impls/note_repository_impl.go b/internal/repository/repo_impls/note_repository_impl.go index 4712ec4..4ac3872 100644 --- a/internal/repository/repo_impls/note_repository_impl.go +++ b/internal/repository/repo_impls/note_repository_impl.go @@ -31,7 +31,7 @@ func NewNoteRepositoryImpl(db *ent.Client, log logr.Logger, telemetry *unitel.Te } func (i *NoteRepositoryImpl) NewNote(ctx context.Context, author *entity.User, content string, mentions []*entity.User) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.NoteRepositoryImpl.NewNote") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.NewNote") defer s.End() ctx = s.Context() @@ -63,7 +63,7 @@ func (i *NoteRepositoryImpl) NewNote(ctx context.Context, author *entity.User, c } func (i *NoteRepositoryImpl) ImportLysandNote(ctx context.Context, lNote *lysand.Note) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.NoteRepositoryImpl.ImportLysandNote") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.ImportLysandNote") defer s.End() ctx = s.Context() @@ -91,7 +91,7 @@ func (i *NoteRepositoryImpl) ImportLysandNote(ctx context.Context, lNote *lysand } func (i *NoteRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.NoteRepositoryImpl.LookupByIDOrUsername") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.LookupByIDOrUsername") defer s.End() ctx = s.Context() diff --git a/internal/repository/repo_impls/user_repository_impl.go b/internal/repository/repo_impls/user_repository_impl.go index 549327b..b5e3cc0 100644 --- a/internal/repository/repo_impls/user_repository_impl.go +++ b/internal/repository/repo_impls/user_repository_impl.go @@ -4,6 +4,7 @@ import ( "context" "crypto/ed25519" "errors" + "github.com/lysand-org/versia-go/config" "github.com/lysand-org/versia-go/internal/repository" "github.com/lysand-org/versia-go/internal/service" "golang.org/x/crypto/bcrypt" @@ -45,7 +46,7 @@ func NewUserRepositoryImpl(federationService service.FederationService, db *ent. } func (i *UserRepositoryImpl) NewUser(ctx context.Context, username, password string, priv ed25519.PrivateKey, pub ed25519.PublicKey) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.NewUser") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.NewUser") defer s.End() ctx = s.Context() @@ -62,8 +63,10 @@ func (i *UserRepositoryImpl) NewUser(ctx context.Context, username, password str SetURI(utils.UserAPIURL(uid).String()). SetUsername(username). SetPasswordHash(pwHash). - SetPublicKey(pub). SetPrivateKey(priv). + SetPublicKey(pub). + SetPublicKeyAlgorithm("ed25519"). + SetPublicKeyActor(utils.UserAPIURL(uid).String()). SetInbox(utils.UserInboxAPIURL(uid).String()). SetOutbox(utils.UserOutboxAPIURL(uid).String()). SetFeatured(utils.UserFeaturedAPIURL(uid).String()). @@ -82,7 +85,7 @@ func (i *UserRepositoryImpl) NewUser(ctx context.Context, username, password str } func (i *UserRepositoryImpl) ImportLysandUserByURI(ctx context.Context, uri *lysand.URL) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.ImportLysandUserByURI") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.ImportLysandUserByURI") defer s.End() ctx = s.Context() @@ -99,7 +102,9 @@ func (i *UserRepositoryImpl) ImportLysandUserByURI(ctx context.Context, uri *lys SetUsername(lUser.Username). SetNillableDisplayName(lUser.DisplayName). SetBiography(lUser.Bio.String()). - SetPublicKey(lUser.PublicKey.PublicKey.ToStd()). + SetPublicKey(lUser.PublicKey.RawKey). + SetPublicKeyAlgorithm(lUser.PublicKey.Algorithm). + SetPublicKeyActor(lUser.PublicKey.Actor.String()). SetIndexable(lUser.Indexable). SetFields(lUser.Fields). SetExtensions(lUser.Extensions). @@ -127,11 +132,66 @@ func (i *UserRepositoryImpl) ImportLysandUserByURI(ctx context.Context, uri *lys return entity.NewUser(u) } -func (i *UserRepositoryImpl) Resolve(ctx context.Context, uri *lysand.URL) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.Resolve") +func (i *UserRepositoryImpl) Discover(ctx context.Context, domain, username string) (*entity.User, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/UserServiceImpl.Search"). + AddAttribute("username", username). + AddAttribute("domain", domain) defer s.End() ctx = s.Context() + l := i.log.WithValues("domain", domain, "username", username) + + // TODO: This *could* go wrong + if domain != config.C.Host { + l.V(2).Info("Discovering instance") + + im, err := i.federationService.DiscoverInstance(ctx, domain) + if err != nil { + l.Error(err, "Failed to discover instance") + return nil, err + } + + l = l.WithValues("host", im.Host) + + l.V(2).Info("Discovering user") + + wf, err := i.federationService.DiscoverUser(ctx, im.Host, username) + if err != nil { + l.Error(err, "Failed to discover user") + return nil, err + } + + l.V(2).Info("Found remote user", "userURI", wf.URI) + + u, err := i.Resolve(ctx, lysand.URLFromStd(wf.URI)) + if err != nil { + l.Error(err, "Failed to resolve user") + return nil, err + } + + return u, nil + } + + l.V(2).Info("Finding local user") + + u, err := i.GetLocalByUsername(ctx, username) + if err != nil { + l.Error(err, "Failed to find local user", "username", username) + return nil, err + } + + l.V(2).Info("Found local user", "userURI", u.URI) + + return u, nil +} + +func (i *UserRepositoryImpl) Resolve(ctx context.Context, uri *lysand.URL) (*entity.User, error) { + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.Resolve") + defer s.End() + ctx = s.Context() + + l := i.log.WithValues("uri", uri) + u, err := i.LookupByURI(ctx, uri) if err != nil { return nil, err @@ -139,24 +199,24 @@ func (i *UserRepositoryImpl) Resolve(ctx context.Context, uri *lysand.URL) (*ent // check if the user is already imported if u == nil { - i.log.V(2).Info("User not found in DB", "uri", uri) + l.V(2).Info("User not found in DB") u, err := i.ImportLysandUserByURI(ctx, uri) if err != nil { - i.log.Error(err, "Failed to import user", "uri", uri) + l.Error(err, "Failed to import user") return nil, err } return u, nil } - i.log.V(2).Info("User found in DB", "uri", uri) + l.V(2).Info("User found in DB") return u, nil } func (i *UserRepositoryImpl) ResolveMultiple(ctx context.Context, uris []lysand.URL) ([]*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.ResolveMultiple") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.ResolveMultiple") defer s.End() ctx = s.Context() @@ -168,25 +228,27 @@ func (i *UserRepositoryImpl) ResolveMultiple(ctx context.Context, uris []lysand. // TODO: Refactor to use async imports using a work queue outer: for _, uri := range uris { + l := i.log.WithValues("uri", uri) + // check if the user is already imported for _, u := range us { if uri.String() == u.URI.String() { - i.log.V(2).Info("User found in DB", "uri", uri) + l.V(2).Info("User found in DB") continue outer } } - i.log.V(2).Info("User not found in DB", "uri", uri) + l.V(2).Info("User not found in DB") importedUser, err := i.ImportLysandUserByURI(ctx, &uri) if err != nil { - i.log.Error(err, "Failed to import user", "uri", uri) + l.Error(err, "Failed to import user") continue } - i.log.V(2).Info("Imported user", "uri", uri) + l.V(2).Info("Imported user") us = append(us, importedUser) } @@ -195,10 +257,12 @@ outer: } func (i *UserRepositoryImpl) GetByID(ctx context.Context, uid uuid.UUID) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.GetByID") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.GetByID") defer s.End() ctx = s.Context() + l := i.log.WithValues("id", uid) + u, err := i.db.User.Query(). Where(user.IDEQ(uid)). WithAvatarImage(). @@ -206,25 +270,27 @@ func (i *UserRepositoryImpl) GetByID(ctx context.Context, uid uuid.UUID) (*entit Only(ctx) if err != nil { if !ent.IsNotFound(err) { - i.log.Error(err, "Failed to query user", "id", uid) + l.Error(err, "Failed to query user") return nil, err } - i.log.V(2).Info("User not found in DB", "id", uid) + l.V(2).Info("User not found in DB") return nil, nil } - i.log.V(2).Info("User found in DB", "id", uid) + l.V(2).Info("User found in DB") return entity.NewUser(u) } func (i *UserRepositoryImpl) GetLocalByID(ctx context.Context, uid uuid.UUID) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.GetLocalByID") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.GetLocalByID") defer s.End() ctx = s.Context() + l := i.log.WithValues("id", uid) + u, err := i.db.User.Query(). Where(user.And(user.ID(uid), user.IsRemote(false))). WithAvatarImage(). @@ -232,47 +298,77 @@ func (i *UserRepositoryImpl) GetLocalByID(ctx context.Context, uid uuid.UUID) (* Only(ctx) if err != nil { if !ent.IsNotFound(err) { - i.log.Error(err, "Failed to query local user", "id", uid) + l.Error(err, "Failed to query local user") return nil, err } - i.log.V(2).Info("Local user not found in DB", "id", uid) + l.V(2).Info("Local user not found in DB") return nil, nil } - i.log.V(2).Info("Local user found in DB", "id", uid) + l.V(2).Info("Local user found in DB", "uri", u.URI) + + return entity.NewUser(u) +} + +func (i *UserRepositoryImpl) GetLocalByUsername(ctx context.Context, username string) (*entity.User, error) { + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.GetLocalByUsername") + defer s.End() + ctx = s.Context() + + l := i.log.WithValues("username", username) + + u, err := i.db.User.Query(). + Where(user.And(user.Username(username), user.IsRemote(false))). + WithAvatarImage(). + WithHeaderImage(). + Only(ctx) + if err != nil { + if !ent.IsNotFound(err) { + l.Error(err, "Failed to query local user") + return nil, err + } + + l.V(2).Info("Local user not found in DB") + + return nil, nil + } + + l.V(2).Info("Local user found in DB", "uri", u.URI) return entity.NewUser(u) } func (i *UserRepositoryImpl) LookupByURI(ctx context.Context, uri *lysand.URL) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.LookupByURI") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.LookupByURI") defer s.End() ctx = s.Context() + l := i.log.WithValues("uri", uri) + // check if the user is already imported u, err := i.db.User.Query(). Where(user.URI(uri.String())). Only(ctx) if err != nil { if !ent.IsNotFound(err) { - i.log.Error(err, "Failed to query user", "uri", uri) + l.Error(err, "Failed to query user") return nil, err } - i.log.V(2).Info("User not found in DB", "uri", uri) + l.V(2).Info("User not found in DB") return nil, nil } - i.log.V(2).Info("User found in DB", "uri", uri) + l.V(2).Info("User found in DB") return entity.NewUser(u) } func (i *UserRepositoryImpl) LookupByURIs(ctx context.Context, uris []lysand.URL) ([]*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.LookupByURIs") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.LookupByURIs") defer s.End() ctx = s.Context() @@ -292,7 +388,7 @@ func (i *UserRepositoryImpl) LookupByURIs(ctx context.Context, uris []lysand.URL } func (i *UserRepositoryImpl) LookupByIDOrUsername(ctx context.Context, idOrUsername string) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "repository/repo_impls.UserRepositoryImpl.LookupByIDOrUsername") + s := i.telemetry.StartSpan(ctx, "function", "repo_impls/UserRepositoryImpl.LookupByIDOrUsername") defer s.End() ctx = s.Context() @@ -303,6 +399,8 @@ func (i *UserRepositoryImpl) LookupByIDOrUsername(ctx context.Context, idOrUsern preds = append(preds, user.UsernameEQ(idOrUsername)) } + l := i.log.WithValues("idOrUsername", idOrUsername) + u, err := i.db.User.Query(). Where(preds...). WithAvatarImage(). @@ -310,16 +408,16 @@ func (i *UserRepositoryImpl) LookupByIDOrUsername(ctx context.Context, idOrUsern Only(ctx) if err != nil { if !ent.IsNotFound(err) { - i.log.Error(err, "Failed to query user", "idOrUsername", idOrUsername) + l.Error(err, "Failed to query user") return nil, err } - i.log.V(2).Info("User not found in DB", "idOrUsername", idOrUsername) + l.V(2).Info("User not found in DB") return nil, nil } - i.log.V(2).Info("User found in DB", "idOrUsername", idOrUsername, "id", u.ID) + l.V(2).Info("User found in DB", "id", u.ID) return entity.NewUser(u) } diff --git a/internal/repository/repository.go b/internal/repository/repository.go index ba10e4b..13479a7 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -15,6 +15,9 @@ type UserRepository interface { GetByID(ctx context.Context, id uuid.UUID) (*entity.User, error) GetLocalByID(ctx context.Context, id uuid.UUID) (*entity.User, error) + GetLocalByUsername(ctx context.Context, username string) (*entity.User, error) + + Discover(ctx context.Context, host, username string) (*entity.User, error) Resolve(ctx context.Context, uri *lysand.URL) (*entity.User, error) ResolveMultiple(ctx context.Context, uris []lysand.URL) ([]*entity.User, error) @@ -40,10 +43,16 @@ type NoteRepository interface { GetByID(ctx context.Context, idOrUsername uuid.UUID) (*entity.Note, error) } +type InstanceMetadataRepository interface { + GetByHost(ctx context.Context, host string) (*entity.InstanceMetadata, error) + ImportFromLysandByURI(ctx context.Context, uri *lysand.URL) (*entity.InstanceMetadata, error) +} + type Manager interface { Atomic(ctx context.Context, fn func(ctx context.Context, tx Manager) error) error Users() UserRepository Notes() NoteRepository Follows() FollowRepository + InstanceMetadata() InstanceMetadataRepository } diff --git a/internal/service/service.go b/internal/service/service.go index a7c1764..3f44a62 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -2,6 +2,7 @@ package service import ( "context" + "github.com/gofiber/fiber/v2" "github.com/lysand-org/versia-go/internal/repository" "github.com/google/uuid" @@ -19,11 +20,16 @@ type UserService interface { GetUserByID(ctx context.Context, id uuid.UUID) (*entity.User, error) GetWebfingerForUser(ctx context.Context, userID string) (*webfinger.User, error) + + Search(ctx context.Context, req api_schema.SearchUserRequest) (*entity.User, error) } type FederationService interface { SendToInbox(ctx context.Context, author *entity.User, target *entity.User, object any) ([]byte, error) GetUser(ctx context.Context, uri *lysand.URL) (*lysand.User, error) + + DiscoverUser(ctx context.Context, baseURL, username string) (*webfinger.User, error) + DiscoverInstance(ctx context.Context, baseURL string) (*lysand.InstanceMetadata, error) } type InboxService interface { @@ -44,6 +50,14 @@ type FollowService interface { ImportLysandFollow(ctx context.Context, lFollow *lysand.Follow) (*entity.Follow, error) } +type InstanceMetadataService interface { + Ours(ctx context.Context) (*entity.InstanceMetadata, error) +} + type TaskService interface { ScheduleTask(ctx context.Context, type_ string, data any) error } + +type RequestSigner interface { + Sign(c *fiber.Ctx, signer lysand.Signer, body any) error +} diff --git a/internal/service/svc_impls/Inbox_service_impl.go b/internal/service/svc_impls/Inbox_service_impl.go index 0a89b14..fe614c0 100644 --- a/internal/service/svc_impls/Inbox_service_impl.go +++ b/internal/service/svc_impls/Inbox_service_impl.go @@ -18,29 +18,31 @@ import ( var _ service.InboxService = (*InboxServiceImpl)(nil) type InboxServiceImpl struct { - repositories repository.Manager - federationService service.FederationService + repositories repository.Manager + telemetry *unitel.Telemetry log logr.Logger } -func NewInboxService(repositories repository.Manager, federationService service.FederationService, telemetry *unitel.Telemetry, log logr.Logger) *InboxServiceImpl { +func NewInboxService(federationService service.FederationService, repositories repository.Manager, telemetry *unitel.Telemetry, log logr.Logger) *InboxServiceImpl { return &InboxServiceImpl{ - repositories: repositories, federationService: federationService, - telemetry: telemetry, - log: log, + + repositories: repositories, + + telemetry: telemetry, + log: log, } } func (i InboxServiceImpl) WithRepositories(repositories repository.Manager) service.InboxService { - return NewInboxService(repositories, i.federationService, i.telemetry, i.log) + return NewInboxService(i.federationService, repositories, i.telemetry, i.log) } func (i InboxServiceImpl) Handle(ctx context.Context, obj any, userId uuid.UUID) error { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.InboxServiceImpl.Handle") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/InboxServiceImpl.Handle") defer s.End() ctx = s.Context() @@ -87,7 +89,7 @@ func (i InboxServiceImpl) Handle(ctx context.Context, obj any, userId uuid.UUID) } func (i InboxServiceImpl) handleFollow(ctx context.Context, o lysand.Follow, u *entity.User) error { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.InboxServiceImpl.handleFollow") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/InboxServiceImpl.handleFollow") defer s.End() ctx = s.Context() @@ -129,7 +131,7 @@ func (i InboxServiceImpl) handleFollow(ctx context.Context, o lysand.Follow, u * } func (i InboxServiceImpl) handleNote(ctx context.Context, o lysand.Note, u *entity.User) error { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.InboxServiceImpl.handleNote") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/InboxServiceImpl.handleNote") defer s.End() ctx = s.Context() diff --git a/internal/service/svc_impls/federation_service_impl.go b/internal/service/svc_impls/federation_service_impl.go index 0eaac80..97c6360 100644 --- a/internal/service/svc_impls/federation_service_impl.go +++ b/internal/service/svc_impls/federation_service_impl.go @@ -1,17 +1,34 @@ package svc_impls import ( + "bytes" "context" + "crypto/rand" + "encoding/base64" + "encoding/json" + "errors" + "fmt" "git.devminer.xyz/devminer/unitel" "github.com/go-logr/logr" "github.com/lysand-org/versia-go/internal/entity" "github.com/lysand-org/versia-go/internal/service" "github.com/lysand-org/versia-go/pkg/lysand" + versiacrypto "github.com/lysand-org/versia-go/pkg/lysand/crypto" + "github.com/lysand-org/versia-go/pkg/protoretry" + "github.com/lysand-org/versia-go/pkg/webfinger" + "net/http" + "net/url" ) -var _ service.FederationService = (*FederationServiceImpl)(nil) +var ( + _ service.FederationService = (*FederationServiceImpl)(nil) + + ErrSignatureValidationFailed = errors.New("signature validation failed") +) type FederationServiceImpl struct { + httpC *protoretry.Client + federationClient *lysand.FederationClient telemetry *unitel.Telemetry @@ -19,38 +36,139 @@ type FederationServiceImpl struct { log logr.Logger } -func NewFederationServiceImpl(federationClient *lysand.FederationClient, telemetry *unitel.Telemetry, log logr.Logger) *FederationServiceImpl { +func NewFederationServiceImpl(httpClient *http.Client, federationClient *lysand.FederationClient, telemetry *unitel.Telemetry, log logr.Logger) *FederationServiceImpl { return &FederationServiceImpl{ + httpC: protoretry.New(httpClient), federationClient: federationClient, telemetry: telemetry, log: log, } } -func (i FederationServiceImpl) SendToInbox(ctx context.Context, author *entity.User, target *entity.User, object any) ([]byte, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.FederationServiceImpl.SendToInbox") +func (i *FederationServiceImpl) GetUser(ctx context.Context, uri *lysand.URL) (*lysand.User, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FederationServiceImpl.GetUser"). + AddAttribute("userURI", uri.String()) defer s.End() ctx = s.Context() - response, err := i.federationClient.SendToInbox(ctx, author.Signer, target.ToLysand(), object) + body, resp, err := i.httpC.GET(ctx, uri.ToStd()) if err != nil { - i.log.Error(err, "Failed to send to inbox", "author", author.ID, "target", target.ID) - return response, err - } - - return response, nil -} - -func (i FederationServiceImpl) GetUser(ctx context.Context, uri *lysand.URL) (*lysand.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.FederationServiceImpl.GetUser") - defer s.End() - ctx = s.Context() - - u, err := i.federationClient.GetUser(ctx, uri.ToStd()) - if err != nil { - i.log.Error(err, "Failed to fetch remote user", "uri", uri) + s.SetSimpleStatus(unitel.Error, err.Error()) return nil, err } + u := &lysand.User{} + if err := json.Unmarshal(body, u); err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + fedHeaders, err := lysand.ExtractFederationHeaders(resp.Header) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + v := lysand.Verifier{PublicKey: u.PublicKey.Key.Key} + if !v.Verify("GET", uri.ToStd(), body, fedHeaders) { + s.SetSimpleStatus(unitel.Error, ErrSignatureValidationFailed.Error()) + i.log.V(1).Error(ErrSignatureValidationFailed, "signature validation failed", "user", u.URI.String()) + return nil, ErrSignatureValidationFailed + } + + s.SetSimpleStatus(unitel.Ok, "") + i.log.V(2).Info("signature verification succeeded", "user", u.URI.String()) + return u, nil } + +func (i *FederationServiceImpl) DiscoverUser(ctx context.Context, baseURL, username string) (*webfinger.User, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FederationServiceImpl.DiscoverUser"). + AddAttribute("baseURL", baseURL). + AddAttribute("username", username) + defer s.End() + ctx = s.Context() + + wf, err := webfinger.Discover(i.httpC, ctx, baseURL, username) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + s.SetSimpleStatus(unitel.Ok, "") + + return wf, nil +} + +func (i *FederationServiceImpl) DiscoverInstance(ctx context.Context, baseURL string) (*lysand.InstanceMetadata, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FederationServiceImpl.DiscoverInstance"). + AddAttribute("baseURL", baseURL) + defer s.End() + ctx = s.Context() + + body, resp, err := i.httpC.GET(ctx, &url.URL{Scheme: "https", Host: baseURL, Path: "/.well-known/versia"}) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } else if resp.StatusCode >= http.StatusBadRequest { + s.SetSimpleStatus(unitel.Error, fmt.Sprintf("unexpected response code: %d", resp.StatusCode)) + return nil, &lysand.ResponseError{StatusCode: resp.StatusCode, URL: resp.Request.URL} + } + + var metadata lysand.InstanceMetadata + if err := json.Unmarshal(body, &metadata); err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + s.SetSimpleStatus(unitel.Ok, "") + + return &metadata, nil +} + +func (i *FederationServiceImpl) SendToInbox(ctx context.Context, author *entity.User, user *entity.User, object any) ([]byte, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FederationServiceImpl.SendToInbox"). + SetUser(uint64(author.ID.ID()), author.Username, "", ""). + AddAttribute("author", author.ID). + AddAttribute("authorURI", author.URI). + AddAttribute("target", user.ID). + AddAttribute("targetURI", user.URI) + defer s.End() + ctx = s.Context() + + uri := user.Inbox.ToStd() + + body, err := json.Marshal(object) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + nonce := make([]byte, 32) + if _, err := rand.Read(nonce); err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + sigData := lysand.NewSignatureData("POST", base64.StdEncoding.EncodeToString(nonce), uri, versiacrypto.SHA256(body)) + sig := author.Signer.Sign(*sigData) + + req, err := http.NewRequestWithContext(ctx, "POST", uri.String(), bytes.NewReader(body)) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + return nil, err + } + + sig.Inject(req.Header) + + body, _, err = i.httpC.DoReq(req) + if err != nil { + s.SetSimpleStatus(unitel.Error, err.Error()) + i.log.Error(err, "Failed to send to inbox", "author", author.URI, "target", user.URI) + return nil, err + } + + s.SetSimpleStatus(unitel.Ok, "") + + return body, nil +} diff --git a/internal/service/svc_impls/follow_service_impl.go b/internal/service/svc_impls/follow_service_impl.go index a9ee8c9..a337efe 100644 --- a/internal/service/svc_impls/follow_service_impl.go +++ b/internal/service/svc_impls/follow_service_impl.go @@ -33,7 +33,7 @@ func NewFollowServiceImpl(federationService service.FederationService, repositor } func (i FollowServiceImpl) NewFollow(ctx context.Context, follower, followee *entity.User) (*entity.Follow, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.FollowServiceImpl.NewFollow"). + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FollowServiceImpl.NewFollow"). AddAttribute("follower", follower.URI). AddAttribute("followee", followee.URI) defer s.End() @@ -54,7 +54,7 @@ func (i FollowServiceImpl) NewFollow(ctx context.Context, follower, followee *en } func (i FollowServiceImpl) GetFollow(ctx context.Context, id uuid.UUID) (*entity.Follow, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.FollowServiceImpl.GetFollow"). + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FollowServiceImpl.GetFollow"). AddAttribute("followID", id) defer s.End() ctx = s.Context() @@ -70,7 +70,7 @@ func (i FollowServiceImpl) GetFollow(ctx context.Context, id uuid.UUID) (*entity } func (i FollowServiceImpl) ImportLysandFollow(ctx context.Context, lFollow *lysand.Follow) (*entity.Follow, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.FollowServiceImpl.ImportLysandFollow"). + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/FollowServiceImpl.ImportLysandFollow"). AddAttribute("uri", lFollow.URI.String()) defer s.End() ctx = s.Context() diff --git a/internal/service/svc_impls/instance_metadata_service_impl.go b/internal/service/svc_impls/instance_metadata_service_impl.go new file mode 100644 index 0000000..757cd64 --- /dev/null +++ b/internal/service/svc_impls/instance_metadata_service_impl.go @@ -0,0 +1,52 @@ +package svc_impls + +import ( + "context" + "github.com/lysand-org/versia-go/config" + "github.com/lysand-org/versia-go/ent" + "github.com/lysand-org/versia-go/internal/repository" + "github.com/lysand-org/versia-go/internal/service" + + "git.devminer.xyz/devminer/unitel" + "github.com/go-logr/logr" + "github.com/lysand-org/versia-go/internal/entity" +) + +var _ service.InstanceMetadataService = (*InstanceMetadataServiceImpl)(nil) + +type InstanceMetadataServiceImpl struct { + federationService service.FederationService + + repositories repository.Manager + + telemetry *unitel.Telemetry + log logr.Logger +} + +func NewInstanceMetadataServiceImpl(federationService service.FederationService, repositories repository.Manager, telemetry *unitel.Telemetry, log logr.Logger) *InstanceMetadataServiceImpl { + return &InstanceMetadataServiceImpl{ + federationService: federationService, + + repositories: repositories, + + telemetry: telemetry, + log: log, + } +} + +func (i InstanceMetadataServiceImpl) Ours(ctx context.Context) (*entity.InstanceMetadata, error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/InstanceMetadataServiceImpl.Ours") + defer s.End() + ctx = s.Context() + + m, err := i.repositories.InstanceMetadata().GetByHost(ctx, config.C.Host) + if err != nil { + if ent.IsNotFound(err) { + panic("could not find our own instance metadata") + } + + return nil, err + } + + return m, nil +} diff --git a/internal/service/svc_impls/note_service_impl.go b/internal/service/svc_impls/note_service_impl.go index 21a59d0..ae4709b 100644 --- a/internal/service/svc_impls/note_service_impl.go +++ b/internal/service/svc_impls/note_service_impl.go @@ -39,7 +39,7 @@ func NewNoteServiceImpl(federationService service.FederationService, taskService } func (i NoteServiceImpl) CreateNote(ctx context.Context, req api_schema.CreateNoteRequest) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.NoteServiceImpl.CreateNote") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.CreateNote") defer s.End() ctx = s.Context() @@ -82,7 +82,7 @@ func (i NoteServiceImpl) CreateNote(ctx context.Context, req api_schema.CreateNo } func (i NoteServiceImpl) GetNote(ctx context.Context, id uuid.UUID) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.NoteServiceImpl.GetUserByID") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.GetUserByID") defer s.End() ctx = s.Context() @@ -90,7 +90,7 @@ func (i NoteServiceImpl) GetNote(ctx context.Context, id uuid.UUID) (*entity.Not } func (i NoteServiceImpl) ImportLysandNote(ctx context.Context, lNote *lysand.Note) (*entity.Note, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.NoteServiceImpl.ImportLysandNote") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.ImportLysandNote") defer s.End() ctx = s.Context() diff --git a/internal/service/svc_impls/request_signer_impl.go b/internal/service/svc_impls/request_signer_impl.go new file mode 100644 index 0000000..0eeec03 --- /dev/null +++ b/internal/service/svc_impls/request_signer_impl.go @@ -0,0 +1,63 @@ +package svc_impls + +import ( + "crypto/rand" + "encoding/base64" + "encoding/json" + "git.devminer.xyz/devminer/unitel" + "github.com/go-logr/logr" + "github.com/gofiber/fiber/v2" + "github.com/lysand-org/versia-go/internal/service" + "github.com/lysand-org/versia-go/pkg/lysand" + versiacrypto "github.com/lysand-org/versia-go/pkg/lysand/crypto" + "net/url" +) + +var _ service.RequestSigner = (*RequestSignerImpl)(nil) + +type RequestSignerImpl struct { + telemetry *unitel.Telemetry + + log logr.Logger +} + +func NewRequestSignerImpl(telemetry *unitel.Telemetry, log logr.Logger) *RequestSignerImpl { + return &RequestSignerImpl{ + telemetry: telemetry, + log: log, + } +} + +func (i *RequestSignerImpl) Sign(c *fiber.Ctx, signer lysand.Signer, body any) error { + s := i.telemetry.StartSpan(c.UserContext(), "function", "svc_impls/RequestSignerImpl.Sign") + defer s.End() + + j, err := json.Marshal(body) + if err != nil { + return err + } + + rawNonce := make([]byte, 64) + if _, err := rand.Read(rawNonce); err != nil { + return err + } + nonce := base64.StdEncoding.EncodeToString(rawNonce) + + uri, err := url.ParseRequestURI(string(c.Request().RequestURI())) + if err != nil { + return err + } + + digest := versiacrypto.SHA256(j) + + d := lysand.NewSignatureData(c.Method(), nonce, uri, digest) + + signed := signer.Sign(*d) + for k, v := range signed.Headers() { + c.Set(k, v) + } + + i.log.V(2).Info("signed response", "digest", base64.StdEncoding.EncodeToString(digest), "nonce", nonce) + + return c.Send(j) +} diff --git a/internal/service/svc_impls/task_service_impl.go b/internal/service/svc_impls/task_service_impl.go index e10b994..a2c6c67 100644 --- a/internal/service/svc_impls/task_service_impl.go +++ b/internal/service/svc_impls/task_service_impl.go @@ -28,7 +28,7 @@ func NewTaskServiceImpl(client *taskqueue.Client, telemetry *unitel.Telemetry, l } func (i TaskServiceImpl) ScheduleTask(ctx context.Context, type_ string, data any) error { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.TaskServiceImpl.ScheduleTask") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/TaskServiceImpl.ScheduleTask") defer s.End() ctx = s.Context() diff --git a/internal/service/svc_impls/user_service_impl.go b/internal/service/svc_impls/user_service_impl.go index f265018..f2c342e 100644 --- a/internal/service/svc_impls/user_service_impl.go +++ b/internal/service/svc_impls/user_service_impl.go @@ -4,7 +4,7 @@ import ( "context" "crypto/ed25519" "crypto/rand" - "fmt" + "github.com/lysand-org/versia-go/internal/api_schema" "github.com/lysand-org/versia-go/internal/repository" "github.com/lysand-org/versia-go/internal/service" "net/url" @@ -45,7 +45,7 @@ func (i UserServiceImpl) WithRepositories(repositories repository.Manager) servi } func (i UserServiceImpl) NewUser(ctx context.Context, username, password string) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.UserServiceImpl.NewUser") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/UserServiceImpl.NewUser") defer s.End() ctx = s.Context() @@ -73,7 +73,7 @@ func (i UserServiceImpl) NewUser(ctx context.Context, username, password string) } func (i UserServiceImpl) GetUserByID(ctx context.Context, id uuid.UUID) (*entity.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.UserServiceImpl.GetUserByID") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/UserServiceImpl.GetUserByID") defer s.End() ctx = s.Context() @@ -81,7 +81,7 @@ func (i UserServiceImpl) GetUserByID(ctx context.Context, id uuid.UUID) (*entity } func (i UserServiceImpl) GetWebfingerForUser(ctx context.Context, userID string) (*webfinger.User, error) { - s := i.telemetry.StartSpan(ctx, "function", "service/svc_impls.UserServiceImpl.GetWebfingerForUser") + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/UserServiceImpl.GetWebfingerForUser") defer s.End() ctx = s.Context() @@ -90,7 +90,7 @@ func (i UserServiceImpl) GetWebfingerForUser(ctx context.Context, userID string) return nil, err } if u == nil { - return nil, fmt.Errorf("user not found") + return nil, api_schema.ErrUserNotFound } wf := &webfinger.User{ @@ -120,3 +120,25 @@ func (i UserServiceImpl) GetWebfingerForUser(ctx context.Context, userID string) return wf, nil } + +func (i UserServiceImpl) Search(ctx context.Context, req api_schema.SearchUserRequest) (u *entity.User, err error) { + s := i.telemetry.StartSpan(ctx, "function", "svc_impls/UserServiceImpl.Search"). + AddAttribute("username", req.Username) + defer s.End() + ctx = s.Context() + + domain := "" + if req.Domain != nil { + domain = *req.Domain + } + + err = i.repositories.Atomic(ctx, func(ctx context.Context, tx repository.Manager) error { + var err error + if u, err = i.repositories.Users().Discover(ctx, domain, req.Username); err != nil { + return err + } + + return nil + }) + return +} diff --git a/internal/tasks/federate_note.go b/internal/tasks/federate_note.go index a673751..4ca7845 100644 --- a/internal/tasks/federate_note.go +++ b/internal/tasks/federate_note.go @@ -24,6 +24,10 @@ func (t *Handler) FederateNote(ctx context.Context, data FederateNoteData) error if err != nil { return err } + if n == nil { + t.log.V(-1).Info("Could not find note", "id", data.NoteID) + return nil + } for _, uu := range n.Mentions { if !uu.IsRemote { diff --git a/internal/utils/fiber.go b/internal/utils/fiber.go new file mode 100644 index 0000000..3d24d42 --- /dev/null +++ b/internal/utils/fiber.go @@ -0,0 +1,32 @@ +package utils + +import ( + "bytes" + "github.com/gofiber/fiber/v2" + "github.com/valyala/fasthttp/fasthttpadaptor" + "io" + "net/http" +) + +func ConvertToStdRequest(c *fiber.Ctx) (*http.Request, error) { + stdReq := &http.Request{} + if err := fasthttpadaptor.ConvertRequest(c.Context(), stdReq, true); err != nil { + return nil, err + } + + return stdReq, nil +} + +func CopyBody(req *http.Request) ([]byte, error) { + body, err := io.ReadAll(req.Body) + if err != nil { + return nil, err + } + + if err := req.Body.Close(); err != nil { + return nil, err + } + + req.Body = io.NopCloser(bytes.NewBuffer(body)) + return body, nil +} diff --git a/internal/utils/urls.go b/internal/utils/urls.go index 247812f..e1d4dc0 100644 --- a/internal/utils/urls.go +++ b/internal/utils/urls.go @@ -73,3 +73,23 @@ func NoteAPIURL(uuid uuid.UUID) *lysand.URL { newPath := &url.URL{Path: fmt.Sprintf("/api/notes/%s/", uuid.String())} return lysand.URLFromStd(config.C.PublicAddress.ResolveReference(newPath)) } + +func InstanceMetadataAPIURL() *lysand.URL { + newPath := &url.URL{Path: "/.well-known/versia/"} + return lysand.URLFromStd(config.C.PublicAddress.ResolveReference(newPath)) +} + +func InstanceMetadataAdminsAPIURL() *lysand.URL { + newPath := &url.URL{Path: "/.well-known/versia/admins/"} + return lysand.URLFromStd(config.C.PublicAddress.ResolveReference(newPath)) +} + +func InstanceMetadataModeratorsAPIURL() *lysand.URL { + newPath := &url.URL{Path: "/.well-known/versia/moderators/"} + return lysand.URLFromStd(config.C.PublicAddress.ResolveReference(newPath)) +} + +func SharedInboxAPIURL() *lysand.URL { + newPath := &url.URL{Path: "/api/inbox/"} + return lysand.URLFromStd(config.C.PublicAddress.ResolveReference(newPath)) +} diff --git a/internal/validators/val_impls/body_validator_impl.go b/internal/validators/val_impls/body_validator_impl.go index 2f309eb..8c3f25e 100644 --- a/internal/validators/val_impls/body_validator_impl.go +++ b/internal/validators/val_impls/body_validator_impl.go @@ -2,8 +2,10 @@ package val_impls import ( "errors" + "github.com/lysand-org/versia-go/ent/schema" "github.com/lysand-org/versia-go/internal/validators" "reflect" + "regexp" "strings" "github.com/go-logr/logr" @@ -11,11 +13,20 @@ import ( universal_translator "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" en_translations "github.com/go-playground/validator/v10/translations/en" - "github.com/lysand-org/versia-go/ent/schema" "github.com/lysand-org/versia-go/internal/api_schema" ) -var _ validators.BodyValidator = (*BodyValidatorImpl)(nil) +type bodyValidator struct { + Translated string + Validate func(fl validator.FieldLevel) bool +} + +var ( + _ validators.BodyValidator = (*BodyValidatorImpl)(nil) + + fullUserRegex = regexp.MustCompile("^@([a-z0-9_-]+)(?:@([a-zA-Z0-1-_.]+\\.[a-zA-Z0-9-z]+(?::[0-9]+)?))?$") + domainRegex = regexp.MustCompile("^[a-zA-Z0-9-_.]+.[a-zA-Z0-9-z]+(?::[0-9]+)?$") +) type BodyValidatorImpl struct { validator *validator.Validate @@ -28,13 +39,13 @@ type BodyValidatorImpl struct { func NewBodyValidator(log logr.Logger) *BodyValidatorImpl { en := en_locale.New() translator := universal_translator.New(en, en) - trans, ok := translator.GetTranslator("en") + enTranslator, ok := translator.GetTranslator("en") if !ok { panic("failed to get \"en\" translator") } validate := validator.New(validator.WithRequiredStructEnabled()) - if err := en_translations.RegisterDefaultTranslations(validate, trans); err != nil { + if err := en_translations.RegisterDefaultTranslations(validate, enTranslator); err != nil { panic("failed to register default translations") } @@ -46,25 +57,65 @@ func NewBodyValidator(log logr.Logger) *BodyValidatorImpl { return name }) - if err := validate.RegisterValidation("username_regex", func(fl validator.FieldLevel) bool { - return schema.ValidateUsername(fl.Field().String()) == nil - }); err != nil { - panic("failed to register username_regex validator") + bodyValidators := map[string]bodyValidator{ + "username_regex": { + Translated: "{0} must match '^[a-z0-9_-]+$'!", + Validate: func(fl validator.FieldLevel) bool { + return schema.ValidateUsername(fl.Field().String()) == nil + }, + }, + "full_user_regex": { + Translated: "{0} must match '^@[a-z0-9_-]+$' or '^@[a-z0-9_-]+@[a-zA-Z0-1-_.]+\\.[a-zA-Z0-9-z]+(?::[0-9]+)?))?$'", + Validate: func(fl validator.FieldLevel) bool { + f := fl.Field() + if f.Type().String() == "string" { + return fullUserRegex.Match([]byte(f.String())) + } + + return false + }, + }, + "domain_regex": { + Translated: "{0} must match '^[a-zA-Z0-9-_.]+.[a-zA-Z0-9-z]+(?::[0-9]+)?$'", + Validate: func(fl validator.FieldLevel) bool { + f := fl.Field() + t := f.Type().String() + if t == "string" { + return domainRegex.Match([]byte(f.String())) + } + + log.V(-1).Info("got wrong type: %s\n", t) + + return false + }, + }, } - if err := validate.RegisterTranslation("username_regex", trans, func(ut universal_translator.Translator) error { - return trans.Add("user_regex", "{0} must match '^[a-z0-9_-]+$'!", true) - }, func(ut universal_translator.Translator, fe validator.FieldError) string { - t, _ := ut.T("user_regex", fe.Field()) - return t - }); err != nil { - panic("failed to register user_regex translation") + for identifier, v := range bodyValidators { + if err := validate.RegisterValidation(identifier, v.Validate); err != nil { + log.Error(err, "failed to register validator", "identifier", identifier) + } + + register := func(ut universal_translator.Translator) error { + return enTranslator.Add(identifier, v.Translated, true) + } + + translate := func(ut universal_translator.Translator, fe validator.FieldError) string { + t, _ := ut.T(identifier, fe.Field()) + return t + } + + if err := validate.RegisterTranslation(identifier, enTranslator, register, translate); err != nil { + log.Error(err, "failed to register validator translator", "identifier", identifier) + } } return &BodyValidatorImpl{ validator: validate, translator: translator, - enTranslator: trans, + enTranslator: enTranslator, + + log: log, } } diff --git a/internal/validators/val_impls/request_validator_impl.go b/internal/validators/val_impls/request_validator_impl.go index 3e9e907..825bbad 100644 --- a/internal/validators/val_impls/request_validator_impl.go +++ b/internal/validators/val_impls/request_validator_impl.go @@ -1,17 +1,15 @@ package val_impls import ( - "bytes" "context" "errors" "git.devminer.xyz/devminer/unitel" "github.com/go-logr/logr" "github.com/gofiber/fiber/v2" "github.com/lysand-org/versia-go/internal/repository" + "github.com/lysand-org/versia-go/internal/utils" "github.com/lysand-org/versia-go/internal/validators" "github.com/lysand-org/versia-go/pkg/lysand" - "github.com/valyala/fasthttp/fasthttpadaptor" - "io" "net/http" ) @@ -38,7 +36,7 @@ func NewRequestValidator(repositories repository.Manager, telemetry *unitel.Tele } func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) error { - s := i.telemetry.StartSpan(ctx, "function", "validator/val_impls.RequestValidatorImpl.Validate") + s := i.telemetry.StartSpan(ctx, "function", "val_impls/RequestValidatorImpl.Validate") defer s.End() ctx = s.Context() @@ -55,13 +53,13 @@ func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) err return err } - body, err := copyBody(r) + body, err := utils.CopyBody(r) if err != nil { return err } - if !(lysand.Verifier{PublicKey: user.PublicKey}).Verify(r.Method, r.URL, body, fedHeaders) { - i.log.Info("signature verification failed", "user", user.URI, "url", r.URL.Path) + if !(lysand.Verifier{PublicKey: user.PublicKey.Key}).Verify(r.Method, r.URL, body, fedHeaders) { + i.log.WithCallDepth(1).Info("signature verification failed", "user", user.URI, "url", r.URL.Path) s.CaptureError(ErrInvalidSignature) return ErrInvalidSignature @@ -73,37 +71,14 @@ func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) err } func (i RequestValidatorImpl) ValidateFiberCtx(ctx context.Context, c *fiber.Ctx) error { - s := i.telemetry.StartSpan(ctx, "function", "validator/val_impls.RequestValidatorImpl.ValidateFiberCtx") + s := i.telemetry.StartSpan(ctx, "function", "val_impls/RequestValidatorImpl.ValidateFiberCtx") defer s.End() ctx = s.Context() - r, err := convertToStdRequest(c) + r, err := utils.ConvertToStdRequest(c) if err != nil { return err } return i.Validate(ctx, r) } - -func convertToStdRequest(c *fiber.Ctx) (*http.Request, error) { - stdReq := &http.Request{} - if err := fasthttpadaptor.ConvertRequest(c.Context(), stdReq, true); err != nil { - return nil, err - } - - return stdReq, nil -} - -func copyBody(req *http.Request) ([]byte, error) { - body, err := io.ReadAll(req.Body) - if err != nil { - return nil, err - } - - if err := req.Body.Close(); err != nil { - return nil, err - } - - req.Body = io.NopCloser(bytes.NewBuffer(body)) - return body, nil -} diff --git a/main.go b/main.go index 61c948e..090e3d1 100644 --- a/main.go +++ b/main.go @@ -4,8 +4,11 @@ import ( "context" "crypto/ed25519" "crypto/rand" + "crypto/tls" "database/sql" "database/sql/driver" + "fmt" + "github.com/lysand-org/versia-go/ent/instancemetadata" "github.com/lysand-org/versia-go/internal/handlers/follow_handler" "github.com/lysand-org/versia-go/internal/handlers/meta_handler" "github.com/lysand-org/versia-go/internal/handlers/note_handler" @@ -27,11 +30,9 @@ import ( "github.com/go-logr/zerologr" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/google/uuid" pgx "github.com/jackc/pgx/v5/stdlib" "github.com/lysand-org/versia-go/config" "github.com/lysand-org/versia-go/ent" - "github.com/lysand-org/versia-go/ent/user" "github.com/lysand-org/versia-go/internal/database" "github.com/lysand-org/versia-go/internal/handlers/user_handler" "github.com/lysand-org/versia-go/internal/tasks" @@ -59,17 +60,23 @@ func main() { tel, err := unitel.Initialize(config.C.Telemetry) if err != nil { - log.Fatal().Err(err).Msg("failed to initialize telemetry") + log.Fatal().Err(err).Msg("Failed to initialize telemetry") } - federationClient := lysand.NewClient(lysand.WithHTTPClient(&http.Client{ + httpClient := &http.Client{ Transport: tel.NewTracedTransport( - http.DefaultTransport, - false, - []string{"origin", "date", "signature"}, - []string{"host", "date", "signature"}, + &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: config.C.Telemetry.Environment == "development"}}, + // TODO: Only forward traces to configured hosts + true, + []string{"origin", "x-nonce", "x-signature", "x-signed-by", "sentry-trace", "sentry-baggage"}, + []string{"host", "x-nonce", "x-signature", "x-signed-by"}, ), - }), lysand.WithLogger(zerologr.New(&log.Logger).WithName("federation-client"))) + } + + federationClient := lysand.NewClient( + lysand.WithHTTPClient(httpClient), + lysand.WithLogger(zerologr.New(&log.Logger).WithName("federation-client")), + ) log.Debug().Msg("Opening database connection") var db *ent.Client @@ -79,37 +86,46 @@ func main() { db, err = openDB(tel, true, config.C.DatabaseURI) } if err != nil { - log.Fatal().Err(err).Msg("failed opening connection to the database") + log.Fatal().Err(err).Msg("Failed opening connection to the database") } defer db.Close() nc, err := nats.Connect(config.C.NATSURI) if err != nil { - log.Fatal().Err(err).Msg("failed to connect to NATS") + log.Fatal().Err(err).Msg("Failed to connect to NATS") } log.Debug().Msg("Starting taskqueue client") - tq, err := taskqueue.NewClient(context.Background(), "versia-go", nc, tel, zerologr.New(&log.Logger).WithName("taskqueue-client")) + tq, err := taskqueue.NewClient(context.Background(), config.C.NATSStreamName, nc, tel, zerologr.New(&log.Logger).WithName("taskqueue-client")) if err != nil { - log.Fatal().Err(err).Msg("failed to create taskqueue client") + log.Fatal().Err(err).Msg("Failed to create taskqueue client") } defer tq.Close() log.Debug().Msg("Running schema migration") if err := migrateDB(db, zerologr.New(&log.Logger).WithName("migrate-db"), tel); err != nil { - log.Fatal().Err(err).Msg("failed to run schema migration") + log.Fatal().Err(err).Msg("Failed to run schema migration") } // Stateless services - federationService := svc_impls.NewFederationServiceImpl(federationClient, tel, zerologr.New(&log.Logger).WithName("federation-service")) + requestSigner := svc_impls.NewRequestSignerImpl(tel, zerologr.New(&log.Logger).WithName("request-signer")) + federationService := svc_impls.NewFederationServiceImpl(httpClient, federationClient, tel, zerologr.New(&log.Logger).WithName("federation-service")) taskService := svc_impls.NewTaskServiceImpl(tq, tel, zerologr.New(&log.Logger).WithName("task-service")) // Manager - repos := repo_impls.NewManagerImpl(db, tel, zerologr.New(&log.Logger).WithName("repositories"), func(db *ent.Client, log logr.Logger, telemetry *unitel.Telemetry) repository.UserRepository { - return repo_impls.NewUserRepositoryImpl(federationService, db, log, telemetry) - }, repo_impls.NewNoteRepositoryImpl, repo_impls.NewFollowRepositoryImpl) + repos := repo_impls.NewManagerImpl( + db, tel, zerologr.New(&log.Logger).WithName("repositories"), + func(db *ent.Client, log logr.Logger, telemetry *unitel.Telemetry) repository.UserRepository { + return repo_impls.NewUserRepositoryImpl(federationService, db, log, telemetry) + }, + repo_impls.NewNoteRepositoryImpl, + repo_impls.NewFollowRepositoryImpl, + func(db *ent.Client, log logr.Logger, telemetry *unitel.Telemetry) repository.InstanceMetadataRepository { + return repo_impls.NewInstanceMetadataRepositoryImpl(federationService, db, log, telemetry) + }, + ) // Validators @@ -121,19 +137,20 @@ func main() { userService := svc_impls.NewUserServiceImpl(repos, federationService, tel, zerologr.New(&log.Logger).WithName("user-service")) noteService := svc_impls.NewNoteServiceImpl(federationService, taskService, repos, tel, zerologr.New(&log.Logger).WithName("note-service")) followService := svc_impls.NewFollowServiceImpl(federationService, repos, tel, zerologr.New(&log.Logger).WithName("follow-service")) - inboxService := svc_impls.NewInboxService(repos, federationService, tel, zerologr.New(&log.Logger).WithName("inbox-service")) + inboxService := svc_impls.NewInboxService(federationService, repos, tel, zerologr.New(&log.Logger).WithName("inbox-service")) + instanceMetadataService := svc_impls.NewInstanceMetadataServiceImpl(federationService, repos, tel, zerologr.New(&log.Logger).WithName("instance-metadata-service")) // Handlers - userHandler := user_handler.New(userService, federationService, inboxService, bodyValidator, requestValidator, zerologr.New(&log.Logger).WithName("user-handler")) + userHandler := user_handler.New(federationService, requestSigner, userService, inboxService, bodyValidator, requestValidator, zerologr.New(&log.Logger).WithName("user-handler")) noteHandler := note_handler.New(noteService, bodyValidator, zerologr.New(&log.Logger).WithName("notes-handler")) followHandler := follow_handler.New(followService, federationService, zerologr.New(&log.Logger).WithName("follow-handler")) - metaHandler := meta_handler.New(zerologr.New(&log.Logger).WithName("meta-handler")) + metaHandler := meta_handler.New(instanceMetadataService, zerologr.New(&log.Logger).WithName("meta-handler")) // Initialization if err := initServerActor(db, tel); err != nil { - log.Fatal().Err(err).Msg("failed to initialize server actor") + log.Fatal().Err(err).Msg("Failed to initialize server actor") } web := fiber.New(fiber.Config{ @@ -160,9 +177,9 @@ func main() { WaitForDelivery: false, Timeout: 5 * time.Second, // host for incoming requests - TraceRequestHeaders: []string{"origin", "date", "signature", "host"}, + TraceRequestHeaders: []string{"origin", "x-nonce", "x-signature", "x-signed-by", "sentry-trace", "sentry-baggage"}, // origin for outgoing requests - TraceResponseHeaders: []string{"origin", "date", "signature", "origin"}, + TraceResponseHeaders: []string{"host", "x-nonce", "x-signature", "x-signed-by"}, // IgnoredRoutes: nil, })) web.Use(unitel.RequestLogger(log.Logger, true, true)) @@ -186,7 +203,7 @@ func main() { tasks.NewHandler(federationService, repos, tel, zerologr.New(&log.Logger).WithName("task-handler")). Register(tq) - if err := tq.Start(context.Background()); err != nil { + if err := tq.StartConsumer(context.Background(), "consumer"); err != nil { log.Fatal().Err(err).Msg("failed to start taskqueue client") } }() @@ -195,7 +212,7 @@ func main() { defer wg.Done() log.Debug().Msg("Starting server") - if err := web.ListenTLS(":8443", "cert.pem", "key.pem"); err != nil { + if err := web.ListenTLS(fmt.Sprintf(":%d", config.C.Port), "cert.pem", "key.pem"); err != nil { log.Fatal().Err(err).Msg("Failed to start server") } }() @@ -277,45 +294,44 @@ func initServerActor(db *ent.Client, telemetry *unitel.Telemetry) error { }(tx) ctx = tx.Context() - _, err = tx.User.Query(). - Where(user.Username("actor")). - Only(ctx) - if err != nil && !ent.IsNotFound(err) { - log.Error().Err(err).Msg("Failed to query user") - + pub, priv, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + log.Error().Err(err).Msg("Failed to generate keypair") return err } - if ent.IsNotFound(err) { - pub, priv, err := ed25519.GenerateKey(rand.Reader) - if err != nil { - log.Error().Err(err).Msg("Failed to generate keypair") - - return err - } - - uid := uuid.New() - - err = tx.User.Create(). - SetID(uid). - SetUsername("actor"). - SetIsRemote(false). - SetURI(utils.UserAPIURL(uid).String()). - SetIndexable(false). - SetPrivacyLevel(user.PrivacyLevelPrivate). - SetPublicKey(pub). - SetPrivateKey(priv). - SetInbox(utils.UserInboxAPIURL(uid).String()). - SetOutbox(utils.UserOutboxAPIURL(uid).String()). - SetFeatured(utils.UserFeaturedAPIURL(uid).String()). - SetFollowers(utils.UserFollowersAPIURL(uid).String()). - SetFollowing(utils.UserFollowingAPIURL(uid).String()). - Exec(ctx) - if err != nil { - log.Error().Err(err).Msg("Failed to create user") - - return err - } + err = tx.InstanceMetadata.Create(). + SetIsRemote(false). + SetURI(utils.InstanceMetadataAPIURL().String()). + SetName(config.C.InstanceName). + SetNillableDescription(config.C.InstanceDescription). + SetHost(config.C.Host). + SetPrivateKey(priv). + SetPublicKey(pub). + SetPublicKeyAlgorithm("ed25519"). + SetSoftwareName("versia-go"). + SetSoftwareVersion("0.0.1"). + SetSharedInboxURI(utils.SharedInboxAPIURL().String()). + SetAdminsURI(utils.InstanceMetadataAdminsAPIURL().String()). + SetModeratorsURI(utils.InstanceMetadataModeratorsAPIURL().String()). + SetSupportedVersions([]string{"0.4.0"}). + SetSupportedExtensions([]string{}). + // + OnConflictColumns(instancemetadata.FieldHost). + UpdateName(). + UpdateDescription(). + UpdateHost(). + UpdateSoftwareName(). + UpdateSoftwareVersion(). + UpdateSharedInboxURI(). + UpdateAdminsURI(). + UpdateModeratorsURI(). + UpdateSupportedVersions(). + UpdateSupportedExtensions(). + Exec(ctx) + if err != nil { + log.Error().Err(err).Msg("Failed to create server metadata") + return err } tx.MarkForCommit() diff --git a/pkg/lysand/actor_user.go b/pkg/lysand/actor_user.go index ecf4e4c..fdd5cc8 100644 --- a/pkg/lysand/actor_user.go +++ b/pkg/lysand/actor_user.go @@ -1,15 +1,7 @@ package lysand import ( - "bytes" - "context" - "crypto/ed25519" - "crypto/rand" - "encoding/base64" "encoding/json" - "fmt" - "net/http" - "net/url" ) // User represents a user object in the Lysand protocol. For more information, see the [Spec]. @@ -20,7 +12,7 @@ type User struct { // PublicKey is the public key of the user. // https://lysand.org/objects/user#public-key - PublicKey PublicKey `json:"public_key"` + PublicKey UserPublicKey `json:"public_key"` // DisplayName is the display name of the user. // https://lysand.org/objects/user#display-name @@ -66,14 +58,6 @@ type User struct { // https://lysand.org/objects/user#following Following *URL `json:"following"` - // Likes is the likes of the user. - // https://lysand.org/objects/user#likes - Likes *URL `json:"likes"` - - // Dislikes is the dislikes of the user. - // https://lysand.org/objects/user#dislikes - Dislikes *URL `json:"dislikes"` - // Inbox is the inbox of the user. // https://lysand.org/objects/user#posts Inbox *URL `json:"inbox"` @@ -94,60 +78,3 @@ type Field struct { Key TextContentTypeMap `json:"key"` Value TextContentTypeMap `json:"value"` } - -func (c *FederationClient) GetUser(ctx context.Context, uri *url.URL) (*User, error) { - resp, body, err := c.rawGET(ctx, uri) - if err != nil { - return nil, err - } - - user := &User{} - if err := json.Unmarshal(body, user); err != nil { - return nil, err - } - - fedHeaders, err := ExtractFederationHeaders(resp.Header) - if err != nil { - return nil, err - } - - v := Verifier{ed25519.PublicKey(user.PublicKey.PublicKey)} - if !v.Verify("GET", uri, body, fedHeaders) { - c.log.V(2).Info("signature verification failed", "user", user.URI.String()) - return nil, fmt.Errorf("signature verification failed") - } - c.log.V(2).Info("signature verification succeeded", "user", user.URI.String()) - - return user, nil -} - -func (c *FederationClient) SendToInbox(ctx context.Context, signer Signer, user *User, object any) ([]byte, error) { - uri := user.Inbox.ToStd() - - body, err := json.Marshal(object) - if err != nil { - return nil, err - } - - nonce := make([]byte, 32) - if _, err := rand.Read(nonce); err != nil { - return nil, err - } - - sigData := NewSignatureData("POST", base64.StdEncoding.EncodeToString(nonce), uri, hashSHA256(body)) - sig := signer.Sign(*sigData) - - req, err := http.NewRequestWithContext(ctx, "POST", uri.String(), bytes.NewReader(body)) - if err != nil { - return nil, err - } - - sig.Inject(req.Header) - - _, respBody, err := c.doReq(req) - if err != nil { - return nil, err - } - - return respBody, nil -} diff --git a/pkg/lysand/crypto.go b/pkg/lysand/crypto.go index 406adbe..4dde30f 100644 --- a/pkg/lysand/crypto.go +++ b/pkg/lysand/crypto.go @@ -1,42 +1,5 @@ package lysand -import ( - "bytes" - "crypto/ed25519" - "crypto/sha256" - "io" - "net/http" -) - -func (c *FederationClient) ValidateSignatureHeader(req *http.Request) (bool, error) { - fedHeaders, err := ExtractFederationHeaders(req.Header) - if err != nil { - return false, err - } - - // TODO: Fetch user from database instead of using the URI - user, err := c.GetUser(req.Context(), fedHeaders.SignedBy) - if err != nil { - return false, err - } - - body, err := copyBody(req) - if err != nil { - return false, err - } - - v := Verifier{ed25519.PublicKey(user.PublicKey.PublicKey)} - valid := v.Verify(req.Method, req.URL, body, fedHeaders) - - return valid, nil -} - -func hashSHA256(data []byte) []byte { - h := sha256.New() - h.Write(data) - return h.Sum(nil) -} - func must[In any, Out any](fn func(In) (Out, error), v In) Out { out, err := fn(v) if err != nil { @@ -45,17 +8,3 @@ func must[In any, Out any](fn func(In) (Out, error), v In) Out { return out } - -func copyBody(req *http.Request) ([]byte, error) { - body, err := io.ReadAll(req.Body) - if err != nil { - return nil, err - } - - if err := req.Body.Close(); err != nil { - return nil, err - } - - req.Body = io.NopCloser(bytes.NewBuffer(body)) - return body, nil -} diff --git a/pkg/lysand/crypto/keys.go b/pkg/lysand/crypto/keys.go new file mode 100644 index 0000000..1f9ffd9 --- /dev/null +++ b/pkg/lysand/crypto/keys.go @@ -0,0 +1,23 @@ +package versiacrypto + +import ( + "crypto/ed25519" + "fmt" +) + +type UnknownPublicKeyTypeError struct { + Got string +} + +func (i UnknownPublicKeyTypeError) Error() string { + return fmt.Sprintf("unknown public key type: \"%s\"", i.Got) +} + +func ToTypedKey(algorithm string, raw []byte) (any, error) { + switch algorithm { + case "ed25519": + return ed25519.PublicKey(raw), nil + default: + return nil, UnknownPublicKeyTypeError{algorithm} + } +} diff --git a/pkg/lysand/crypto/sha256.go b/pkg/lysand/crypto/sha256.go new file mode 100644 index 0000000..b0eeb8a --- /dev/null +++ b/pkg/lysand/crypto/sha256.go @@ -0,0 +1,9 @@ +package versiacrypto + +import "crypto/sha256" + +func SHA256(data []byte) []byte { + h := sha256.New() + h.Write(data) + return h.Sum(nil) +} diff --git a/pkg/lysand/crypto/verify.go b/pkg/lysand/crypto/verify.go new file mode 100644 index 0000000..a59e523 --- /dev/null +++ b/pkg/lysand/crypto/verify.go @@ -0,0 +1,29 @@ +package versiacrypto + +import ( + "crypto" + "crypto/ed25519" + "fmt" + "reflect" +) + +type InvalidPublicKeyTypeError struct { + Got reflect.Type +} + +func (i InvalidPublicKeyTypeError) Error() string { + return fmt.Sprintf("failed to convert public key of type \"%s\"", i.Got.String()) +} + +type Verify = func(data, signature []byte) bool + +func NewVerify(pubKey crypto.PublicKey) (Verify, error) { + switch pk := pubKey.(type) { + case ed25519.PublicKey: + return func(data, signature []byte) bool { + return ed25519.Verify(pk, data, signature) + }, nil + default: + return nil, InvalidPublicKeyTypeError{reflect.TypeOf(pk)} + } +} diff --git a/pkg/lysand/federation_client.go b/pkg/lysand/federation_client.go index ceae798..badebef 100644 --- a/pkg/lysand/federation_client.go +++ b/pkg/lysand/federation_client.go @@ -1,10 +1,9 @@ package lysand import ( - "context" "fmt" "github.com/go-logr/logr" - "io" + "github.com/lysand-org/versia-go/pkg/protoretry" "net/http" "net/url" "time" @@ -22,6 +21,7 @@ func (e *ResponseError) Error() string { type FederationClient struct { log logr.Logger httpC *http.Client + hc *protoretry.Client } type Opt func(c *FederationClient) @@ -53,49 +53,11 @@ func NewClient(opts ...Opt) *FederationClient { useragent: "github.com/lysand-org/versia-go/pkg/lysand#0.0.1", } + c.hc = protoretry.New(c.httpC) + return c } -func (c *FederationClient) rawGET(ctx context.Context, uri *url.URL) (*http.Response, []byte, error) { - req, err := http.NewRequestWithContext(ctx, "GET", uri.String(), nil) - if err != nil { - return nil, nil, err - } - - return c.doReq(req) -} - -func (c *FederationClient) rawPOST(ctx context.Context, uri *url.URL, body io.Reader) (*http.Response, []byte, error) { - req, err := http.NewRequestWithContext(ctx, "POST", uri.String(), body) - if err != nil { - return nil, nil, err - } - - return c.doReq(req) -} - -func (c *FederationClient) doReq(req *http.Request) (*http.Response, []byte, error) { - resp, err := c.httpC.Do(req) - if err != nil { - return nil, nil, err - } - defer resp.Body.Close() - - if resp.StatusCode >= http.StatusBadRequest { - return resp, nil, &ResponseError{ - StatusCode: resp.StatusCode, - URL: req.URL, - } - } - - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return resp, nil, err - } - - return resp, respBody, nil -} - type federationClientHTTPTransport struct { inner http.RoundTripper useragent string diff --git a/pkg/lysand/federation_headers.go b/pkg/lysand/federation_headers.go index d110bfd..72d5300 100644 --- a/pkg/lysand/federation_headers.go +++ b/pkg/lysand/federation_headers.go @@ -25,6 +25,14 @@ func (f *FederationHeaders) Inject(h http.Header) { h.Set("x-signature", base64.StdEncoding.EncodeToString(f.Signature)) } +func (f *FederationHeaders) Headers() map[string]string { + return map[string]string{ + "x-signed-by": f.SignedBy.String(), + "x-nonce": f.Nonce, + "x-signature": base64.StdEncoding.EncodeToString(f.Signature), + } +} + func ExtractFederationHeaders(h http.Header) (*FederationHeaders, error) { signedBy := h.Get("x-signed-by") if signedBy == "" { @@ -41,14 +49,19 @@ func ExtractFederationHeaders(h http.Header) (*FederationHeaders, error) { return nil, fmt.Errorf("missing x-nonce header") } - signature := h.Get("x-signature") - if signature == "" { + rawSignature := h.Get("x-signature") + if rawSignature == "" { return nil, fmt.Errorf("missing x-signature header") } + signature, err := base64.StdEncoding.DecodeString(rawSignature) + if err != nil { + return nil, err + } + return &FederationHeaders{ SignedBy: u, Nonce: nonce, - Signature: []byte(signature), + Signature: signature, }, nil } diff --git a/pkg/lysand/instance_metadata.go b/pkg/lysand/instance_metadata.go new file mode 100644 index 0000000..deba6b6 --- /dev/null +++ b/pkg/lysand/instance_metadata.go @@ -0,0 +1,111 @@ +package lysand + +import ( + "encoding/json" +) + +// InstanceMetadata represents the metadata of a Lysand instance. For more information, see the [Spec]. +// +// ! Unlike other entities, instance metadata is not meant to be federated. +// +// [Spec]: https://versia.pub/entities/instance-metadata +type InstanceMetadata struct { + // Type is always "InstanceMetadata" + Type string `json:"type"` + + // Extensions is a map of active extensions + Extensions Extensions `json:"extensions,omitempty"` + + // Name is the name of the instance + Name string `json:"name"` + + // Description is a description of the instance + Description *string `json:"description,omitempty"` + + // Host is the hostname of the instance, including the port + Host string `json:"host,omitempty"` + + // PublicKey is the public key of the instance + PublicKey InstancePublicKey `json:"public_key"` + + // SharedInbox is the URL to the instance's shared inbox + SharedInbox *URL `json:"shared_inbox,omitempty"` + + // Moderators is a URL to a collection of moderators + Moderators *URL `json:"moderators,omitempty"` + + // Admins is a URL to a collection of administrators + Admins *URL `json:"admins,omitempty"` + + // Logo is the URL to the instance's logo + Logo *ImageContentTypeMap `json:"logo,omitempty"` + + // Banner is the URL to the instance's banner + Banner *ImageContentTypeMap `json:"banner,omitempty"` + + // Software is information about the instance software + Software InstanceSoftware `json:"software"` + + // Compatibility is information about the instance's compatibility with different Lysand versions + Compatibility InstanceCompatibility `json:"compatibility"` +} + +func (s InstanceMetadata) MarshalJSON() ([]byte, error) { + type instanceMetadata InstanceMetadata + s2 := instanceMetadata(s) + s2.Type = "InstanceMetadata" + return json.Marshal(s2) +} + +// InstanceSoftware represents the software of a Lysand instance. +type InstanceSoftware struct { + // Name is the name of the instance software + Name string `json:"name"` + // Version is the version of the instance software + Version string `json:"version"` +} + +// InstanceCompatibility represents the compatibility of a Lysand instance. +type InstanceCompatibility struct { + // Versions is a list of versions of Lysand the instance is compatible with + Versions []string `json:"versions"` + + // Extensions is a list of extensions supported by the instance + Extensions []string `json:"extensions"` +} + +// InstancePublicKey represents the public key of a Versia instance. +type InstancePublicKey struct { + // Algorithm can only be `ed25519` for now + Algorithm string `json:"algorithm"` + + Key *SPKIPublicKey `json:"-"` + RawKey json.RawMessage `json:"key"` +} + +func (k *InstancePublicKey) UnmarshalJSON(raw []byte) error { + type t InstancePublicKey + k2 := (*t)(k) + if err := json.Unmarshal(raw, k2); err != nil { + return nil + } + + var err error + if k2.Key, err = unmarshalSPKIPubKey(k2.Algorithm, k2.RawKey); err != nil { + return nil + } + + return nil +} + +func (k InstancePublicKey) MarshalJSON() ([]byte, error) { + type t InstancePublicKey + k2 := t(k) + + var err error + if k2.RawKey, err = k2.Key.MarshalJSON(); err != nil { + return nil, err + } + + return json.Marshal(k2) +} diff --git a/pkg/lysand/server_metadata.go b/pkg/lysand/server_metadata.go deleted file mode 100644 index 4fed4b5..0000000 --- a/pkg/lysand/server_metadata.go +++ /dev/null @@ -1,64 +0,0 @@ -package lysand - -import ( - "encoding/json" - - "github.com/Masterminds/semver" -) - -// ServerMetadata represents the metadata of a Lysand server. For more information, see the [Spec]. -// -// ! Unlike other objects, server metadata is not meant to be federated. -// -// [Spec]: https://lysand.org/objects/server-metadata -type ServerMetadata struct { - // Type is always "ServerMetadata" - // https://lysand.org/objects/server-metadata#type - Type string `json:"type"` - - // Extensions is a map of active extensions - // https://lysand.org/objects/server-metadata#extensions - Extensions Extensions `json:"extensions,omitempty"` - - // Name is the name of the server - // https://lysand.org/objects/server-metadata#name - Name string `json:"name"` - - // Version is the version of the server software - // https://lysand.org/objects/server-metadata#version - Version *semver.Version `json:"version"` - - // Description is a description of the server - // https://lysand.org/objects/server-metadata#description - Description *string `json:"description,omitempty"` - - // Website is the URL to the server's website - // https://lysand.org/objects/server-metadata#website - Website *URL `json:"website,omitempty"` - - // Moderators is a list of URLs to moderators - // https://lysand.org/objects/server-metadata#moderators - Moderators []*URL `json:"moderators,omitempty"` - - // Admins is a list of URLs to administrators - // https://lysand.org/objects/server-metadata#admins - Admins []*URL `json:"admins,omitempty"` - - // Logo is the URL to the server's logo - // https://lysand.org/objects/server-metadata#logo - Logo *ImageContentTypeMap `json:"logo,omitempty"` - - // Banner is the URL to the server's banner - // https://lysand.org/objects/server-metadata#banner - Banner *ImageContentTypeMap `json:"banner,omitempty"` - - // SupportedExtensions is a list of supported extensions - SupportedExtensions []string `json:"supported_extensions"` -} - -func (s ServerMetadata) MarshalJSON() ([]byte, error) { - type serverMetadata ServerMetadata - s2 := serverMetadata(s) - s2.Type = "ServerMetadata" - return json.Marshal(s2) -} diff --git a/pkg/lysand/signature_data.go b/pkg/lysand/signature_data.go index 1839510..dd93b6f 100644 --- a/pkg/lysand/signature_data.go +++ b/pkg/lysand/signature_data.go @@ -1,10 +1,13 @@ package lysand import ( + "crypto" "crypto/ed25519" "encoding/base64" "fmt" + versiacrypto "github.com/lysand-org/versia-go/pkg/lysand/crypto" "net/url" + "os" "strings" ) @@ -32,8 +35,16 @@ func (s *SignatureData) String() string { return fmt.Sprintf("%s %s?%s %s %s", strings.ToLower(s.RequestMethod), s.URL.Path, s.URL.RawQuery, s.Nonce, base64.StdEncoding.EncodeToString(s.Digest)) } -func (s *SignatureData) Validate(pubKey ed25519.PublicKey, signature []byte) bool { - return ed25519.Verify(pubKey, []byte(s.String()), signature) +func (s *SignatureData) Validate(pubKey crypto.PublicKey, signature []byte) bool { + data := []byte(s.String()) + + verify, err := versiacrypto.NewVerify(pubKey) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "%v\n", err) + return false + } + + return verify(data, signature) } func (s *SignatureData) Sign(privKey ed25519.PrivateKey) []byte { @@ -54,11 +65,10 @@ func (s Signer) Sign(signatureData SignatureData) *FederationHeaders { } type Verifier struct { - PublicKey ed25519.PublicKey + PublicKey crypto.PublicKey } func (v Verifier) Verify(method string, u *url.URL, body []byte, fedHeaders *FederationHeaders) bool { - sigData := NewSignatureData(method, fedHeaders.Nonce, u, hashSHA256(body)) - - return sigData.Validate(v.PublicKey, fedHeaders.Signature) + return NewSignatureData(method, fedHeaders.Nonce, u, versiacrypto.SHA256(body)). + Validate(v.PublicKey, fedHeaders.Signature) } diff --git a/pkg/lysand/spki_public_key.go b/pkg/lysand/spki_public_key.go index b61591a..131619e 100644 --- a/pkg/lysand/spki_public_key.go +++ b/pkg/lysand/spki_public_key.go @@ -1,59 +1,92 @@ package lysand import ( - "crypto/ed25519" + "crypto" "crypto/x509" "encoding/base64" "encoding/json" - "errors" ) -var ( - ErrInvalidPublicKeyType = errors.New("invalid public key type") -) - -// PublicKey represents a public key for a user. For more information, see the [Spec]. +// UserPublicKey represents a public key for a user. For more information, see the [Spec]. // // [Spec]: https://lysand.org/security/keys#public-key-cryptography -type PublicKey struct { - PublicKey SPKIPublicKey `json:"public_key"` - Actor *URL `json:"actor"` +type UserPublicKey struct { + Actor *URL `json:"actor"` + + // Algorithm can only be `ed25519` for now + Algorithm string `json:"algorithm"` + + Key *SPKIPublicKey `json:"-"` + RawKey json.RawMessage `json:"key"` } -// SPKIPublicKey is a type that represents a [ed25519.PublicKey] in the SPKI -// format. -type SPKIPublicKey ed25519.PublicKey +func (k *UserPublicKey) UnmarshalJSON(raw []byte) error { + type t UserPublicKey + k2 := (*t)(k) -// UnmarshalJSON decodes the public key from a base64 encoded string and then unmarshals it from the SPKI form. -func (k *SPKIPublicKey) UnmarshalJSON(raw []byte) error { - rawStr := "" - if err := json.Unmarshal(raw, &rawStr); err != nil { + if err := json.Unmarshal(raw, k2); err != nil { return err } - raw, err := base64.StdEncoding.DecodeString(rawStr) - if err != nil { + var err error + if k2.Key, err = unmarshalSPKIPubKey(k2.Algorithm, k2.RawKey); err != nil { return err } - parsed, err := x509.ParsePKIXPublicKey(raw) - if err != nil { - return err - } - - edKey, ok := parsed.(ed25519.PublicKey) - if !ok { - return ErrInvalidPublicKeyType - } - - *k = SPKIPublicKey(edKey) + *k = UserPublicKey(*k2) return nil } +func (k UserPublicKey) MarshalJSON() ([]byte, error) { + type t UserPublicKey + k2 := t(k) + + var err error + if k2.RawKey, err = k2.Key.MarshalJSON(); err != nil { + return nil, err + } + + return json.Marshal(k2) +} + +// SPKIPublicKey is a type that represents a [ed25519.PublicKey] in the SPKI +// format. +type SPKIPublicKey struct { + Key any + Algorithm string +} + +func unmarshalSPKIPubKey(algorithm string, raw []byte) (*SPKIPublicKey, error) { + rawStr := "" + if err := json.Unmarshal(raw, &rawStr); err != nil { + return nil, err + } + + raw, err := base64.StdEncoding.DecodeString(rawStr) + if err != nil { + return nil, err + } + + return NewSPKIPubKey(algorithm, raw) +} + +// NewSPKIPubKey decodes the public key from a base64 encoded string and then unmarshals it from the SPKI form. +func NewSPKIPubKey(algorithm string, raw []byte) (*SPKIPublicKey, error) { + parsed, err := x509.ParsePKIXPublicKey(raw) + if err != nil { + return nil, err + } + + return &SPKIPublicKey{ + Key: parsed, + Algorithm: algorithm, + }, nil +} + // MarshalJSON marshals the SPKI-encoded public key to a base64 encoded string. func (k SPKIPublicKey) MarshalJSON() ([]byte, error) { - raw, err := x509.MarshalPKIXPublicKey(ed25519.PublicKey(k)) + raw, err := x509.MarshalPKIXPublicKey(k.Key) if err != nil { return nil, err } @@ -61,6 +94,6 @@ func (k SPKIPublicKey) MarshalJSON() ([]byte, error) { return json.Marshal(base64.StdEncoding.EncodeToString(raw)) } -func (k SPKIPublicKey) ToStd() ed25519.PublicKey { - return ed25519.PublicKey(k) +func (k SPKIPublicKey) ToKey() crypto.PublicKey { + return k.Key } diff --git a/pkg/lysand/spki_public_key_test.go b/pkg/lysand/spki_public_key_test.go index 7cdd525..e2648c4 100644 --- a/pkg/lysand/spki_public_key_test.go +++ b/pkg/lysand/spki_public_key_test.go @@ -12,20 +12,20 @@ import ( func TestSPKIPublicKey_UnmarshalJSON(t *testing.T) { expectedPk := must(x509.ParsePKIXPublicKey, must(base64.StdEncoding.DecodeString, "MCowBQYDK2VwAyEAgKNt+9eyOXdb7MSrrmHlsFD2H9NGwC+56PjpWD46Tcs=")) - pk := PublicKey{} + pk := UserPublicKey{} raw := []byte(`{"public_key":"MCowBQYDK2VwAyEAgKNt+9eyOXdb7MSrrmHlsFD2H9NGwC+56PjpWD46Tcs="}`) if err := json.Unmarshal(raw, &pk); err != nil { t.Error(err) } - assert.Equal(t, expectedPk, ed25519.PublicKey(pk.PublicKey)) + assert.Equal(t, expectedPk, ed25519.PublicKey(pk.Key)) } func TestSPKIPublicKey_MarshalJSON(t *testing.T) { expectedPk := must(x509.ParsePKIXPublicKey, must(base64.StdEncoding.DecodeString, "MCowBQYDK2VwAyEAgKNt+9eyOXdb7MSrrmHlsFD2H9NGwC+56PjpWD46Tcs=")).(ed25519.PublicKey) - pk := PublicKey{ - PublicKey: SPKIPublicKey(expectedPk), + pk := UserPublicKey{ + Key: SPKIPublicKey(expectedPk), } if _, err := json.Marshal(pk); err != nil { t.Error(err) diff --git a/pkg/protoretry/client.go b/pkg/protoretry/client.go new file mode 100644 index 0000000..43fbb61 --- /dev/null +++ b/pkg/protoretry/client.go @@ -0,0 +1,62 @@ +package protoretry + +import ( + "context" + "errors" + "io" + "net/http" + "net/url" + "syscall" +) + +type Client struct { + base *http.Client +} + +func New(base *http.Client) *Client { + return &Client{base} +} + +func (c *Client) Do(req *http.Request) (*http.Response, error) { + if res, err := c.base.Do(req); err == nil { + return res, nil + } else if !errors.Is(err, syscall.ECONNREFUSED) { + return nil, err + } + + req.URL.Scheme = "http" + return c.base.Do(req) +} + +func (c *Client) GET(ctx context.Context, u *url.URL) ([]byte, *http.Response, error) { + req, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil) + if err != nil { + return nil, nil, err + } + + return c.DoReq(req) +} + +func (c *Client) POST(ctx context.Context, u *url.URL, reqBody io.Reader) ([]byte, *http.Response, error) { + req, err := http.NewRequestWithContext(ctx, "POST", u.String(), reqBody) + if err != nil { + return nil, nil, err + } + + return c.DoReq(req) +} + +func (c *Client) DoReq(req *http.Request) ([]byte, *http.Response, error) { + res, err := c.Do(req) + if err != nil { + return nil, nil, err + } + defer res.Body.Close() + + resBody, err := io.ReadAll(res.Body) + if err != nil { + return nil, nil, err + } + + return resBody, res, nil +} diff --git a/pkg/taskqueue/client.go b/pkg/taskqueue/client.go index ad6c5d5..010e3bc 100644 --- a/pkg/taskqueue/client.go +++ b/pkg/taskqueue/client.go @@ -71,15 +71,15 @@ type Client struct { log logr.Logger } -func NewClient(ctx context.Context, name string, natsClient *nats.Conn, telemetry *unitel.Telemetry, log logr.Logger) (*Client, error) { +func NewClient(ctx context.Context, streamName string, natsClient *nats.Conn, telemetry *unitel.Telemetry, log logr.Logger) (*Client, error) { js, err := jetstream.New(natsClient) if err != nil { return nil, err } s, err := js.CreateStream(ctx, jetstream.StreamConfig{ - Name: name, - Subjects: []string{name + ".*"}, + Name: streamName, + Subjects: []string{streamName + ".*"}, MaxConsumers: -1, MaxMsgs: -1, Discard: jetstream.DiscardOld, @@ -89,7 +89,7 @@ func NewClient(ctx context.Context, name string, natsClient *nats.Conn, telemetr AllowDirect: true, }) if errors.Is(err, nats.ErrStreamNameAlreadyInUse) { - s, err = js.Stream(ctx, name) + s, err = js.Stream(ctx, streamName) if err != nil { return nil, err } @@ -100,8 +100,8 @@ func NewClient(ctx context.Context, name string, natsClient *nats.Conn, telemetr stopCh := make(chan struct{}) c := &Client{ - name: name, - subject: name + ".tasks", + name: streamName, + subject: streamName + ".tasks", handlers: map[string][]Handler{}, @@ -145,7 +145,7 @@ func (c *Client) Submit(ctx context.Context, task Task) error { if err != nil { return err } - c.log.V(1).Info("submitted task", "id", task.ID, "type", task.Type, "sequence", msg.Sequence) + c.log.V(2).Info("Submitted task", "id", task.ID, "type", task.Type, "sequence", msg.Sequence) s.AddAttribute("messaging.message.id", msg.Sequence) @@ -153,7 +153,7 @@ func (c *Client) Submit(ctx context.Context, task Task) error { } func (c *Client) RegisterHandler(type_ string, handler Handler) { - c.log.V(2).Info("registering handler", "type", type_) + c.log.V(2).Info("Registering handler", "type", type_) if _, ok := c.handlers[type_]; !ok { c.handlers[type_] = []Handler{} @@ -161,13 +161,11 @@ func (c *Client) RegisterHandler(type_ string, handler Handler) { c.handlers[type_] = append(c.handlers[type_], handler) } -func (c *Client) Start(ctx context.Context) error { - c.log.Info("starting") +func (c *Client) StartConsumer(ctx context.Context, consumerGroup string) error { + c.log.Info("Starting consumer") sub, err := c.js.CreateConsumer(ctx, c.name, jetstream.ConsumerConfig{ - // TODO: set name properly - Name: "versia-go", - Durable: "versia-go", + Durable: consumerGroup, DeliverPolicy: jetstream.DeliverAllPolicy, ReplayPolicy: jetstream.ReplayInstantPolicy, AckPolicy: jetstream.AckExplicitPolicy, @@ -191,16 +189,16 @@ func (c *Client) Start(ctx context.Context) error { msg, err := m.Next() if err != nil { if errors.Is(err, jetstream.ErrMsgIteratorClosed) { - c.log.Info("stopping") + c.log.Info("Stopping") return } - c.log.Error(err, "failed to get next message") + c.log.Error(err, "Failed to get next message") break } if err := c.handleTask(ctx, msg); err != nil { - c.log.Error(err, "failed to handle task") + c.log.Error(err, "Failed to handle task") break } } @@ -224,7 +222,7 @@ func (c *Client) handleTask(ctx context.Context, msg jetstream.Msg) error { var w taskWrapper if err := json.Unmarshal(data, &w); err != nil { if err := msg.Nak(); err != nil { - c.log.Error(err, "failed to nak message") + c.log.Error(err, "Failed to nak message") } return err @@ -246,21 +244,21 @@ func (c *Client) handleTask(ctx context.Context, msg jetstream.Msg) error { handlers, ok := c.handlers[w.Task.Type] if !ok { - c.log.V(1).Info("no handler for task", "type", w.Task.Type) + c.log.V(2).Info("No handler for task", "type", w.Task.Type) return msg.Nak() } var errs CombinedError for _, handler := range handlers { if err := handler(ctx, w.Task); err != nil { - c.log.Error(err, "handler failed", "type", w.Task.Type) + c.log.Error(err, "Handler failed", "type", w.Task.Type) errs.Errors = append(errs.Errors, err) } } if len(errs.Errors) > 0 { if err := msg.Nak(); err != nil { - c.log.Error(err, "failed to nak message") + c.log.Error(err, "Failed to nak message") errs.Errors = append(errs.Errors, err) } diff --git a/pkg/webfinger/webfinger.go b/pkg/webfinger/webfinger.go index 71410db..0ab0287 100644 --- a/pkg/webfinger/webfinger.go +++ b/pkg/webfinger/webfinger.go @@ -1,13 +1,19 @@ package webfinger import ( + "context" + "encoding/json" "errors" + "fmt" + "github.com/lysand-org/versia-go/pkg/protoretry" + "net/http" "net/url" "strings" ) var ( ErrInvalidSyntax = errors.New("must follow the format \"acct:@\"") + ErrUserNotFound = errors.New("user could not be found") ) func ParseResource(res string) (*UserID, error) { @@ -48,7 +54,7 @@ type Response struct { type Link struct { Relation string `json:"rel"` - Type any `json:"type"` + Type string `json:"type"` Link string `json:"href"` } @@ -70,3 +76,47 @@ func (u User) WebFingerResource() Response { }, } } + +func Discover(c *protoretry.Client, ctx context.Context, baseURI, username string) (*User, error) { + u := &User{UserID: UserID{ID: username, Domain: baseURI}} + + body, resp, err := c.GET(ctx, &url.URL{ + Scheme: "https", + Host: u.UserID.Domain, + Path: "/.well-known/webfinger", + RawQuery: url.Values{"resource": []string{"acct:" + u.String()}}.Encode(), + }) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusNotFound { + return nil, ErrUserNotFound + } else if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + var respBody Response + if err := json.Unmarshal(body, &respBody); err != nil { + return nil, err + } + + if respBody.Error != nil { + return nil, fmt.Errorf("webfinger error: %s", *respBody.Error) + } + + for _, link := range respBody.Links { + if link.Relation == "self" { + if u.URI, err = url.Parse(link.Link); err != nil { + return nil, err + } + } else if link.Relation == "avatar" { + u.AvatarMIMEType = link.Type + if u.Avatar, err = url.Parse(link.Link); err != nil { + return nil, err + } + } + } + + return u, nil +}