From db08520d64e489289d7bd9be82dd6e00032ab029 Mon Sep 17 00:00:00 2001 From: Zig Blathazar <42387185+ZigBalthazar@users.noreply.github.com> Date: Thu, 19 Sep 2024 02:30:07 +0330 Subject: [PATCH] feat(database:pg, server): store incoming events to database. (#43) --- .gitignore | 3 +- cmd/commands/run.go | 2 +- config/config.go | 7 +- config/config_test.go | 2 +- database/migrations/000001_init.up.sql | 72 +- database/models/follow_list.go | 395 +-------- database/models/reactions.go | 595 ++------------ database/models/text_notes.go | 590 +------------- database/models/users_metadata.go | 1015 +----------------------- handlers/event_handler.go | 30 + handlers/kind_handler.go | 115 +++ relay/relay.go | 2 +- server/server.go | 41 +- sqlboiler.yml | 4 + types/kind.go | 2 +- types/message/message.go | 2 +- 16 files changed, 313 insertions(+), 2564 deletions(-) create mode 100644 handlers/event_handler.go create mode 100644 handlers/kind_handler.go diff --git a/.gitignore b/.gitignore index c795b05..1899660 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -build \ No newline at end of file +build +.vscode \ No newline at end of file diff --git a/cmd/commands/run.go b/cmd/commands/run.go index 4d496cc..61879fb 100644 --- a/cmd/commands/run.go +++ b/cmd/commands/run.go @@ -16,7 +16,7 @@ func HandleRun(args []string) { ExitOnError(errors.New("at least 1 arguments expected\nuse help command for more information")) } - cfg, err := config.LoadfromFile(args[2]) + cfg, err := config.LoadFromFile(args[2]) if err != nil { ExitOnError(err) } diff --git a/config/config.go b/config/config.go index ab094b7..d0096ca 100644 --- a/config/config.go +++ b/config/config.go @@ -14,8 +14,8 @@ type Config struct { DatabaseConf database.Config `yaml:"database"` } -// LoadfromFile loads config from file, databse and env. -func LoadfromFile(path string) (*Config, error) { +// Load fromFile loads config from file, databse and env. +func LoadFromFile(path string) (*Config, error) { file, err := os.Open(path) if err != nil { return nil, Error{ @@ -34,7 +34,8 @@ func LoadfromFile(path string) (*Config, error) { } } - config.DatabaseConf.DSN = os.Getenv("IMMO_DB_DSN") + // TODO ::: (kehiy) fix read dsn from dsn. + config.DatabaseConf.DSN = "postgresql://dev_user:dev_password@localhost:5432/dev_db?sslmode=disable&search_path=public" if err = config.basicCheck(); err != nil { return nil, Error{ diff --git a/config/config_test.go b/config/config_test.go index 0dcdaaf..6689cba 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -9,7 +9,7 @@ import ( ) func TestLoadfromFile(t *testing.T) { - cfg, err := config.LoadfromFile("./config.yml") + cfg, err := config.LoadFromFile("./config.yml") require.NoError(t, err, "error must be nil.") assert.Equal(t, uint16(7777), cfg.ServerConf.Port) diff --git a/database/migrations/000001_init.up.sql b/database/migrations/000001_init.up.sql index 9b96dc1..4714b18 100644 --- a/database/migrations/000001_init.up.sql +++ b/database/migrations/000001_init.up.sql @@ -1,24 +1,26 @@ BEGIN; CREATE TABLE public.follow_list ( - follower CHAR(32), -- Optional, so no NOT NULL - following CHAR(32), -- Optional, so no NOT NULL + follower CHAR(64), -- Optional, so no NOT NULL + following CHAR(64), -- Optional, so no NOT NULL created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- You may need a trigger for automatic updates deleted_at TIMESTAMP, - PRIMARY KEY (follower, following), - CONSTRAINT follower_following UNIQUE (follower, following) + PRIMARY KEY (follower, following) ); CREATE TABLE public.reactions ( - id UUID NOT NULL, - text_notesid UUID, -- Optional, so no NOT NULL - users_metadatapub_key CHAR(32), -- Optional, so no NOT NULL - e TEXT[], -- Assuming e is an array of text - p TEXT[], -- Assuming p is an array of text - a TEXT[], -- Assuming a is an array of text - event JSONB NOT NULL, - k TEXT[], -- Assuming k is an array of text + id CHAR(64) NOT NULL, + text_notesid CHAR(64), -- Optional, so no NOT NULL + users_metadatapub_key CHAR(64), -- Optional, so no NOT NULL + e_tags TEXT[], -- Assuming e is an array of text + p_tags TEXT[], -- Assuming p is an array of text + a_tags TEXT[], -- Assuming a is an array of text + k_tags TEXT[], -- Assuming k is an array of text + r_tags TEXT[], -- Assuming r is an array of text + content VARCHAR(8), + event TEXT NOT NULL, + event_created_at TIMESTAMP NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP, @@ -26,48 +28,44 @@ CREATE TABLE public.reactions ( ); CREATE TABLE public.text_notes ( - id UUID NOT NULL, - e TEXT[], -- Assuming e is an array of text - p TEXT[], -- Assuming p is an array of text - content VARCHAR(65535), - event JSONB NOT NULL UNIQUE, + id CHAR(64) NOT NULL, + e_tags TEXT[], -- Assuming e is an array of text + p_tags TEXT[], -- Assuming p is an array of text + event TEXT NOT NULL UNIQUE, + event_created_at TIMESTAMP NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP, - users_metadatapub_key CHAR(32), -- Optional, so no NOT NULL + users_metadatapub_key CHAR(64), -- Optional, so no NOT NULL PRIMARY KEY (id) ); CREATE TABLE public.users_metadata ( - pub_key CHAR(32) NOT NULL, + pub_key CHAR(64) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP, - content VARCHAR(255), - follow_list_event JSONB, + content VARCHAR(65535), + follow_list_event TEXT, PRIMARY KEY (pub_key) ); -- Index for better query performance CREATE INDEX reactions_text_notesid ON public.reactions (text_notesid); --- Foreign key constraints with optional references -ALTER TABLE public.reactions - ADD CONSTRAINT FKreactions_users_metadata - FOREIGN KEY (users_metadatapub_key) REFERENCES public.users_metadata (pub_key); +-- Index for deleted entities in follow_list +CREATE INDEX follow_list_deleted_at_idx ON public.follow_list (deleted_at); + +-- Index for deleted entities in reactions +CREATE INDEX reactions_deleted_at_idx ON public.reactions (deleted_at); -ALTER TABLE public.follow_list - ADD CONSTRAINT FKfollow_list_following - FOREIGN KEY (following) REFERENCES public.users_metadata (pub_key), - ADD CONSTRAINT FKfollow_list_follower - FOREIGN KEY (follower) REFERENCES public.users_metadata (pub_key); +-- Index for deleted entities in text_notes +CREATE INDEX text_notes_deleted_at_idx ON public.text_notes (deleted_at); -ALTER TABLE public.reactions - ADD CONSTRAINT FKreactions_text_notes - FOREIGN KEY (text_notesid) REFERENCES public.text_notes (id); +-- Index for deleted entities in users_metadata +CREATE INDEX users_metadata_deleted_at_idx ON public.users_metadata (deleted_at); -ALTER TABLE public.text_notes - ADD CONSTRAINT FKtext_notes_users_metadata - FOREIGN KEY (users_metadatapub_key) REFERENCES public.users_metadata (pub_key); +-- Composite index on follow_list by follower and following +CREATE INDEX idx_follow_list_follower_following ON public.follow_list (follower, following); -COMMIT; \ No newline at end of file +COMMIT; diff --git a/database/models/follow_list.go b/database/models/follow_list.go index e9b76ca..10b69f7 100644 --- a/database/models/follow_list.go +++ b/database/models/follow_list.go @@ -152,17 +152,10 @@ var FollowListWhere = struct { // FollowListRels is where relationship names are stored. var FollowListRels = struct { - FollowerUsersMetadatum string - FollowingUsersMetadatum string -}{ - FollowerUsersMetadatum: "FollowerUsersMetadatum", - FollowingUsersMetadatum: "FollowingUsersMetadatum", -} +}{} // followListR is where relationships are stored. type followListR struct { - FollowerUsersMetadatum *UsersMetadatum `boil:"FollowerUsersMetadatum" json:"FollowerUsersMetadatum" toml:"FollowerUsersMetadatum" yaml:"FollowerUsersMetadatum"` - FollowingUsersMetadatum *UsersMetadatum `boil:"FollowingUsersMetadatum" json:"FollowingUsersMetadatum" toml:"FollowingUsersMetadatum" yaml:"FollowingUsersMetadatum"` } // NewStruct creates a new relationship struct @@ -170,20 +163,6 @@ func (*followListR) NewStruct() *followListR { return &followListR{} } -func (r *followListR) GetFollowerUsersMetadatum() *UsersMetadatum { - if r == nil { - return nil - } - return r.FollowerUsersMetadatum -} - -func (r *followListR) GetFollowingUsersMetadatum() *UsersMetadatum { - if r == nil { - return nil - } - return r.FollowingUsersMetadatum -} - // followListL is where Load methods for each relationship are stored. type followListL struct{} @@ -520,378 +499,6 @@ func (q followListQuery) Exists(ctx context.Context, exec boil.ContextExecutor) return count > 0, nil } -// FollowerUsersMetadatum pointed to by the foreign key. -func (o *FollowList) FollowerUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { - queryMods := []qm.QueryMod{ - qm.Where("\"pub_key\" = ?", o.Follower), - } - - queryMods = append(queryMods, mods...) - - return UsersMetadata(queryMods...) -} - -// FollowingUsersMetadatum pointed to by the foreign key. -func (o *FollowList) FollowingUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { - queryMods := []qm.QueryMod{ - qm.Where("\"pub_key\" = ?", o.Following), - } - - queryMods = append(queryMods, mods...) - - return UsersMetadata(queryMods...) -} - -// LoadFollowerUsersMetadatum allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for an N-1 relationship. -func (followListL) LoadFollowerUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeFollowList interface{}, mods queries.Applicator) error { - var slice []*FollowList - var object *FollowList - - if singular { - var ok bool - object, ok = maybeFollowList.(*FollowList) - if !ok { - object = new(FollowList) - ok = queries.SetFromEmbeddedStruct(&object, &maybeFollowList) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeFollowList)) - } - } - } else { - s, ok := maybeFollowList.(*[]*FollowList) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeFollowList) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeFollowList)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &followListR{} - } - args[object.Follower] = struct{}{} - - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &followListR{} - } - - args[obj.Follower] = struct{}{} - - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`users_metadata`), - qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load UsersMetadatum") - } - - var resultSlice []*UsersMetadatum - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results of eager load for users_metadata") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") - } - - if len(usersMetadatumAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - - if len(resultSlice) == 0 { - return nil - } - - if singular { - foreign := resultSlice[0] - object.R.FollowerUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.FollowerFollowLists = append(foreign.R.FollowerFollowLists, object) - return nil - } - - for _, local := range slice { - for _, foreign := range resultSlice { - if local.Follower == foreign.PubKey { - local.R.FollowerUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.FollowerFollowLists = append(foreign.R.FollowerFollowLists, local) - break - } - } - } - - return nil -} - -// LoadFollowingUsersMetadatum allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for an N-1 relationship. -func (followListL) LoadFollowingUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeFollowList interface{}, mods queries.Applicator) error { - var slice []*FollowList - var object *FollowList - - if singular { - var ok bool - object, ok = maybeFollowList.(*FollowList) - if !ok { - object = new(FollowList) - ok = queries.SetFromEmbeddedStruct(&object, &maybeFollowList) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeFollowList)) - } - } - } else { - s, ok := maybeFollowList.(*[]*FollowList) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeFollowList) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeFollowList)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &followListR{} - } - args[object.Following] = struct{}{} - - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &followListR{} - } - - args[obj.Following] = struct{}{} - - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`users_metadata`), - qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load UsersMetadatum") - } - - var resultSlice []*UsersMetadatum - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results of eager load for users_metadata") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") - } - - if len(usersMetadatumAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - - if len(resultSlice) == 0 { - return nil - } - - if singular { - foreign := resultSlice[0] - object.R.FollowingUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.FollowingFollowLists = append(foreign.R.FollowingFollowLists, object) - return nil - } - - for _, local := range slice { - for _, foreign := range resultSlice { - if local.Following == foreign.PubKey { - local.R.FollowingUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.FollowingFollowLists = append(foreign.R.FollowingFollowLists, local) - break - } - } - } - - return nil -} - -// SetFollowerUsersMetadatumG of the followList to the related item. -// Sets o.R.FollowerUsersMetadatum to related. -// Adds o to related.R.FollowerFollowLists. -// Uses the global database handle. -func (o *FollowList) SetFollowerUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { - return o.SetFollowerUsersMetadatum(ctx, boil.GetContextDB(), insert, related) -} - -// SetFollowerUsersMetadatum of the followList to the related item. -// Sets o.R.FollowerUsersMetadatum to related. -// Adds o to related.R.FollowerFollowLists. -func (o *FollowList) SetFollowerUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { - var err error - if insert { - if err = related.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } - - updateQuery := fmt.Sprintf( - "UPDATE \"follow_list\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"follower"}), - strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), - ) - values := []interface{}{related.PubKey, o.Follower, o.Following} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - o.Follower = related.PubKey - if o.R == nil { - o.R = &followListR{ - FollowerUsersMetadatum: related, - } - } else { - o.R.FollowerUsersMetadatum = related - } - - if related.R == nil { - related.R = &usersMetadatumR{ - FollowerFollowLists: FollowListSlice{o}, - } - } else { - related.R.FollowerFollowLists = append(related.R.FollowerFollowLists, o) - } - - return nil -} - -// SetFollowingUsersMetadatumG of the followList to the related item. -// Sets o.R.FollowingUsersMetadatum to related. -// Adds o to related.R.FollowingFollowLists. -// Uses the global database handle. -func (o *FollowList) SetFollowingUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { - return o.SetFollowingUsersMetadatum(ctx, boil.GetContextDB(), insert, related) -} - -// SetFollowingUsersMetadatum of the followList to the related item. -// Sets o.R.FollowingUsersMetadatum to related. -// Adds o to related.R.FollowingFollowLists. -func (o *FollowList) SetFollowingUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { - var err error - if insert { - if err = related.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } - - updateQuery := fmt.Sprintf( - "UPDATE \"follow_list\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"following"}), - strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), - ) - values := []interface{}{related.PubKey, o.Follower, o.Following} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - o.Following = related.PubKey - if o.R == nil { - o.R = &followListR{ - FollowingUsersMetadatum: related, - } - } else { - o.R.FollowingUsersMetadatum = related - } - - if related.R == nil { - related.R = &usersMetadatumR{ - FollowingFollowLists: FollowListSlice{o}, - } - } else { - related.R.FollowingFollowLists = append(related.R.FollowingFollowLists, o) - } - - return nil -} - // FollowLists retrieves all the records using an executor. func FollowLists(mods ...qm.QueryMod) followListQuery { mods = append(mods, qm.From("\"follow_list\"")) diff --git a/database/models/reactions.go b/database/models/reactions.go index 7b99e73..89c0576 100644 --- a/database/models/reactions.go +++ b/database/models/reactions.go @@ -28,11 +28,14 @@ type Reaction struct { ID string `boil:"id" json:"id" toml:"id" yaml:"id"` TextNotesid null.String `boil:"text_notesid" json:"text_notesid,omitempty" toml:"text_notesid" yaml:"text_notesid,omitempty"` UsersMetadatapubKey null.String `boil:"users_metadatapub_key" json:"users_metadatapub_key,omitempty" toml:"users_metadatapub_key" yaml:"users_metadatapub_key,omitempty"` - E types.StringArray `boil:"e" json:"e,omitempty" toml:"e" yaml:"e,omitempty"` - P types.StringArray `boil:"p" json:"p,omitempty" toml:"p" yaml:"p,omitempty"` - A types.StringArray `boil:"a" json:"a,omitempty" toml:"a" yaml:"a,omitempty"` - Event types.JSON `boil:"event" json:"event" toml:"event" yaml:"event"` - K types.StringArray `boil:"k" json:"k,omitempty" toml:"k" yaml:"k,omitempty"` + ETags types.StringArray `boil:"e_tags" json:"e_tags,omitempty" toml:"e_tags" yaml:"e_tags,omitempty"` + PTags types.StringArray `boil:"p_tags" json:"p_tags,omitempty" toml:"p_tags" yaml:"p_tags,omitempty"` + ATags types.StringArray `boil:"a_tags" json:"a_tags,omitempty" toml:"a_tags" yaml:"a_tags,omitempty"` + KTags types.StringArray `boil:"k_tags" json:"k_tags,omitempty" toml:"k_tags" yaml:"k_tags,omitempty"` + RTags types.StringArray `boil:"r_tags" json:"r_tags,omitempty" toml:"r_tags" yaml:"r_tags,omitempty"` + Content null.String `boil:"content" json:"content,omitempty" toml:"content" yaml:"content,omitempty"` + Event string `boil:"event" json:"event" toml:"event" yaml:"event"` + EventCreatedAt time.Time `boil:"event_created_at" json:"event_created_at" toml:"event_created_at" yaml:"event_created_at"` CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` @@ -45,11 +48,14 @@ var ReactionColumns = struct { ID string TextNotesid string UsersMetadatapubKey string - E string - P string - A string + ETags string + PTags string + ATags string + KTags string + RTags string + Content string Event string - K string + EventCreatedAt string CreatedAt string UpdatedAt string DeletedAt string @@ -57,11 +63,14 @@ var ReactionColumns = struct { ID: "id", TextNotesid: "text_notesid", UsersMetadatapubKey: "users_metadatapub_key", - E: "e", - P: "p", - A: "a", + ETags: "e_tags", + PTags: "p_tags", + ATags: "a_tags", + KTags: "k_tags", + RTags: "r_tags", + Content: "content", Event: "event", - K: "k", + EventCreatedAt: "event_created_at", CreatedAt: "created_at", UpdatedAt: "updated_at", DeletedAt: "deleted_at", @@ -71,11 +80,14 @@ var ReactionTableColumns = struct { ID string TextNotesid string UsersMetadatapubKey string - E string - P string - A string + ETags string + PTags string + ATags string + KTags string + RTags string + Content string Event string - K string + EventCreatedAt string CreatedAt string UpdatedAt string DeletedAt string @@ -83,11 +95,14 @@ var ReactionTableColumns = struct { ID: "reactions.id", TextNotesid: "reactions.text_notesid", UsersMetadatapubKey: "reactions.users_metadatapub_key", - E: "reactions.e", - P: "reactions.p", - A: "reactions.a", + ETags: "reactions.e_tags", + PTags: "reactions.p_tags", + ATags: "reactions.a_tags", + KTags: "reactions.k_tags", + RTags: "reactions.r_tags", + Content: "reactions.content", Event: "reactions.event", - K: "reactions.k", + EventCreatedAt: "reactions.event_created_at", CreatedAt: "reactions.created_at", UpdatedAt: "reactions.updated_at", DeletedAt: "reactions.deleted_at", @@ -171,36 +186,18 @@ func (w whereHelpertypes_StringArray) IsNotNull() qm.QueryMod { return qmhelper.WhereIsNotNull(w.field) } -type whereHelpertypes_JSON struct{ field string } - -func (w whereHelpertypes_JSON) EQ(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.EQ, x) -} -func (w whereHelpertypes_JSON) NEQ(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.NEQ, x) -} -func (w whereHelpertypes_JSON) LT(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.LT, x) -} -func (w whereHelpertypes_JSON) LTE(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.LTE, x) -} -func (w whereHelpertypes_JSON) GT(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.GT, x) -} -func (w whereHelpertypes_JSON) GTE(x types.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.GTE, x) -} - var ReactionWhere = struct { ID whereHelperstring TextNotesid whereHelpernull_String UsersMetadatapubKey whereHelpernull_String - E whereHelpertypes_StringArray - P whereHelpertypes_StringArray - A whereHelpertypes_StringArray - Event whereHelpertypes_JSON - K whereHelpertypes_StringArray + ETags whereHelpertypes_StringArray + PTags whereHelpertypes_StringArray + ATags whereHelpertypes_StringArray + KTags whereHelpertypes_StringArray + RTags whereHelpertypes_StringArray + Content whereHelpernull_String + Event whereHelperstring + EventCreatedAt whereHelpertime_Time CreatedAt whereHelpertime_Time UpdatedAt whereHelpertime_Time DeletedAt whereHelpernull_Time @@ -208,11 +205,14 @@ var ReactionWhere = struct { ID: whereHelperstring{field: "\"reactions\".\"id\""}, TextNotesid: whereHelpernull_String{field: "\"reactions\".\"text_notesid\""}, UsersMetadatapubKey: whereHelpernull_String{field: "\"reactions\".\"users_metadatapub_key\""}, - E: whereHelpertypes_StringArray{field: "\"reactions\".\"e\""}, - P: whereHelpertypes_StringArray{field: "\"reactions\".\"p\""}, - A: whereHelpertypes_StringArray{field: "\"reactions\".\"a\""}, - Event: whereHelpertypes_JSON{field: "\"reactions\".\"event\""}, - K: whereHelpertypes_StringArray{field: "\"reactions\".\"k\""}, + ETags: whereHelpertypes_StringArray{field: "\"reactions\".\"e_tags\""}, + PTags: whereHelpertypes_StringArray{field: "\"reactions\".\"p_tags\""}, + ATags: whereHelpertypes_StringArray{field: "\"reactions\".\"a_tags\""}, + KTags: whereHelpertypes_StringArray{field: "\"reactions\".\"k_tags\""}, + RTags: whereHelpertypes_StringArray{field: "\"reactions\".\"r_tags\""}, + Content: whereHelpernull_String{field: "\"reactions\".\"content\""}, + Event: whereHelperstring{field: "\"reactions\".\"event\""}, + EventCreatedAt: whereHelpertime_Time{field: "\"reactions\".\"event_created_at\""}, CreatedAt: whereHelpertime_Time{field: "\"reactions\".\"created_at\""}, UpdatedAt: whereHelpertime_Time{field: "\"reactions\".\"updated_at\""}, DeletedAt: whereHelpernull_Time{field: "\"reactions\".\"deleted_at\""}, @@ -220,17 +220,10 @@ var ReactionWhere = struct { // ReactionRels is where relationship names are stored. var ReactionRels = struct { - TextNotesidTextNote string - UsersMetadatapubKeyUsersMetadatum string -}{ - TextNotesidTextNote: "TextNotesidTextNote", - UsersMetadatapubKeyUsersMetadatum: "UsersMetadatapubKeyUsersMetadatum", -} +}{} // reactionR is where relationships are stored. type reactionR struct { - TextNotesidTextNote *TextNote `boil:"TextNotesidTextNote" json:"TextNotesidTextNote" toml:"TextNotesidTextNote" yaml:"TextNotesidTextNote"` - UsersMetadatapubKeyUsersMetadatum *UsersMetadatum `boil:"UsersMetadatapubKeyUsersMetadatum" json:"UsersMetadatapubKeyUsersMetadatum" toml:"UsersMetadatapubKeyUsersMetadatum" yaml:"UsersMetadatapubKeyUsersMetadatum"` } // NewStruct creates a new relationship struct @@ -238,27 +231,13 @@ func (*reactionR) NewStruct() *reactionR { return &reactionR{} } -func (r *reactionR) GetTextNotesidTextNote() *TextNote { - if r == nil { - return nil - } - return r.TextNotesidTextNote -} - -func (r *reactionR) GetUsersMetadatapubKeyUsersMetadatum() *UsersMetadatum { - if r == nil { - return nil - } - return r.UsersMetadatapubKeyUsersMetadatum -} - // reactionL is where Load methods for each relationship are stored. type reactionL struct{} var ( - reactionAllColumns = []string{"id", "text_notesid", "users_metadatapub_key", "e", "p", "a", "event", "k", "created_at", "updated_at", "deleted_at"} - reactionColumnsWithoutDefault = []string{"id", "event"} - reactionColumnsWithDefault = []string{"text_notesid", "users_metadatapub_key", "e", "p", "a", "k", "created_at", "updated_at", "deleted_at"} + reactionAllColumns = []string{"id", "text_notesid", "users_metadatapub_key", "e_tags", "p_tags", "a_tags", "k_tags", "r_tags", "content", "event", "event_created_at", "created_at", "updated_at", "deleted_at"} + reactionColumnsWithoutDefault = []string{"id", "event", "event_created_at"} + reactionColumnsWithDefault = []string{"text_notesid", "users_metadatapub_key", "e_tags", "p_tags", "a_tags", "k_tags", "r_tags", "content", "created_at", "updated_at", "deleted_at"} reactionPrimaryKeyColumns = []string{"id"} reactionGeneratedColumns = []string{} ) @@ -588,468 +567,6 @@ func (q reactionQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (b return count > 0, nil } -// TextNotesidTextNote pointed to by the foreign key. -func (o *Reaction) TextNotesidTextNote(mods ...qm.QueryMod) textNoteQuery { - queryMods := []qm.QueryMod{ - qm.Where("\"id\" = ?", o.TextNotesid), - } - - queryMods = append(queryMods, mods...) - - return TextNotes(queryMods...) -} - -// UsersMetadatapubKeyUsersMetadatum pointed to by the foreign key. -func (o *Reaction) UsersMetadatapubKeyUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { - queryMods := []qm.QueryMod{ - qm.Where("\"pub_key\" = ?", o.UsersMetadatapubKey), - } - - queryMods = append(queryMods, mods...) - - return UsersMetadata(queryMods...) -} - -// LoadTextNotesidTextNote allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for an N-1 relationship. -func (reactionL) LoadTextNotesidTextNote(ctx context.Context, e boil.ContextExecutor, singular bool, maybeReaction interface{}, mods queries.Applicator) error { - var slice []*Reaction - var object *Reaction - - if singular { - var ok bool - object, ok = maybeReaction.(*Reaction) - if !ok { - object = new(Reaction) - ok = queries.SetFromEmbeddedStruct(&object, &maybeReaction) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeReaction)) - } - } - } else { - s, ok := maybeReaction.(*[]*Reaction) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeReaction) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeReaction)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &reactionR{} - } - if !queries.IsNil(object.TextNotesid) { - args[object.TextNotesid] = struct{}{} - } - - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &reactionR{} - } - - if !queries.IsNil(obj.TextNotesid) { - args[obj.TextNotesid] = struct{}{} - } - - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`text_notes`), - qm.WhereIn(`text_notes.id in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load TextNote") - } - - var resultSlice []*TextNote - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice TextNote") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results of eager load for text_notes") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for text_notes") - } - - if len(textNoteAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - - if len(resultSlice) == 0 { - return nil - } - - if singular { - foreign := resultSlice[0] - object.R.TextNotesidTextNote = foreign - if foreign.R == nil { - foreign.R = &textNoteR{} - } - foreign.R.TextNotesidReactions = append(foreign.R.TextNotesidReactions, object) - return nil - } - - for _, local := range slice { - for _, foreign := range resultSlice { - if queries.Equal(local.TextNotesid, foreign.ID) { - local.R.TextNotesidTextNote = foreign - if foreign.R == nil { - foreign.R = &textNoteR{} - } - foreign.R.TextNotesidReactions = append(foreign.R.TextNotesidReactions, local) - break - } - } - } - - return nil -} - -// LoadUsersMetadatapubKeyUsersMetadatum allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for an N-1 relationship. -func (reactionL) LoadUsersMetadatapubKeyUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeReaction interface{}, mods queries.Applicator) error { - var slice []*Reaction - var object *Reaction - - if singular { - var ok bool - object, ok = maybeReaction.(*Reaction) - if !ok { - object = new(Reaction) - ok = queries.SetFromEmbeddedStruct(&object, &maybeReaction) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeReaction)) - } - } - } else { - s, ok := maybeReaction.(*[]*Reaction) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeReaction) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeReaction)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &reactionR{} - } - if !queries.IsNil(object.UsersMetadatapubKey) { - args[object.UsersMetadatapubKey] = struct{}{} - } - - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &reactionR{} - } - - if !queries.IsNil(obj.UsersMetadatapubKey) { - args[obj.UsersMetadatapubKey] = struct{}{} - } - - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`users_metadata`), - qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load UsersMetadatum") - } - - var resultSlice []*UsersMetadatum - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results of eager load for users_metadata") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") - } - - if len(usersMetadatumAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - - if len(resultSlice) == 0 { - return nil - } - - if singular { - foreign := resultSlice[0] - object.R.UsersMetadatapubKeyUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.UsersMetadatapubKeyReactions = append(foreign.R.UsersMetadatapubKeyReactions, object) - return nil - } - - for _, local := range slice { - for _, foreign := range resultSlice { - if queries.Equal(local.UsersMetadatapubKey, foreign.PubKey) { - local.R.UsersMetadatapubKeyUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.UsersMetadatapubKeyReactions = append(foreign.R.UsersMetadatapubKeyReactions, local) - break - } - } - } - - return nil -} - -// SetTextNotesidTextNoteG of the reaction to the related item. -// Sets o.R.TextNotesidTextNote to related. -// Adds o to related.R.TextNotesidReactions. -// Uses the global database handle. -func (o *Reaction) SetTextNotesidTextNoteG(ctx context.Context, insert bool, related *TextNote) error { - return o.SetTextNotesidTextNote(ctx, boil.GetContextDB(), insert, related) -} - -// SetTextNotesidTextNote of the reaction to the related item. -// Sets o.R.TextNotesidTextNote to related. -// Adds o to related.R.TextNotesidReactions. -func (o *Reaction) SetTextNotesidTextNote(ctx context.Context, exec boil.ContextExecutor, insert bool, related *TextNote) error { - var err error - if insert { - if err = related.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } - - updateQuery := fmt.Sprintf( - "UPDATE \"reactions\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"text_notesid"}), - strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), - ) - values := []interface{}{related.ID, o.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - queries.Assign(&o.TextNotesid, related.ID) - if o.R == nil { - o.R = &reactionR{ - TextNotesidTextNote: related, - } - } else { - o.R.TextNotesidTextNote = related - } - - if related.R == nil { - related.R = &textNoteR{ - TextNotesidReactions: ReactionSlice{o}, - } - } else { - related.R.TextNotesidReactions = append(related.R.TextNotesidReactions, o) - } - - return nil -} - -// RemoveTextNotesidTextNoteG relationship. -// Sets o.R.TextNotesidTextNote to nil. -// Removes o from all passed in related items' relationships struct. -// Uses the global database handle. -func (o *Reaction) RemoveTextNotesidTextNoteG(ctx context.Context, related *TextNote) error { - return o.RemoveTextNotesidTextNote(ctx, boil.GetContextDB(), related) -} - -// RemoveTextNotesidTextNote relationship. -// Sets o.R.TextNotesidTextNote to nil. -// Removes o from all passed in related items' relationships struct. -func (o *Reaction) RemoveTextNotesidTextNote(ctx context.Context, exec boil.ContextExecutor, related *TextNote) error { - var err error - - queries.SetScanner(&o.TextNotesid, nil) - if _, err = o.Update(ctx, exec, boil.Whitelist("text_notesid")); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - if o.R != nil { - o.R.TextNotesidTextNote = nil - } - if related == nil || related.R == nil { - return nil - } - - for i, ri := range related.R.TextNotesidReactions { - if queries.Equal(o.TextNotesid, ri.TextNotesid) { - continue - } - - ln := len(related.R.TextNotesidReactions) - if ln > 1 && i < ln-1 { - related.R.TextNotesidReactions[i] = related.R.TextNotesidReactions[ln-1] - } - related.R.TextNotesidReactions = related.R.TextNotesidReactions[:ln-1] - break - } - return nil -} - -// SetUsersMetadatapubKeyUsersMetadatumG of the reaction to the related item. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. -// Adds o to related.R.UsersMetadatapubKeyReactions. -// Uses the global database handle. -func (o *Reaction) SetUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { - return o.SetUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), insert, related) -} - -// SetUsersMetadatapubKeyUsersMetadatum of the reaction to the related item. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. -// Adds o to related.R.UsersMetadatapubKeyReactions. -func (o *Reaction) SetUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { - var err error - if insert { - if err = related.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } - - updateQuery := fmt.Sprintf( - "UPDATE \"reactions\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), - strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), - ) - values := []interface{}{related.PubKey, o.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - queries.Assign(&o.UsersMetadatapubKey, related.PubKey) - if o.R == nil { - o.R = &reactionR{ - UsersMetadatapubKeyUsersMetadatum: related, - } - } else { - o.R.UsersMetadatapubKeyUsersMetadatum = related - } - - if related.R == nil { - related.R = &usersMetadatumR{ - UsersMetadatapubKeyReactions: ReactionSlice{o}, - } - } else { - related.R.UsersMetadatapubKeyReactions = append(related.R.UsersMetadatapubKeyReactions, o) - } - - return nil -} - -// RemoveUsersMetadatapubKeyUsersMetadatumG relationship. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. -// Removes o from all passed in related items' relationships struct. -// Uses the global database handle. -func (o *Reaction) RemoveUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, related *UsersMetadatum) error { - return o.RemoveUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), related) -} - -// RemoveUsersMetadatapubKeyUsersMetadatum relationship. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. -// Removes o from all passed in related items' relationships struct. -func (o *Reaction) RemoveUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, related *UsersMetadatum) error { - var err error - - queries.SetScanner(&o.UsersMetadatapubKey, nil) - if _, err = o.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - if o.R != nil { - o.R.UsersMetadatapubKeyUsersMetadatum = nil - } - if related == nil || related.R == nil { - return nil - } - - for i, ri := range related.R.UsersMetadatapubKeyReactions { - if queries.Equal(o.UsersMetadatapubKey, ri.UsersMetadatapubKey) { - continue - } - - ln := len(related.R.UsersMetadatapubKeyReactions) - if ln > 1 && i < ln-1 { - related.R.UsersMetadatapubKeyReactions[i] = related.R.UsersMetadatapubKeyReactions[ln-1] - } - related.R.UsersMetadatapubKeyReactions = related.R.UsersMetadatapubKeyReactions[:ln-1] - break - } - return nil -} - // Reactions retrieves all the records using an executor. func Reactions(mods ...qm.QueryMod) reactionQuery { mods = append(mods, qm.From("\"reactions\"")) diff --git a/database/models/text_notes.go b/database/models/text_notes.go index 6a7df4d..a5db5f3 100644 --- a/database/models/text_notes.go +++ b/database/models/text_notes.go @@ -26,10 +26,10 @@ import ( // TextNote is an object representing the database table. type TextNote struct { ID string `boil:"id" json:"id" toml:"id" yaml:"id"` - E types.StringArray `boil:"e" json:"e,omitempty" toml:"e" yaml:"e,omitempty"` - P types.StringArray `boil:"p" json:"p,omitempty" toml:"p" yaml:"p,omitempty"` - Content null.String `boil:"content" json:"content,omitempty" toml:"content" yaml:"content,omitempty"` - Event types.JSON `boil:"event" json:"event" toml:"event" yaml:"event"` + ETags types.StringArray `boil:"e_tags" json:"e_tags,omitempty" toml:"e_tags" yaml:"e_tags,omitempty"` + PTags types.StringArray `boil:"p_tags" json:"p_tags,omitempty" toml:"p_tags" yaml:"p_tags,omitempty"` + Event string `boil:"event" json:"event" toml:"event" yaml:"event"` + EventCreatedAt time.Time `boil:"event_created_at" json:"event_created_at" toml:"event_created_at" yaml:"event_created_at"` CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` @@ -41,20 +41,20 @@ type TextNote struct { var TextNoteColumns = struct { ID string - E string - P string - Content string + ETags string + PTags string Event string + EventCreatedAt string CreatedAt string UpdatedAt string DeletedAt string UsersMetadatapubKey string }{ ID: "id", - E: "e", - P: "p", - Content: "content", + ETags: "e_tags", + PTags: "p_tags", Event: "event", + EventCreatedAt: "event_created_at", CreatedAt: "created_at", UpdatedAt: "updated_at", DeletedAt: "deleted_at", @@ -63,20 +63,20 @@ var TextNoteColumns = struct { var TextNoteTableColumns = struct { ID string - E string - P string - Content string + ETags string + PTags string Event string + EventCreatedAt string CreatedAt string UpdatedAt string DeletedAt string UsersMetadatapubKey string }{ ID: "text_notes.id", - E: "text_notes.e", - P: "text_notes.p", - Content: "text_notes.content", + ETags: "text_notes.e_tags", + PTags: "text_notes.p_tags", Event: "text_notes.event", + EventCreatedAt: "text_notes.event_created_at", CreatedAt: "text_notes.created_at", UpdatedAt: "text_notes.updated_at", DeletedAt: "text_notes.deleted_at", @@ -87,20 +87,20 @@ var TextNoteTableColumns = struct { var TextNoteWhere = struct { ID whereHelperstring - E whereHelpertypes_StringArray - P whereHelpertypes_StringArray - Content whereHelpernull_String - Event whereHelpertypes_JSON + ETags whereHelpertypes_StringArray + PTags whereHelpertypes_StringArray + Event whereHelperstring + EventCreatedAt whereHelpertime_Time CreatedAt whereHelpertime_Time UpdatedAt whereHelpertime_Time DeletedAt whereHelpernull_Time UsersMetadatapubKey whereHelpernull_String }{ ID: whereHelperstring{field: "\"text_notes\".\"id\""}, - E: whereHelpertypes_StringArray{field: "\"text_notes\".\"e\""}, - P: whereHelpertypes_StringArray{field: "\"text_notes\".\"p\""}, - Content: whereHelpernull_String{field: "\"text_notes\".\"content\""}, - Event: whereHelpertypes_JSON{field: "\"text_notes\".\"event\""}, + ETags: whereHelpertypes_StringArray{field: "\"text_notes\".\"e_tags\""}, + PTags: whereHelpertypes_StringArray{field: "\"text_notes\".\"p_tags\""}, + Event: whereHelperstring{field: "\"text_notes\".\"event\""}, + EventCreatedAt: whereHelpertime_Time{field: "\"text_notes\".\"event_created_at\""}, CreatedAt: whereHelpertime_Time{field: "\"text_notes\".\"created_at\""}, UpdatedAt: whereHelpertime_Time{field: "\"text_notes\".\"updated_at\""}, DeletedAt: whereHelpernull_Time{field: "\"text_notes\".\"deleted_at\""}, @@ -109,17 +109,10 @@ var TextNoteWhere = struct { // TextNoteRels is where relationship names are stored. var TextNoteRels = struct { - UsersMetadatapubKeyUsersMetadatum string - TextNotesidReactions string -}{ - UsersMetadatapubKeyUsersMetadatum: "UsersMetadatapubKeyUsersMetadatum", - TextNotesidReactions: "TextNotesidReactions", -} +}{} // textNoteR is where relationships are stored. type textNoteR struct { - UsersMetadatapubKeyUsersMetadatum *UsersMetadatum `boil:"UsersMetadatapubKeyUsersMetadatum" json:"UsersMetadatapubKeyUsersMetadatum" toml:"UsersMetadatapubKeyUsersMetadatum" yaml:"UsersMetadatapubKeyUsersMetadatum"` - TextNotesidReactions ReactionSlice `boil:"TextNotesidReactions" json:"TextNotesidReactions" toml:"TextNotesidReactions" yaml:"TextNotesidReactions"` } // NewStruct creates a new relationship struct @@ -127,27 +120,13 @@ func (*textNoteR) NewStruct() *textNoteR { return &textNoteR{} } -func (r *textNoteR) GetUsersMetadatapubKeyUsersMetadatum() *UsersMetadatum { - if r == nil { - return nil - } - return r.UsersMetadatapubKeyUsersMetadatum -} - -func (r *textNoteR) GetTextNotesidReactions() ReactionSlice { - if r == nil { - return nil - } - return r.TextNotesidReactions -} - // textNoteL is where Load methods for each relationship are stored. type textNoteL struct{} var ( - textNoteAllColumns = []string{"id", "e", "p", "content", "event", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} - textNoteColumnsWithoutDefault = []string{"id", "event"} - textNoteColumnsWithDefault = []string{"e", "p", "content", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} + textNoteAllColumns = []string{"id", "e_tags", "p_tags", "event", "event_created_at", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} + textNoteColumnsWithoutDefault = []string{"id", "event", "event_created_at"} + textNoteColumnsWithDefault = []string{"e_tags", "p_tags", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} textNotePrimaryKeyColumns = []string{"id"} textNoteGeneratedColumns = []string{} ) @@ -477,519 +456,6 @@ func (q textNoteQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (b return count > 0, nil } -// UsersMetadatapubKeyUsersMetadatum pointed to by the foreign key. -func (o *TextNote) UsersMetadatapubKeyUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { - queryMods := []qm.QueryMod{ - qm.Where("\"pub_key\" = ?", o.UsersMetadatapubKey), - } - - queryMods = append(queryMods, mods...) - - return UsersMetadata(queryMods...) -} - -// TextNotesidReactions retrieves all the reaction's Reactions with an executor via text_notesid column. -func (o *TextNote) TextNotesidReactions(mods ...qm.QueryMod) reactionQuery { - var queryMods []qm.QueryMod - if len(mods) != 0 { - queryMods = append(queryMods, mods...) - } - - queryMods = append(queryMods, - qm.Where("\"reactions\".\"text_notesid\"=?", o.ID), - ) - - return Reactions(queryMods...) -} - -// LoadUsersMetadatapubKeyUsersMetadatum allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for an N-1 relationship. -func (textNoteL) LoadUsersMetadatapubKeyUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeTextNote interface{}, mods queries.Applicator) error { - var slice []*TextNote - var object *TextNote - - if singular { - var ok bool - object, ok = maybeTextNote.(*TextNote) - if !ok { - object = new(TextNote) - ok = queries.SetFromEmbeddedStruct(&object, &maybeTextNote) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeTextNote)) - } - } - } else { - s, ok := maybeTextNote.(*[]*TextNote) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeTextNote) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeTextNote)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &textNoteR{} - } - if !queries.IsNil(object.UsersMetadatapubKey) { - args[object.UsersMetadatapubKey] = struct{}{} - } - - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &textNoteR{} - } - - if !queries.IsNil(obj.UsersMetadatapubKey) { - args[obj.UsersMetadatapubKey] = struct{}{} - } - - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`users_metadata`), - qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load UsersMetadatum") - } - - var resultSlice []*UsersMetadatum - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results of eager load for users_metadata") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") - } - - if len(usersMetadatumAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - - if len(resultSlice) == 0 { - return nil - } - - if singular { - foreign := resultSlice[0] - object.R.UsersMetadatapubKeyUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.UsersMetadatapubKeyTextNotes = append(foreign.R.UsersMetadatapubKeyTextNotes, object) - return nil - } - - for _, local := range slice { - for _, foreign := range resultSlice { - if queries.Equal(local.UsersMetadatapubKey, foreign.PubKey) { - local.R.UsersMetadatapubKeyUsersMetadatum = foreign - if foreign.R == nil { - foreign.R = &usersMetadatumR{} - } - foreign.R.UsersMetadatapubKeyTextNotes = append(foreign.R.UsersMetadatapubKeyTextNotes, local) - break - } - } - } - - return nil -} - -// LoadTextNotesidReactions allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for a 1-M or N-M relationship. -func (textNoteL) LoadTextNotesidReactions(ctx context.Context, e boil.ContextExecutor, singular bool, maybeTextNote interface{}, mods queries.Applicator) error { - var slice []*TextNote - var object *TextNote - - if singular { - var ok bool - object, ok = maybeTextNote.(*TextNote) - if !ok { - object = new(TextNote) - ok = queries.SetFromEmbeddedStruct(&object, &maybeTextNote) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeTextNote)) - } - } - } else { - s, ok := maybeTextNote.(*[]*TextNote) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeTextNote) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeTextNote)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &textNoteR{} - } - args[object.ID] = struct{}{} - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &textNoteR{} - } - args[obj.ID] = struct{}{} - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`reactions`), - qm.WhereIn(`reactions.text_notesid in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load reactions") - } - - var resultSlice []*Reaction - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice reactions") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results in eager load on reactions") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for reactions") - } - - if len(reactionAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - if singular { - object.R.TextNotesidReactions = resultSlice - for _, foreign := range resultSlice { - if foreign.R == nil { - foreign.R = &reactionR{} - } - foreign.R.TextNotesidTextNote = object - } - return nil - } - - for _, foreign := range resultSlice { - for _, local := range slice { - if queries.Equal(local.ID, foreign.TextNotesid) { - local.R.TextNotesidReactions = append(local.R.TextNotesidReactions, foreign) - if foreign.R == nil { - foreign.R = &reactionR{} - } - foreign.R.TextNotesidTextNote = local - break - } - } - } - - return nil -} - -// SetUsersMetadatapubKeyUsersMetadatumG of the textNote to the related item. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. -// Adds o to related.R.UsersMetadatapubKeyTextNotes. -// Uses the global database handle. -func (o *TextNote) SetUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { - return o.SetUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), insert, related) -} - -// SetUsersMetadatapubKeyUsersMetadatum of the textNote to the related item. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. -// Adds o to related.R.UsersMetadatapubKeyTextNotes. -func (o *TextNote) SetUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { - var err error - if insert { - if err = related.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } - - updateQuery := fmt.Sprintf( - "UPDATE \"text_notes\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), - strmangle.WhereClause("\"", "\"", 2, textNotePrimaryKeyColumns), - ) - values := []interface{}{related.PubKey, o.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - queries.Assign(&o.UsersMetadatapubKey, related.PubKey) - if o.R == nil { - o.R = &textNoteR{ - UsersMetadatapubKeyUsersMetadatum: related, - } - } else { - o.R.UsersMetadatapubKeyUsersMetadatum = related - } - - if related.R == nil { - related.R = &usersMetadatumR{ - UsersMetadatapubKeyTextNotes: TextNoteSlice{o}, - } - } else { - related.R.UsersMetadatapubKeyTextNotes = append(related.R.UsersMetadatapubKeyTextNotes, o) - } - - return nil -} - -// RemoveUsersMetadatapubKeyUsersMetadatumG relationship. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. -// Removes o from all passed in related items' relationships struct. -// Uses the global database handle. -func (o *TextNote) RemoveUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, related *UsersMetadatum) error { - return o.RemoveUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), related) -} - -// RemoveUsersMetadatapubKeyUsersMetadatum relationship. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. -// Removes o from all passed in related items' relationships struct. -func (o *TextNote) RemoveUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, related *UsersMetadatum) error { - var err error - - queries.SetScanner(&o.UsersMetadatapubKey, nil) - if _, err = o.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { - return errors.Wrap(err, "failed to update local table") - } - - if o.R != nil { - o.R.UsersMetadatapubKeyUsersMetadatum = nil - } - if related == nil || related.R == nil { - return nil - } - - for i, ri := range related.R.UsersMetadatapubKeyTextNotes { - if queries.Equal(o.UsersMetadatapubKey, ri.UsersMetadatapubKey) { - continue - } - - ln := len(related.R.UsersMetadatapubKeyTextNotes) - if ln > 1 && i < ln-1 { - related.R.UsersMetadatapubKeyTextNotes[i] = related.R.UsersMetadatapubKeyTextNotes[ln-1] - } - related.R.UsersMetadatapubKeyTextNotes = related.R.UsersMetadatapubKeyTextNotes[:ln-1] - break - } - return nil -} - -// AddTextNotesidReactionsG adds the given related objects to the existing relationships -// of the text_note, optionally inserting them as new records. -// Appends related to o.R.TextNotesidReactions. -// Sets related.R.TextNotesidTextNote appropriately. -// Uses the global database handle. -func (o *TextNote) AddTextNotesidReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { - return o.AddTextNotesidReactions(ctx, boil.GetContextDB(), insert, related...) -} - -// AddTextNotesidReactions adds the given related objects to the existing relationships -// of the text_note, optionally inserting them as new records. -// Appends related to o.R.TextNotesidReactions. -// Sets related.R.TextNotesidTextNote appropriately. -func (o *TextNote) AddTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { - var err error - for _, rel := range related { - if insert { - queries.Assign(&rel.TextNotesid, o.ID) - if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } else { - updateQuery := fmt.Sprintf( - "UPDATE \"reactions\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"text_notesid"}), - strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), - ) - values := []interface{}{o.ID, rel.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update foreign table") - } - - queries.Assign(&rel.TextNotesid, o.ID) - } - } - - if o.R == nil { - o.R = &textNoteR{ - TextNotesidReactions: related, - } - } else { - o.R.TextNotesidReactions = append(o.R.TextNotesidReactions, related...) - } - - for _, rel := range related { - if rel.R == nil { - rel.R = &reactionR{ - TextNotesidTextNote: o, - } - } else { - rel.R.TextNotesidTextNote = o - } - } - return nil -} - -// SetTextNotesidReactionsG removes all previously related items of the -// text_note replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.TextNotesidTextNote's TextNotesidReactions accordingly. -// Replaces o.R.TextNotesidReactions with related. -// Sets related.R.TextNotesidTextNote's TextNotesidReactions accordingly. -// Uses the global database handle. -func (o *TextNote) SetTextNotesidReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { - return o.SetTextNotesidReactions(ctx, boil.GetContextDB(), insert, related...) -} - -// SetTextNotesidReactions removes all previously related items of the -// text_note replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.TextNotesidTextNote's TextNotesidReactions accordingly. -// Replaces o.R.TextNotesidReactions with related. -// Sets related.R.TextNotesidTextNote's TextNotesidReactions accordingly. -func (o *TextNote) SetTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { - query := "update \"reactions\" set \"text_notesid\" = null where \"text_notesid\" = $1" - values := []interface{}{o.ID} - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, query) - fmt.Fprintln(writer, values) - } - _, err := exec.ExecContext(ctx, query, values...) - if err != nil { - return errors.Wrap(err, "failed to remove relationships before set") - } - - if o.R != nil { - for _, rel := range o.R.TextNotesidReactions { - queries.SetScanner(&rel.TextNotesid, nil) - if rel.R == nil { - continue - } - - rel.R.TextNotesidTextNote = nil - } - o.R.TextNotesidReactions = nil - } - - return o.AddTextNotesidReactions(ctx, exec, insert, related...) -} - -// RemoveTextNotesidReactionsG relationships from objects passed in. -// Removes related items from R.TextNotesidReactions (uses pointer comparison, removal does not keep order) -// Sets related.R.TextNotesidTextNote. -// Uses the global database handle. -func (o *TextNote) RemoveTextNotesidReactionsG(ctx context.Context, related ...*Reaction) error { - return o.RemoveTextNotesidReactions(ctx, boil.GetContextDB(), related...) -} - -// RemoveTextNotesidReactions relationships from objects passed in. -// Removes related items from R.TextNotesidReactions (uses pointer comparison, removal does not keep order) -// Sets related.R.TextNotesidTextNote. -func (o *TextNote) RemoveTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, related ...*Reaction) error { - if len(related) == 0 { - return nil - } - - var err error - for _, rel := range related { - queries.SetScanner(&rel.TextNotesid, nil) - if rel.R != nil { - rel.R.TextNotesidTextNote = nil - } - if _, err = rel.Update(ctx, exec, boil.Whitelist("text_notesid")); err != nil { - return err - } - } - if o.R == nil { - return nil - } - - for _, rel := range related { - for i, ri := range o.R.TextNotesidReactions { - if rel != ri { - continue - } - - ln := len(o.R.TextNotesidReactions) - if ln > 1 && i < ln-1 { - o.R.TextNotesidReactions[i] = o.R.TextNotesidReactions[ln-1] - } - o.R.TextNotesidReactions = o.R.TextNotesidReactions[:ln-1] - break - } - } - - return nil -} - // TextNotes retrieves all the records using an executor. func TextNotes(mods ...qm.QueryMod) textNoteQuery { mods = append(mods, qm.From("\"text_notes\"")) diff --git a/database/models/users_metadata.go b/database/models/users_metadata.go index c41a4de..a34f04b 100644 --- a/database/models/users_metadata.go +++ b/database/models/users_metadata.go @@ -29,7 +29,7 @@ type UsersMetadatum struct { UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` Content null.String `boil:"content" json:"content,omitempty" toml:"content" yaml:"content,omitempty"` - FollowListEvent null.JSON `boil:"follow_list_event" json:"follow_list_event,omitempty" toml:"follow_list_event" yaml:"follow_list_event,omitempty"` + FollowListEvent null.String `boil:"follow_list_event" json:"follow_list_event,omitempty" toml:"follow_list_event" yaml:"follow_list_event,omitempty"` R *usersMetadatumR `boil:"-" json:"-" toml:"-" yaml:"-"` L usersMetadatumL `boil:"-" json:"-" toml:"-" yaml:"-"` @@ -69,65 +69,28 @@ var UsersMetadatumTableColumns = struct { // Generated where -type whereHelpernull_JSON struct{ field string } - -func (w whereHelpernull_JSON) EQ(x null.JSON) qm.QueryMod { - return qmhelper.WhereNullEQ(w.field, false, x) -} -func (w whereHelpernull_JSON) NEQ(x null.JSON) qm.QueryMod { - return qmhelper.WhereNullEQ(w.field, true, x) -} -func (w whereHelpernull_JSON) LT(x null.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.LT, x) -} -func (w whereHelpernull_JSON) LTE(x null.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.LTE, x) -} -func (w whereHelpernull_JSON) GT(x null.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.GT, x) -} -func (w whereHelpernull_JSON) GTE(x null.JSON) qm.QueryMod { - return qmhelper.Where(w.field, qmhelper.GTE, x) -} - -func (w whereHelpernull_JSON) IsNull() qm.QueryMod { return qmhelper.WhereIsNull(w.field) } -func (w whereHelpernull_JSON) IsNotNull() qm.QueryMod { return qmhelper.WhereIsNotNull(w.field) } - var UsersMetadatumWhere = struct { PubKey whereHelperstring CreatedAt whereHelpertime_Time UpdatedAt whereHelpertime_Time DeletedAt whereHelpernull_Time Content whereHelpernull_String - FollowListEvent whereHelpernull_JSON + FollowListEvent whereHelpernull_String }{ PubKey: whereHelperstring{field: "\"users_metadata\".\"pub_key\""}, CreatedAt: whereHelpertime_Time{field: "\"users_metadata\".\"created_at\""}, UpdatedAt: whereHelpertime_Time{field: "\"users_metadata\".\"updated_at\""}, DeletedAt: whereHelpernull_Time{field: "\"users_metadata\".\"deleted_at\""}, Content: whereHelpernull_String{field: "\"users_metadata\".\"content\""}, - FollowListEvent: whereHelpernull_JSON{field: "\"users_metadata\".\"follow_list_event\""}, + FollowListEvent: whereHelpernull_String{field: "\"users_metadata\".\"follow_list_event\""}, } // UsersMetadatumRels is where relationship names are stored. var UsersMetadatumRels = struct { - FollowerFollowLists string - FollowingFollowLists string - UsersMetadatapubKeyReactions string - UsersMetadatapubKeyTextNotes string -}{ - FollowerFollowLists: "FollowerFollowLists", - FollowingFollowLists: "FollowingFollowLists", - UsersMetadatapubKeyReactions: "UsersMetadatapubKeyReactions", - UsersMetadatapubKeyTextNotes: "UsersMetadatapubKeyTextNotes", -} +}{} // usersMetadatumR is where relationships are stored. type usersMetadatumR struct { - FollowerFollowLists FollowListSlice `boil:"FollowerFollowLists" json:"FollowerFollowLists" toml:"FollowerFollowLists" yaml:"FollowerFollowLists"` - FollowingFollowLists FollowListSlice `boil:"FollowingFollowLists" json:"FollowingFollowLists" toml:"FollowingFollowLists" yaml:"FollowingFollowLists"` - UsersMetadatapubKeyReactions ReactionSlice `boil:"UsersMetadatapubKeyReactions" json:"UsersMetadatapubKeyReactions" toml:"UsersMetadatapubKeyReactions" yaml:"UsersMetadatapubKeyReactions"` - UsersMetadatapubKeyTextNotes TextNoteSlice `boil:"UsersMetadatapubKeyTextNotes" json:"UsersMetadatapubKeyTextNotes" toml:"UsersMetadatapubKeyTextNotes" yaml:"UsersMetadatapubKeyTextNotes"` } // NewStruct creates a new relationship struct @@ -135,34 +98,6 @@ func (*usersMetadatumR) NewStruct() *usersMetadatumR { return &usersMetadatumR{} } -func (r *usersMetadatumR) GetFollowerFollowLists() FollowListSlice { - if r == nil { - return nil - } - return r.FollowerFollowLists -} - -func (r *usersMetadatumR) GetFollowingFollowLists() FollowListSlice { - if r == nil { - return nil - } - return r.FollowingFollowLists -} - -func (r *usersMetadatumR) GetUsersMetadatapubKeyReactions() ReactionSlice { - if r == nil { - return nil - } - return r.UsersMetadatapubKeyReactions -} - -func (r *usersMetadatumR) GetUsersMetadatapubKeyTextNotes() TextNoteSlice { - if r == nil { - return nil - } - return r.UsersMetadatapubKeyTextNotes -} - // usersMetadatumL is where Load methods for each relationship are stored. type usersMetadatumL struct{} @@ -499,948 +434,6 @@ func (q usersMetadatumQuery) Exists(ctx context.Context, exec boil.ContextExecut return count > 0, nil } -// FollowerFollowLists retrieves all the follow_list's FollowLists with an executor via follower column. -func (o *UsersMetadatum) FollowerFollowLists(mods ...qm.QueryMod) followListQuery { - var queryMods []qm.QueryMod - if len(mods) != 0 { - queryMods = append(queryMods, mods...) - } - - queryMods = append(queryMods, - qm.Where("\"follow_list\".\"follower\"=?", o.PubKey), - ) - - return FollowLists(queryMods...) -} - -// FollowingFollowLists retrieves all the follow_list's FollowLists with an executor via following column. -func (o *UsersMetadatum) FollowingFollowLists(mods ...qm.QueryMod) followListQuery { - var queryMods []qm.QueryMod - if len(mods) != 0 { - queryMods = append(queryMods, mods...) - } - - queryMods = append(queryMods, - qm.Where("\"follow_list\".\"following\"=?", o.PubKey), - ) - - return FollowLists(queryMods...) -} - -// UsersMetadatapubKeyReactions retrieves all the reaction's Reactions with an executor via users_metadatapub_key column. -func (o *UsersMetadatum) UsersMetadatapubKeyReactions(mods ...qm.QueryMod) reactionQuery { - var queryMods []qm.QueryMod - if len(mods) != 0 { - queryMods = append(queryMods, mods...) - } - - queryMods = append(queryMods, - qm.Where("\"reactions\".\"users_metadatapub_key\"=?", o.PubKey), - ) - - return Reactions(queryMods...) -} - -// UsersMetadatapubKeyTextNotes retrieves all the text_note's TextNotes with an executor via users_metadatapub_key column. -func (o *UsersMetadatum) UsersMetadatapubKeyTextNotes(mods ...qm.QueryMod) textNoteQuery { - var queryMods []qm.QueryMod - if len(mods) != 0 { - queryMods = append(queryMods, mods...) - } - - queryMods = append(queryMods, - qm.Where("\"text_notes\".\"users_metadatapub_key\"=?", o.PubKey), - ) - - return TextNotes(queryMods...) -} - -// LoadFollowerFollowLists allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for a 1-M or N-M relationship. -func (usersMetadatumL) LoadFollowerFollowLists(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { - var slice []*UsersMetadatum - var object *UsersMetadatum - - if singular { - var ok bool - object, ok = maybeUsersMetadatum.(*UsersMetadatum) - if !ok { - object = new(UsersMetadatum) - ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) - } - } - } else { - s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &usersMetadatumR{} - } - args[object.PubKey] = struct{}{} - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &usersMetadatumR{} - } - args[obj.PubKey] = struct{}{} - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`follow_list`), - qm.WhereIn(`follow_list.follower in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load follow_list") - } - - var resultSlice []*FollowList - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice follow_list") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results in eager load on follow_list") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for follow_list") - } - - if len(followListAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - if singular { - object.R.FollowerFollowLists = resultSlice - for _, foreign := range resultSlice { - if foreign.R == nil { - foreign.R = &followListR{} - } - foreign.R.FollowerUsersMetadatum = object - } - return nil - } - - for _, foreign := range resultSlice { - for _, local := range slice { - if local.PubKey == foreign.Follower { - local.R.FollowerFollowLists = append(local.R.FollowerFollowLists, foreign) - if foreign.R == nil { - foreign.R = &followListR{} - } - foreign.R.FollowerUsersMetadatum = local - break - } - } - } - - return nil -} - -// LoadFollowingFollowLists allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for a 1-M or N-M relationship. -func (usersMetadatumL) LoadFollowingFollowLists(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { - var slice []*UsersMetadatum - var object *UsersMetadatum - - if singular { - var ok bool - object, ok = maybeUsersMetadatum.(*UsersMetadatum) - if !ok { - object = new(UsersMetadatum) - ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) - } - } - } else { - s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &usersMetadatumR{} - } - args[object.PubKey] = struct{}{} - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &usersMetadatumR{} - } - args[obj.PubKey] = struct{}{} - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`follow_list`), - qm.WhereIn(`follow_list.following in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load follow_list") - } - - var resultSlice []*FollowList - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice follow_list") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results in eager load on follow_list") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for follow_list") - } - - if len(followListAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - if singular { - object.R.FollowingFollowLists = resultSlice - for _, foreign := range resultSlice { - if foreign.R == nil { - foreign.R = &followListR{} - } - foreign.R.FollowingUsersMetadatum = object - } - return nil - } - - for _, foreign := range resultSlice { - for _, local := range slice { - if local.PubKey == foreign.Following { - local.R.FollowingFollowLists = append(local.R.FollowingFollowLists, foreign) - if foreign.R == nil { - foreign.R = &followListR{} - } - foreign.R.FollowingUsersMetadatum = local - break - } - } - } - - return nil -} - -// LoadUsersMetadatapubKeyReactions allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for a 1-M or N-M relationship. -func (usersMetadatumL) LoadUsersMetadatapubKeyReactions(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { - var slice []*UsersMetadatum - var object *UsersMetadatum - - if singular { - var ok bool - object, ok = maybeUsersMetadatum.(*UsersMetadatum) - if !ok { - object = new(UsersMetadatum) - ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) - } - } - } else { - s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &usersMetadatumR{} - } - args[object.PubKey] = struct{}{} - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &usersMetadatumR{} - } - args[obj.PubKey] = struct{}{} - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`reactions`), - qm.WhereIn(`reactions.users_metadatapub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load reactions") - } - - var resultSlice []*Reaction - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice reactions") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results in eager load on reactions") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for reactions") - } - - if len(reactionAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - if singular { - object.R.UsersMetadatapubKeyReactions = resultSlice - for _, foreign := range resultSlice { - if foreign.R == nil { - foreign.R = &reactionR{} - } - foreign.R.UsersMetadatapubKeyUsersMetadatum = object - } - return nil - } - - for _, foreign := range resultSlice { - for _, local := range slice { - if queries.Equal(local.PubKey, foreign.UsersMetadatapubKey) { - local.R.UsersMetadatapubKeyReactions = append(local.R.UsersMetadatapubKeyReactions, foreign) - if foreign.R == nil { - foreign.R = &reactionR{} - } - foreign.R.UsersMetadatapubKeyUsersMetadatum = local - break - } - } - } - - return nil -} - -// LoadUsersMetadatapubKeyTextNotes allows an eager lookup of values, cached into the -// loaded structs of the objects. This is for a 1-M or N-M relationship. -func (usersMetadatumL) LoadUsersMetadatapubKeyTextNotes(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { - var slice []*UsersMetadatum - var object *UsersMetadatum - - if singular { - var ok bool - object, ok = maybeUsersMetadatum.(*UsersMetadatum) - if !ok { - object = new(UsersMetadatum) - ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) - } - } - } else { - s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) - if ok { - slice = *s - } else { - ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) - if !ok { - return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) - } - } - } - - args := make(map[interface{}]struct{}) - if singular { - if object.R == nil { - object.R = &usersMetadatumR{} - } - args[object.PubKey] = struct{}{} - } else { - for _, obj := range slice { - if obj.R == nil { - obj.R = &usersMetadatumR{} - } - args[obj.PubKey] = struct{}{} - } - } - - if len(args) == 0 { - return nil - } - - argsSlice := make([]interface{}, len(args)) - i := 0 - for arg := range args { - argsSlice[i] = arg - i++ - } - - query := NewQuery( - qm.From(`text_notes`), - qm.WhereIn(`text_notes.users_metadatapub_key in ?`, argsSlice...), - ) - if mods != nil { - mods.Apply(query) - } - - results, err := query.QueryContext(ctx, e) - if err != nil { - return errors.Wrap(err, "failed to eager load text_notes") - } - - var resultSlice []*TextNote - if err = queries.Bind(results, &resultSlice); err != nil { - return errors.Wrap(err, "failed to bind eager loaded slice text_notes") - } - - if err = results.Close(); err != nil { - return errors.Wrap(err, "failed to close results in eager load on text_notes") - } - if err = results.Err(); err != nil { - return errors.Wrap(err, "error occurred during iteration of eager loaded relations for text_notes") - } - - if len(textNoteAfterSelectHooks) != 0 { - for _, obj := range resultSlice { - if err := obj.doAfterSelectHooks(ctx, e); err != nil { - return err - } - } - } - if singular { - object.R.UsersMetadatapubKeyTextNotes = resultSlice - for _, foreign := range resultSlice { - if foreign.R == nil { - foreign.R = &textNoteR{} - } - foreign.R.UsersMetadatapubKeyUsersMetadatum = object - } - return nil - } - - for _, foreign := range resultSlice { - for _, local := range slice { - if queries.Equal(local.PubKey, foreign.UsersMetadatapubKey) { - local.R.UsersMetadatapubKeyTextNotes = append(local.R.UsersMetadatapubKeyTextNotes, foreign) - if foreign.R == nil { - foreign.R = &textNoteR{} - } - foreign.R.UsersMetadatapubKeyUsersMetadatum = local - break - } - } - } - - return nil -} - -// AddFollowerFollowListsG adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.FollowerFollowLists. -// Sets related.R.FollowerUsersMetadatum appropriately. -// Uses the global database handle. -func (o *UsersMetadatum) AddFollowerFollowListsG(ctx context.Context, insert bool, related ...*FollowList) error { - return o.AddFollowerFollowLists(ctx, boil.GetContextDB(), insert, related...) -} - -// AddFollowerFollowLists adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.FollowerFollowLists. -// Sets related.R.FollowerUsersMetadatum appropriately. -func (o *UsersMetadatum) AddFollowerFollowLists(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*FollowList) error { - var err error - for _, rel := range related { - if insert { - rel.Follower = o.PubKey - if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } else { - updateQuery := fmt.Sprintf( - "UPDATE \"follow_list\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"follower"}), - strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), - ) - values := []interface{}{o.PubKey, rel.Follower, rel.Following} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update foreign table") - } - - rel.Follower = o.PubKey - } - } - - if o.R == nil { - o.R = &usersMetadatumR{ - FollowerFollowLists: related, - } - } else { - o.R.FollowerFollowLists = append(o.R.FollowerFollowLists, related...) - } - - for _, rel := range related { - if rel.R == nil { - rel.R = &followListR{ - FollowerUsersMetadatum: o, - } - } else { - rel.R.FollowerUsersMetadatum = o - } - } - return nil -} - -// AddFollowingFollowListsG adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.FollowingFollowLists. -// Sets related.R.FollowingUsersMetadatum appropriately. -// Uses the global database handle. -func (o *UsersMetadatum) AddFollowingFollowListsG(ctx context.Context, insert bool, related ...*FollowList) error { - return o.AddFollowingFollowLists(ctx, boil.GetContextDB(), insert, related...) -} - -// AddFollowingFollowLists adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.FollowingFollowLists. -// Sets related.R.FollowingUsersMetadatum appropriately. -func (o *UsersMetadatum) AddFollowingFollowLists(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*FollowList) error { - var err error - for _, rel := range related { - if insert { - rel.Following = o.PubKey - if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } else { - updateQuery := fmt.Sprintf( - "UPDATE \"follow_list\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"following"}), - strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), - ) - values := []interface{}{o.PubKey, rel.Follower, rel.Following} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update foreign table") - } - - rel.Following = o.PubKey - } - } - - if o.R == nil { - o.R = &usersMetadatumR{ - FollowingFollowLists: related, - } - } else { - o.R.FollowingFollowLists = append(o.R.FollowingFollowLists, related...) - } - - for _, rel := range related { - if rel.R == nil { - rel.R = &followListR{ - FollowingUsersMetadatum: o, - } - } else { - rel.R.FollowingUsersMetadatum = o - } - } - return nil -} - -// AddUsersMetadatapubKeyReactionsG adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.UsersMetadatapubKeyReactions. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. -// Uses the global database handle. -func (o *UsersMetadatum) AddUsersMetadatapubKeyReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { - return o.AddUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), insert, related...) -} - -// AddUsersMetadatapubKeyReactions adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.UsersMetadatapubKeyReactions. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. -func (o *UsersMetadatum) AddUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { - var err error - for _, rel := range related { - if insert { - queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) - if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } else { - updateQuery := fmt.Sprintf( - "UPDATE \"reactions\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), - strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), - ) - values := []interface{}{o.PubKey, rel.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update foreign table") - } - - queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) - } - } - - if o.R == nil { - o.R = &usersMetadatumR{ - UsersMetadatapubKeyReactions: related, - } - } else { - o.R.UsersMetadatapubKeyReactions = append(o.R.UsersMetadatapubKeyReactions, related...) - } - - for _, rel := range related { - if rel.R == nil { - rel.R = &reactionR{ - UsersMetadatapubKeyUsersMetadatum: o, - } - } else { - rel.R.UsersMetadatapubKeyUsersMetadatum = o - } - } - return nil -} - -// SetUsersMetadatapubKeyReactionsG removes all previously related items of the -// users_metadatum replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. -// Replaces o.R.UsersMetadatapubKeyReactions with related. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. -// Uses the global database handle. -func (o *UsersMetadatum) SetUsersMetadatapubKeyReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { - return o.SetUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), insert, related...) -} - -// SetUsersMetadatapubKeyReactions removes all previously related items of the -// users_metadatum replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. -// Replaces o.R.UsersMetadatapubKeyReactions with related. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. -func (o *UsersMetadatum) SetUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { - query := "update \"reactions\" set \"users_metadatapub_key\" = null where \"users_metadatapub_key\" = $1" - values := []interface{}{o.PubKey} - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, query) - fmt.Fprintln(writer, values) - } - _, err := exec.ExecContext(ctx, query, values...) - if err != nil { - return errors.Wrap(err, "failed to remove relationships before set") - } - - if o.R != nil { - for _, rel := range o.R.UsersMetadatapubKeyReactions { - queries.SetScanner(&rel.UsersMetadatapubKey, nil) - if rel.R == nil { - continue - } - - rel.R.UsersMetadatapubKeyUsersMetadatum = nil - } - o.R.UsersMetadatapubKeyReactions = nil - } - - return o.AddUsersMetadatapubKeyReactions(ctx, exec, insert, related...) -} - -// RemoveUsersMetadatapubKeyReactionsG relationships from objects passed in. -// Removes related items from R.UsersMetadatapubKeyReactions (uses pointer comparison, removal does not keep order) -// Sets related.R.UsersMetadatapubKeyUsersMetadatum. -// Uses the global database handle. -func (o *UsersMetadatum) RemoveUsersMetadatapubKeyReactionsG(ctx context.Context, related ...*Reaction) error { - return o.RemoveUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), related...) -} - -// RemoveUsersMetadatapubKeyReactions relationships from objects passed in. -// Removes related items from R.UsersMetadatapubKeyReactions (uses pointer comparison, removal does not keep order) -// Sets related.R.UsersMetadatapubKeyUsersMetadatum. -func (o *UsersMetadatum) RemoveUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, related ...*Reaction) error { - if len(related) == 0 { - return nil - } - - var err error - for _, rel := range related { - queries.SetScanner(&rel.UsersMetadatapubKey, nil) - if rel.R != nil { - rel.R.UsersMetadatapubKeyUsersMetadatum = nil - } - if _, err = rel.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { - return err - } - } - if o.R == nil { - return nil - } - - for _, rel := range related { - for i, ri := range o.R.UsersMetadatapubKeyReactions { - if rel != ri { - continue - } - - ln := len(o.R.UsersMetadatapubKeyReactions) - if ln > 1 && i < ln-1 { - o.R.UsersMetadatapubKeyReactions[i] = o.R.UsersMetadatapubKeyReactions[ln-1] - } - o.R.UsersMetadatapubKeyReactions = o.R.UsersMetadatapubKeyReactions[:ln-1] - break - } - } - - return nil -} - -// AddUsersMetadatapubKeyTextNotesG adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.UsersMetadatapubKeyTextNotes. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. -// Uses the global database handle. -func (o *UsersMetadatum) AddUsersMetadatapubKeyTextNotesG(ctx context.Context, insert bool, related ...*TextNote) error { - return o.AddUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), insert, related...) -} - -// AddUsersMetadatapubKeyTextNotes adds the given related objects to the existing relationships -// of the users_metadatum, optionally inserting them as new records. -// Appends related to o.R.UsersMetadatapubKeyTextNotes. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. -func (o *UsersMetadatum) AddUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*TextNote) error { - var err error - for _, rel := range related { - if insert { - queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) - if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { - return errors.Wrap(err, "failed to insert into foreign table") - } - } else { - updateQuery := fmt.Sprintf( - "UPDATE \"text_notes\" SET %s WHERE %s", - strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), - strmangle.WhereClause("\"", "\"", 2, textNotePrimaryKeyColumns), - ) - values := []interface{}{o.PubKey, rel.ID} - - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, updateQuery) - fmt.Fprintln(writer, values) - } - if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { - return errors.Wrap(err, "failed to update foreign table") - } - - queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) - } - } - - if o.R == nil { - o.R = &usersMetadatumR{ - UsersMetadatapubKeyTextNotes: related, - } - } else { - o.R.UsersMetadatapubKeyTextNotes = append(o.R.UsersMetadatapubKeyTextNotes, related...) - } - - for _, rel := range related { - if rel.R == nil { - rel.R = &textNoteR{ - UsersMetadatapubKeyUsersMetadatum: o, - } - } else { - rel.R.UsersMetadatapubKeyUsersMetadatum = o - } - } - return nil -} - -// SetUsersMetadatapubKeyTextNotesG removes all previously related items of the -// users_metadatum replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. -// Replaces o.R.UsersMetadatapubKeyTextNotes with related. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. -// Uses the global database handle. -func (o *UsersMetadatum) SetUsersMetadatapubKeyTextNotesG(ctx context.Context, insert bool, related ...*TextNote) error { - return o.SetUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), insert, related...) -} - -// SetUsersMetadatapubKeyTextNotes removes all previously related items of the -// users_metadatum replacing them completely with the passed -// in related items, optionally inserting them as new records. -// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. -// Replaces o.R.UsersMetadatapubKeyTextNotes with related. -// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. -func (o *UsersMetadatum) SetUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*TextNote) error { - query := "update \"text_notes\" set \"users_metadatapub_key\" = null where \"users_metadatapub_key\" = $1" - values := []interface{}{o.PubKey} - if boil.IsDebug(ctx) { - writer := boil.DebugWriterFrom(ctx) - fmt.Fprintln(writer, query) - fmt.Fprintln(writer, values) - } - _, err := exec.ExecContext(ctx, query, values...) - if err != nil { - return errors.Wrap(err, "failed to remove relationships before set") - } - - if o.R != nil { - for _, rel := range o.R.UsersMetadatapubKeyTextNotes { - queries.SetScanner(&rel.UsersMetadatapubKey, nil) - if rel.R == nil { - continue - } - - rel.R.UsersMetadatapubKeyUsersMetadatum = nil - } - o.R.UsersMetadatapubKeyTextNotes = nil - } - - return o.AddUsersMetadatapubKeyTextNotes(ctx, exec, insert, related...) -} - -// RemoveUsersMetadatapubKeyTextNotesG relationships from objects passed in. -// Removes related items from R.UsersMetadatapubKeyTextNotes (uses pointer comparison, removal does not keep order) -// Sets related.R.UsersMetadatapubKeyUsersMetadatum. -// Uses the global database handle. -func (o *UsersMetadatum) RemoveUsersMetadatapubKeyTextNotesG(ctx context.Context, related ...*TextNote) error { - return o.RemoveUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), related...) -} - -// RemoveUsersMetadatapubKeyTextNotes relationships from objects passed in. -// Removes related items from R.UsersMetadatapubKeyTextNotes (uses pointer comparison, removal does not keep order) -// Sets related.R.UsersMetadatapubKeyUsersMetadatum. -func (o *UsersMetadatum) RemoveUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, related ...*TextNote) error { - if len(related) == 0 { - return nil - } - - var err error - for _, rel := range related { - queries.SetScanner(&rel.UsersMetadatapubKey, nil) - if rel.R != nil { - rel.R.UsersMetadatapubKeyUsersMetadatum = nil - } - if _, err = rel.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { - return err - } - } - if o.R == nil { - return nil - } - - for _, rel := range related { - for i, ri := range o.R.UsersMetadatapubKeyTextNotes { - if rel != ri { - continue - } - - ln := len(o.R.UsersMetadatapubKeyTextNotes) - if ln > 1 && i < ln-1 { - o.R.UsersMetadatapubKeyTextNotes[i] = o.R.UsersMetadatapubKeyTextNotes[ln-1] - } - o.R.UsersMetadatapubKeyTextNotes = o.R.UsersMetadatapubKeyTextNotes[:ln-1] - break - } - } - - return nil -} - // UsersMetadata retrieves all the records using an executor. func UsersMetadata(mods ...qm.QueryMod) usersMetadatumQuery { mods = append(mods, qm.From("\"users_metadata\"")) diff --git a/handlers/event_handler.go b/handlers/event_handler.go new file mode 100644 index 0000000..71e231d --- /dev/null +++ b/handlers/event_handler.go @@ -0,0 +1,30 @@ +package handlers + +import ( + "github.com/dezh-tech/immortal/database" + "github.com/dezh-tech/immortal/types" + "github.com/dezh-tech/immortal/types/event" +) + +type EventHandler struct { + DB *database.Database +} + +func New(db *database.Database) *EventHandler { + return &EventHandler{ + DB: db, + } +} + +func (eh *EventHandler) Handle(e *event.Event) error { + switch e.Kind { //nolint + case types.KindTextNote: + return eh.handleTextNote(e) + case types.KindReaction: + return eh.handleReaction(e) + case types.KindFollowList: + return eh.handleFollowList(e) + default: + return nil + } +} diff --git a/handlers/kind_handler.go b/handlers/kind_handler.go new file mode 100644 index 0000000..9edd3b7 --- /dev/null +++ b/handlers/kind_handler.go @@ -0,0 +1,115 @@ +package handlers + +import ( + "context" + "errors" + "time" + + dbmodels "github.com/dezh-tech/immortal/database/models" + "github.com/dezh-tech/immortal/types/event" + "github.com/volatiletech/null/v8" + "github.com/volatiletech/sqlboiler/v4/boil" +) + +func (eh *EventHandler) handleTextNote(e *event.Event) error { + eTags := make([]string, 0) + pTags := make([]string, 0) + + for _, t := range e.Tags { + if len(t) < 2 { + continue + } + + switch t[0] { + case "e": + eTags = append(eTags, t[1]) + case "p": + pTags = append(pTags, t[1]) + } + } + + textNote := dbmodels.TextNote{ + ID: e.ID, + UsersMetadatapubKey: null.StringFrom(e.PublicKey), + EventCreatedAt: time.Unix(e.CreatedAt, 0), + Event: e.String(), + ETags: eTags, + PTags: pTags, + } + err := textNote.InsertG(context.Background(), boil.Infer()) + if err != nil { + return err + } + + return nil +} + +func (eh *EventHandler) handleReaction(e *event.Event) error { + eTags := make([]string, 0) + pTags := make([]string, 0) + aTags := make([]string, 0) + kTags := make([]string, 0) + rTags := make([]string, 0) + + for _, t := range e.Tags { + if len(t) < 2 { + continue + } + + switch t[0] { + case "e": + eTags = append(eTags, t[1]) + case "p": + pTags = append(pTags, t[1]) + case "a": + aTags = append(aTags, t[1]) + case "k": + kTags = append(kTags, t[1]) + case "r": + rTags = append(rTags, t[1]) + } + } + + var textNotesID null.String + if len(eTags) > 0 { + textNotesID = null.StringFrom(eTags[len(eTags)-1]) + } else { + return errors.New("invalid: reaction") + } + + reaction := dbmodels.Reaction{ + ID: e.ID, + UsersMetadatapubKey: null.StringFrom(e.PublicKey), + TextNotesid: textNotesID, + EventCreatedAt: time.Unix(e.CreatedAt, 0), + Event: e.String(), + Content: null.StringFrom(e.Content), + ETags: eTags, + PTags: pTags, + ATags: aTags, + KTags: kTags, + RTags: rTags, + } + err := reaction.InsertG(context.Background(), boil.Infer()) + if err != nil { + return err + } + + return nil +} + +func (eh *EventHandler) handleFollowList(e *event.Event) error { + usermetadata := dbmodels.UsersMetadatum{ + PubKey: e.PublicKey, + FollowListEvent: null.StringFrom(e.String()), + } + + // TODO ::: update the follow_list relations + err := usermetadata.UpsertG(context.Background(), true, []string{"pub_key"}, + boil.Whitelist("follow_list_event"), boil.Infer()) + if err != nil { + return err + } + + return nil +} diff --git a/relay/relay.go b/relay/relay.go index 90fcac5..e8c2338 100644 --- a/relay/relay.go +++ b/relay/relay.go @@ -20,7 +20,7 @@ func New(cfg *config.Config) (*Relay, error) { return nil, err } - s, err := server.New(cfg.ServerConf) + s, err := server.New(cfg.ServerConf, db) if err != nil { return nil, err } diff --git a/server/server.go b/server/server.go index a2c8ada..d2005fd 100644 --- a/server/server.go +++ b/server/server.go @@ -10,6 +10,8 @@ import ( "sync" "github.com/bits-and-blooms/bloom/v3" + "github.com/dezh-tech/immortal/database" + "github.com/dezh-tech/immortal/handlers" "github.com/dezh-tech/immortal/types/filter" "github.com/dezh-tech/immortal/types/message" "github.com/gorilla/websocket" @@ -21,13 +23,14 @@ var upgrader = websocket.Upgrader{ // Server represents a websocket serer which keeps track of client connections and handle them. type Server struct { - knownEvents *bloom.BloomFilter - config Config - conns map[*websocket.Conn]clientState - mu sync.RWMutex + knownEvents *bloom.BloomFilter + config Config + conns map[*websocket.Conn]clientState + mu sync.RWMutex + eventHandler *handlers.EventHandler } -func New(cfg Config) (*Server, error) { +func New(cfg Config, db *database.Database) (*Server, error) { seb := bloom.NewWithEstimates(cfg.KnownBloomSize, 0.9) f, err := os.Open(cfg.BloomBackupPath) @@ -40,14 +43,15 @@ func New(cfg Config) (*Server, error) { } return &Server{ - config: cfg, - knownEvents: seb, - conns: make(map[*websocket.Conn]clientState), - mu: sync.RWMutex{}, + config: cfg, + knownEvents: seb, + conns: make(map[*websocket.Conn]clientState), + mu: sync.RWMutex{}, + eventHandler: handlers.New(db), }, nil } -// Start strats a new server instance. +// Start starts a new server instance. func (s *Server) Start() error { http.Handle("/", s) err := http.ListenAndServe(net.JoinHostPort(s.config.Bind, //nolint @@ -108,7 +112,7 @@ func (s *Server) readLoop(conn *websocket.Conn) { // handleReq handles new incoming REQ messages from client. func (s *Server) handleReq(conn *websocket.Conn, m message.Message) { - // TODO::: loadfrom database and sent in first query based on limit. + // TODO::: load from database and sent in first query based on limit. // TODO::: return EOSE. // TODO::: return EVENT messages. // TODO::: use mu properly. @@ -173,6 +177,19 @@ func (s *Server) handleEvent(conn *websocket.Conn, m message.Message) { return } + // TODO ::: check ephemeral events condition + err := s.eventHandler.Handle(msg.Event) + if err != nil { + okm := message.MakeOK(false, + msg.Event.ID, + err.Error(), + ) + + _ = conn.WriteMessage(1, okm) + + return + } + s.knownEvents.Add(eID[:]) _ = conn.WriteMessage(1, message.MakeOK(true, msg.Event.ID, "")) @@ -226,7 +243,7 @@ func (s *Server) Stop() error { for id := range client.subs { delete(client.subs, id) - err := wsConn.WriteMessage(1, message.MakeClosed(id, "error: shutdowning the relay.")) + err := wsConn.WriteMessage(1, message.MakeClosed(id, "error: shutdown the relay.")) if err != nil { return fmt.Errorf("error: closing subscription: %s, connection: %s, error: %s", id, wsConn.RemoteAddr(), err.Error()) diff --git a/sqlboiler.yml b/sqlboiler.yml index 2d67a5d..61e03fb 100644 --- a/sqlboiler.yml +++ b/sqlboiler.yml @@ -22,6 +22,10 @@ no-hooks: false # Disable generation of hook functions no-auto-timestamps: false # Disable auto timestamping on created_at/updated_at fields no-back-referencing: false # Disable back-referencing for foreign keys +auto-columns: + created: "created_at" + updated: "updated_at" + # Adds struct tags to generated models struct-tag-casing: snake # Control the casing of struct tags struct-tags: json diff --git a/types/kind.go b/types/kind.go index 6fb2f41..15a5146 100644 --- a/types/kind.go +++ b/types/kind.go @@ -16,7 +16,7 @@ const ( KindProfileMetadata Kind = 0 KindTextNote Kind = 1 KindRecommendServer Kind = 2 - KindContactList Kind = 3 + KindFollowList Kind = 3 KindEncryptedDirectMessage Kind = 4 KindDeletion Kind = 5 KindRepost Kind = 6 diff --git a/types/message/message.go b/types/message/message.go index 4d645b2..91257a0 100644 --- a/types/message/message.go +++ b/types/message/message.go @@ -56,7 +56,7 @@ func ParseMessage(message []byte) Message { return e } -// Event reperesents a NIP-01 EVENT message. +// Event represents a NIP-01 EVENT message. type Event struct { SubscriptionID string Event *event.Event