refactor: replace gorm with sqlx

This commit is contained in:
Tine 2024-02-27 12:04:05 +01:00
parent 6c960ba40a
commit 6a677d96cd
Signed by: mentos1386
SSH key fingerprint: SHA256:MNtTsLbihYaWF8j1fkOHfkKNlnN1JQfxEU/rBU8nCGw
33 changed files with 697 additions and 2386 deletions

33
database/database.go Normal file
View file

@ -0,0 +1,33 @@
package database
import (
"embed"
"log/slog"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
migrate "github.com/rubenv/sql-migrate"
)
//go:embed sqlite/migrations/*
var sqliteMigrations embed.FS
func ConnectToDatabase(logger *slog.Logger, path string) (*sqlx.DB, error) {
db, err := sqlx.Connect("sqlite3", path)
if err != nil {
return nil, err
}
logger.Info("Connected to database")
migrations := migrate.EmbedFileSystemMigrationSource{
FileSystem: sqliteMigrations,
Root: "sqlite/migrations",
}
n, err := migrate.Exec(db.DB, "sqlite3", migrations, migrate.Up)
if err != nil {
return nil, err
}
logger.Info("Applied migrations", "number", n)
return db, nil
}

60
database/models/models.go Normal file
View file

@ -0,0 +1,60 @@
package models
import (
"time"
)
type OAuth2State struct {
State string `db:"state"`
ExpiresAt time.Time `db:"expires_at"`
}
const (
MonitorSuccess string = "SUCCESS"
MonitorFailure string = "FAILURE"
MonitorError string = "ERROR"
MonitorUnknown string = "UNKNOWN"
)
type Monitor struct {
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
DeletedAt *time.Time `db:"deleted_at"`
Slug string `db:"slug"`
Name string `db:"name"`
Schedule string `db:"schedule"`
Script string `db:"script"`
}
type MonitorWithWorkerGroups struct {
Monitor
// List of worker group names
WorkerGroups []string
}
type MonitorHistory struct {
CreatedAt time.Time `db:"created_at"`
MonitorSlug string `db:"monitor_slug"`
Status string `db:"status"`
Note string `db:"note"`
}
type WorkerGroup struct {
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
DeletedAt *time.Time `db:"deleted_at"`
Slug string `db:"slug"`
Name string `db:"name"`
}
type WorkerGroupWithMonitors struct {
WorkerGroup
// List of worker group names
Monitors []string
}

View file

@ -0,0 +1,58 @@
-- +migrate Up
CREATE TABLE o_auth2_states (
state TEXT,
expiry DATETIME,
PRIMARY KEY (state)
);
CREATE TABLE monitors (
slug TEXT,
name TEXT,
schedule TEXT,
script TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME,
PRIMARY KEY (slug),
CONSTRAINT unique_monitors_name UNIQUE (name)
);
CREATE TABLE worker_groups (
slug TEXT,
name TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME,
PRIMARY KEY (slug),
CONSTRAINT unique_worker_groups_name UNIQUE (name)
);
CREATE TABLE monitor_worker_groups (
worker_group_slug TEXT,
monitor_slug TEXT,
PRIMARY KEY (worker_group_slug,monitor_slug),
CONSTRAINT fk_monitor_worker_groups_worker_group FOREIGN KEY (worker_group_slug) REFERENCES worker_groups(slug),
CONSTRAINT fk_monitor_worker_groups_monitor FOREIGN KEY (monitor_slug) REFERENCES monitors(slug)
);
CREATE TABLE "monitor_histories" (
monitor_slug TEXT,
status TEXT,
note TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (monitor_slug, created_at),
CONSTRAINT fk_monitors_history FOREIGN KEY (monitor_slug) REFERENCES monitors(slug)
);
-- +migrate Down
DROP TABLE o_auth2_states;
DROP TABLE monitor_worker_groups;
DROP TABLE worker_groups;
DROP TABLE monitor_histories;
DROP TABLE monitors;

View file

@ -17,8 +17,8 @@ primary_region = 'waw'
ROOT_URL = 'https://zdravko.mnts.dev'
TEMPORAL_SERVER_HOST = 'server.process.zdravko.internal:7233'
TEMPORAL_DATABASE_PATH = '/data/temporal-2.db'
DATABASE_PATH = '/data/zdravko-2.db'
TEMPORAL_DATABASE_PATH = '/data/temporal-4.db'
DATABASE_PATH = '/data/zdravko-4.db'
[processes]
server = '--temporal --server'

View file

@ -6,6 +6,8 @@
"tailwindcss@latest",
"flyctl@latest",
"just@latest",
"nodePackages.npm@latest"
"nodePackages.npm@latest",
"sqlite@latest",
"sqlite-web@latest"
]
}

View file

@ -75,6 +75,46 @@
}
}
},
"sqlite-web@latest": {
"last_modified": "2024-02-10T18:15:24Z",
"resolved": "github:NixOS/nixpkgs/10b813040df67c4039086db0f6eaf65c536886c6#sqlite-web",
"source": "devbox-search",
"version": "0.6.2",
"systems": {
"aarch64-darwin": {
"store_path": "/nix/store/klkx4fv3al5dgg59w3xv0brnn28gmpkh-sqlite-web-0.6.2"
},
"aarch64-linux": {
"store_path": "/nix/store/liqjqlnwc111g2j1mxak0z6b0cbvn46i-sqlite-web-0.6.2"
},
"x86_64-darwin": {
"store_path": "/nix/store/ip9c99c0r4avyxl68x1cxpn6649pff4j-sqlite-web-0.6.2"
},
"x86_64-linux": {
"store_path": "/nix/store/lfwrqdx8jjpqhzxhcfjnm82ll4a2jzhv-sqlite-web-0.6.2"
}
}
},
"sqlite@latest": {
"last_modified": "2024-02-20T22:56:03Z",
"resolved": "github:NixOS/nixpkgs/5eeded8e3518579daa13887297efa79f5be74b41#sqlite",
"source": "devbox-search",
"version": "3.45.1",
"systems": {
"aarch64-darwin": {
"store_path": "/nix/store/ay9wvqp3p548p08symcy3q7avm86ck00-sqlite-3.45.1-bin"
},
"aarch64-linux": {
"store_path": "/nix/store/1j3xiiq0i2q69nmwi9ja99grnwlpqzgy-sqlite-3.45.1-bin"
},
"x86_64-darwin": {
"store_path": "/nix/store/c9wndvymfnm4dcmi0bgy1lmljzx8dv4n-sqlite-3.45.1-bin"
},
"x86_64-linux": {
"store_path": "/nix/store/b3pbwqqpfllg2lxwhhv4iyw3m9xxbgld-sqlite-3.45.1-bin"
}
}
},
"tailwindcss@latest": {
"last_modified": "2024-01-27T14:55:31Z",
"resolved": "github:NixOS/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb#tailwindcss",

19
go.mod
View file

@ -7,20 +7,19 @@ require (
github.com/golang-jwt/jwt/v5 v5.2.0
github.com/gorilla/sessions v1.2.2
github.com/gosimple/slug v1.13.1
github.com/jmoiron/sqlx v1.3.5
github.com/labstack/echo/v4 v4.11.4
github.com/lib/pq v1.10.9
github.com/mattn/go-sqlite3 v1.14.19
github.com/pkg/errors v0.9.1
github.com/rubenv/sql-migrate v1.6.1
github.com/sirupsen/logrus v1.9.3
github.com/spf13/viper v1.18.2
github.com/temporalio/ui-server/v2 v2.23.0
go.k6.io/k6 v0.49.0
go.temporal.io/sdk v1.26.0-rc.2
go.temporal.io/server v1.22.4
golang.org/x/exp v0.0.0-20231127185646-65229373498e
golang.org/x/oauth2 v0.17.0
gorm.io/driver/sqlite v1.5.0
gorm.io/gen v0.3.25
gorm.io/gorm v1.25.7
gorm.io/plugin/dbresolver v1.5.0
)
replace go.temporal.io/server => github.com/temporalio/temporal v1.23.0-rc2.0.20240207154935-68882596be5d
@ -61,6 +60,7 @@ require (
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
@ -97,20 +97,17 @@ require (
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.4.3 // indirect
github.com/jhump/protoreflect v1.15.4 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jmoiron/sqlx v1.3.4 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/klauspost/compress v1.17.4 // indirect
github.com/labstack/gommon v0.4.2 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mccutchen/go-httpbin v1.1.2-0.20190116014521-c5cb2f4802fa // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@ -176,7 +173,6 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
golang.org/x/mod v0.15.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sync v0.6.0 // indirect
@ -198,9 +194,6 @@ require (
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/validator.v2 v2.0.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/datatypes v1.2.0 // indirect
gorm.io/driver/mysql v1.5.4 // indirect
gorm.io/hints v1.1.2 // indirect
lukechampine.com/uint128 v1.3.0 // indirect
modernc.org/cc/v3 v3.41.0 // indirect
modernc.org/ccgo/v3 v3.16.15 // indirect

52
go.sum
View file

@ -131,6 +131,8 @@ github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcP
github.com/go-faker/faker/v4 v4.2.0 h1:dGebOupKwssrODV51E0zbMrv5e2gO9VWSLNC1WDCpWg=
github.com/go-faker/faker/v4 v4.2.0/go.mod h1:F/bBy8GH9NxOxMInug5Gx4WYeG6fHJZ8Ol/dhcpRub4=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs=
github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
@ -153,9 +155,7 @@ github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaC
github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sourcemap/sourcemap v2.1.4-0.20211119122758-180fcef48034+incompatible h1:bopx7t9jyUNX1ebhr0G4gtQWmUOgwQRI0QsYhdYLgkU=
github.com/go-sourcemap/sourcemap v2.1.4-0.20211119122758-180fcef48034+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@ -170,10 +170,6 @@ github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOW
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@ -272,17 +268,12 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jhump/protoreflect v1.15.4 h1:mrwJhfQGGljwvR/jPEocli8KA6G9afbQpH8NY2wORcI=
github.com/jhump/protoreflect v1.15.4/go.mod h1:2B+zwrnMY3TTIqEK01OG/d3pyUycQBfDf+bx8fE2DNg=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@ -330,16 +321,13 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mccutchen/go-httpbin v1.1.2-0.20190116014521-c5cb2f4802fa h1:lx8ZnNPwjkXSzOROz0cg69RlErRXs+L3eDkggASWKLo=
github.com/mccutchen/go-httpbin v1.1.2-0.20190116014521-c5cb2f4802fa/go.mod h1:fhpOYavp5g2K74XDl/ao2y4KvhqVtKlkg1e+0UaQv7I=
github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -381,6 +369,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY=
github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg=
github.com/prashantv/protectmem v0.0.0-20171002184600-e20412882b3a h1:AA9vgIBDjMHPC2McaGPojgV2dcI78ZC0TLNhYCXEKH8=
github.com/prashantv/protectmem v0.0.0-20171002184600-e20412882b3a/go.mod h1:lzZQ3Noex5pfAy7mkAeCjcBDteYU85uWWnJ/y6gKU8k=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@ -421,6 +411,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rubenv/sql-migrate v1.6.1 h1:bo6/sjsan9HaXAsNxYP/jCEDUGibHp8JmOBw7NTGRos=
github.com/rubenv/sql-migrate v1.6.1/go.mod h1:tPzespupJS0jacLfhbwto/UjSX+8h2FdWB7ar+QlHa0=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@ -786,30 +778,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco=
gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04=
gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso=
gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs=
gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U=
gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A=
gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c=
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=
gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0=
gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig=
gorm.io/gen v0.3.25 h1:uT/1YfvcnYUdike4XPYyi89FEnVHZF115GUXQm2Sfug=
gorm.io/gen v0.3.25/go.mod h1:p+t0iCKjaPz+pKRxcx63nXdRgnrah/QD2l92747ihyA=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o=
gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg=
gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY=
gorm.io/plugin/dbresolver v1.5.0/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=

View file

@ -1,33 +0,0 @@
package internal
import (
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/internal/models/query"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
//go:generate just _generate-gorm
func ConnectToDatabase(path string) (*gorm.DB, *query.Query, error) {
db, err := gorm.Open(sqlite.Open(path), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
return nil, nil, err
}
err = db.AutoMigrate(
models.Monitor{},
models.WorkerGroup{},
models.MonitorHistory{},
models.OAuth2State{},
)
if err != nil {
return nil, nil, err
}
q := query.Use(db)
return db, q, nil
}

View file

@ -2,14 +2,14 @@ package handlers
import (
"context"
"database/sql"
"errors"
"net/http"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/services"
"code.tjo.space/mentos1386/zdravko/pkg/api"
"github.com/labstack/echo/v4"
"gorm.io/gorm"
)
type ApiV1WorkersConnectGETResponse struct {
@ -21,9 +21,9 @@ func (h *BaseHandler) ApiV1WorkersConnectGET(c echo.Context) error {
ctx := context.Background()
cc := c.(AuthenticatedContext)
workerGroup, err := services.GetWorkerGroup(ctx, h.query, cc.Principal.Worker.Group)
workerGroup, err := services.GetWorkerGroup(ctx, h.db, cc.Principal.Worker.Group)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
if errors.Is(err, sql.ErrNoRows) {
return echo.NewHTTPError(http.StatusUnauthorized, "Token invalid")
}
return err
@ -51,16 +51,19 @@ func (h *BaseHandler) ApiV1MonitorsHistoryPOST(c echo.Context) error {
return err
}
monitor, err := services.GetMonitor(ctx, h.query, slug)
_, err = services.GetMonitor(ctx, h.db, slug)
if err != nil {
if err == sql.ErrNoRows {
return echo.NewHTTPError(http.StatusNotFound, "Monitor not found")
}
return err
}
err = h.query.Monitor.History.Model(monitor).Append(
&models.MonitorHistory{
Status: body.Status,
Note: body.Note,
})
err = services.AddHistoryForMonitor(ctx, h.db, &models.MonitorHistory{
MonitorSlug: slug,
Status: body.Status,
Note: body.Note,
})
if err != nil {
return err
}

View file

@ -1,10 +1,12 @@
package handlers
import (
"log/slog"
"code.tjo.space/mentos1386/zdravko/internal/config"
"code.tjo.space/mentos1386/zdravko/internal/models/query"
"code.tjo.space/mentos1386/zdravko/web/templates/components"
"github.com/gorilla/sessions"
"github.com/jmoiron/sqlx"
"go.temporal.io/sdk/client"
)
@ -24,16 +26,23 @@ func GetPageByTitle(pages []*components.Page, title string) *components.Page {
}
type BaseHandler struct {
query *query.Query
db *sqlx.DB
config *config.ServerConfig
logger *slog.Logger
temporal client.Client
store *sessions.CookieStore
}
func NewBaseHandler(q *query.Query, temporal client.Client, config *config.ServerConfig) *BaseHandler {
func NewBaseHandler(db *sqlx.DB, temporal client.Client, config *config.ServerConfig, logger *slog.Logger) *BaseHandler {
store := sessions.NewCookieStore([]byte(config.SessionSecret))
return &BaseHandler{q, config, temporal, store}
return &BaseHandler{
db: db,
config: config,
logger: logger,
temporal: temporal,
store: store,
}
}

View file

@ -5,7 +5,7 @@ import (
"net/http"
"time"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/services"
"code.tjo.space/mentos1386/zdravko/web/templates/components"
"github.com/labstack/echo/v4"
@ -13,10 +13,10 @@ import (
type IndexData struct {
*components.Base
HealthChecks []*HealthCheck
HealthChecks []*HealthCheck
MonitorsLength int
TimeRange string
Status string
TimeRange string
Status string
}
type HealthCheck struct {
@ -39,7 +39,7 @@ func getHour(date time.Time) string {
return date.Format("2006-01-02T15:04")
}
func getDailyHistory(history []models.MonitorHistory) *History {
func getDailyHistory(history []*models.MonitorHistory) *History {
numDays := 90
historyDailyMap := map[string]string{}
numOfSuccess := 0
@ -88,7 +88,7 @@ func getDailyHistory(history []models.MonitorHistory) *History {
}
}
func getHourlyHistory(history []models.MonitorHistory) *History {
func getHourlyHistory(history []*models.MonitorHistory) *History {
numHours := 48
historyHourlyMap := map[string]string{}
numOfSuccess := 0
@ -139,7 +139,7 @@ func getHourlyHistory(history []models.MonitorHistory) *History {
func (h *BaseHandler) Index(c echo.Context) error {
ctx := context.Background()
monitors, err := services.GetMonitors(ctx, h.query)
monitors, err := services.GetMonitors(ctx, h.db)
if err != nil {
return err
}
@ -153,8 +153,13 @@ func (h *BaseHandler) Index(c echo.Context) error {
monitorsWithHistory := make([]*HealthCheck, len(monitors))
for i, monitor := range monitors {
historyDaily := getDailyHistory(monitor.History)
historyHourly := getHourlyHistory(monitor.History)
history, err := services.GetMonitorHistoryForMonitor(ctx, h.db, monitor.Slug)
if err != nil {
return err
}
historyDaily := getDailyHistory(history)
historyHourly := getHourlyHistory(history)
status := historyDaily.History[89]
if status != models.MonitorSuccess {
@ -174,9 +179,9 @@ func (h *BaseHandler) Index(c echo.Context) error {
NavbarActive: GetPageByTitle(Pages, "Status"),
Navbar: Pages,
},
HealthChecks: monitorsWithHistory,
HealthChecks: monitorsWithHistory,
MonitorsLength: len(monitors),
TimeRange: timeRange,
Status: overallStatus,
TimeRange: timeRange,
Status: overallStatus,
})
}

View file

@ -12,8 +12,9 @@ import (
"strconv"
"time"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/config"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/internal/services"
"github.com/labstack/echo/v4"
"golang.org/x/oauth2"
)
@ -86,7 +87,7 @@ func (h *BaseHandler) OAuth2LoginGET(c echo.Context) error {
conf := newOAuth2(h.config)
state := newRandomState()
err := h.query.OAuth2State.WithContext(ctx).Create(&models.OAuth2State{State: state, Expiry: time.Now().Add(5 * time.Minute)})
err := services.CreateOAuth2State(ctx, h.db, &models.OAuth2State{State: state, ExpiresAt: time.Now().Add(5 * time.Minute)})
if err != nil {
return err
}
@ -103,14 +104,11 @@ func (h *BaseHandler) OAuth2CallbackGET(c echo.Context) error {
state := c.QueryParam("state")
code := c.QueryParam("code")
result, err := h.query.OAuth2State.WithContext(ctx).Where(
h.query.OAuth2State.State.Eq(state),
h.query.OAuth2State.Expiry.Gt(time.Now()),
).Delete()
deleted, err := services.DeleteOAuth2State(ctx, h.db, state)
if err != nil {
return err
}
if result.RowsAffected != 1 {
if deleted == false {
return errors.New("invalid state")
}

View file

@ -2,11 +2,12 @@ package handlers
import (
"context"
"database/sql"
"fmt"
"net/http"
"strings"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/services"
"code.tjo.space/mentos1386/zdravko/web/templates/components"
"github.com/go-playground/validator/v10"
@ -29,19 +30,20 @@ type UpdateMonitor struct {
type SettingsMonitors struct {
*Settings
Monitors []*models.Monitor
Monitors []*models.MonitorWithWorkerGroups
MonitorsLength int
}
type SettingsMonitor struct {
*Settings
Monitor *models.Monitor
Monitor *models.MonitorWithWorkerGroups
History []*models.MonitorHistory
}
func (h *BaseHandler) SettingsMonitorsGET(c echo.Context) error {
cc := c.(AuthenticatedContext)
monitors, err := services.GetMonitors(context.Background(), h.query)
monitors, err := services.GetMonitorsWithWorkerGroups(context.Background(), h.db)
if err != nil {
return err
}
@ -62,11 +64,21 @@ func (h *BaseHandler) SettingsMonitorsDescribeGET(c echo.Context) error {
slug := c.Param("slug")
monitor, err := services.GetMonitor(context.Background(), h.query, slug)
monitor, err := services.GetMonitorWithWorkerGroups(context.Background(), h.db, slug)
if err != nil {
return err
}
history, err := services.GetMonitorHistoryForMonitor(context.Background(), h.db, slug)
if err != nil {
return err
}
maxElements := 10
if len(history) < maxElements {
maxElements = len(history)
}
return c.Render(http.StatusOK, "settings_monitors_describe.tmpl", &SettingsMonitor{
Settings: NewSettings(
cc.Principal.User,
@ -80,6 +92,7 @@ func (h *BaseHandler) SettingsMonitorsDescribeGET(c echo.Context) error {
},
}),
Monitor: monitor,
History: history[:maxElements],
})
}
@ -97,7 +110,7 @@ func (h *BaseHandler) SettingsMonitorsDescribePOST(c echo.Context) error {
return err
}
monitor, err := services.GetMonitor(ctx, h.query, monitorSlug)
monitor, err := services.GetMonitor(ctx, h.db, monitorSlug)
if err != nil {
return err
}
@ -106,7 +119,7 @@ func (h *BaseHandler) SettingsMonitorsDescribePOST(c echo.Context) error {
err = services.UpdateMonitor(
ctx,
h.query,
h.db,
monitor,
)
if err != nil {
@ -118,18 +131,27 @@ func (h *BaseHandler) SettingsMonitorsDescribePOST(c echo.Context) error {
if group == "" {
continue
}
workerGroup, err := services.GetOrCreateWorkerGroup(ctx, h.query, models.WorkerGroup{Name: group, Slug: slug.Make(group)})
workerGroup, err := services.GetWorkerGroup(ctx, h.db, slug.Make(group))
if err != nil {
return err
if err == sql.ErrNoRows {
workerGroup = &models.WorkerGroup{Name: group, Slug: slug.Make(group)}
err = services.CreateWorkerGroup(ctx, h.db, workerGroup)
if err != nil {
return err
}
} else {
return err
}
}
workerGroups = append(workerGroups, workerGroup)
}
err = services.UpdateMonitorWorkerGroups(ctx, h.query, monitor, workerGroups)
err = services.UpdateMonitorWorkerGroups(ctx, h.db, monitor, workerGroups)
if err != nil {
return err
}
err = services.CreateOrUpdateMonitorSchedule(ctx, h.temporal, monitor)
err = services.CreateOrUpdateMonitorSchedule(ctx, h.temporal, monitor, workerGroups)
if err != nil {
return err
}
@ -165,32 +187,51 @@ func (h *BaseHandler) SettingsMonitorsCreatePOST(c echo.Context) error {
return err
}
workerGroups := []models.WorkerGroup{}
workerGroups := []*models.WorkerGroup{}
for _, group := range strings.Split(create.WorkerGroups, " ") {
workerGroups = append(workerGroups, models.WorkerGroup{Name: group, Slug: slug.Make(group)})
if group == "" {
continue
}
workerGroup, err := services.GetWorkerGroup(ctx, h.db, slug.Make(group))
if err != nil {
if err == sql.ErrNoRows {
workerGroup = &models.WorkerGroup{Name: group, Slug: slug.Make(group)}
err = services.CreateWorkerGroup(ctx, h.db, workerGroup)
if err != nil {
return err
}
} else {
return err
}
}
workerGroups = append(workerGroups, workerGroup)
}
monitor := &models.Monitor{
Name: create.Name,
Slug: monitorSlug,
Schedule: create.Schedule,
Script: create.Script,
WorkerGroups: workerGroups,
Name: create.Name,
Slug: monitorSlug,
Schedule: create.Schedule,
Script: create.Script,
}
err = services.CreateMonitor(
ctx,
h.query,
h.db,
monitor,
)
if err != nil {
return err
}
err = services.CreateOrUpdateMonitorSchedule(ctx, h.temporal, monitor)
err = services.UpdateMonitorWorkerGroups(ctx, h.db, monitor, workerGroups)
if err != nil {
return err
}
return c.Redirect(http.StatusSeeOther, fmt.Sprintf("/settings/monitors/%s", monitorSlug))
err = services.CreateOrUpdateMonitorSchedule(ctx, h.temporal, monitor, workerGroups)
if err != nil {
return err
}
return c.Redirect(http.StatusSeeOther, "/settings/monitors")
}

View file

@ -5,8 +5,8 @@ import (
"fmt"
"net/http"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/jwt"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/internal/services"
"code.tjo.space/mentos1386/zdravko/web/templates/components"
"github.com/go-playground/validator/v10"
@ -21,7 +21,7 @@ type WorkerWithToken struct {
type SettingsWorkerGroups struct {
*Settings
WorkerGroups []*models.WorkerGroup
WorkerGroups []*models.WorkerGroupWithMonitors
WorkerGroupsLength int
}
@ -33,7 +33,7 @@ type SettingsWorker struct {
func (h *BaseHandler) SettingsWorkerGroupsGET(c echo.Context) error {
cc := c.(AuthenticatedContext)
workerGroups, err := services.GetWorkerGroups(context.Background(), h.query)
workerGroups, err := services.GetWorkerGroupsWithMonitors(context.Background(), h.db)
if err != nil {
return err
}
@ -54,7 +54,7 @@ func (h *BaseHandler) SettingsWorkerGroupsDescribeGET(c echo.Context) error {
slug := c.Param("slug")
worker, err := services.GetWorkerGroup(context.Background(), h.query, slug)
worker, err := services.GetWorkerGroup(context.Background(), h.db, slug)
if err != nil {
return err
}
@ -101,20 +101,20 @@ func (h *BaseHandler) SettingsWorkerGroupsCreatePOST(c echo.Context) error {
ctx := context.Background()
slug := slug.Make(c.FormValue("name"))
worker := models.WorkerGroup{
workerGroup := &models.WorkerGroup{
Name: c.FormValue("name"),
Slug: slug,
}
err := validator.New(validator.WithRequiredStructEnabled()).Struct(worker)
err := validator.New(validator.WithRequiredStructEnabled()).Struct(workerGroup)
if err != nil {
return err
}
_, err = services.GetOrCreateWorkerGroup(
err = services.CreateWorkerGroup(
ctx,
h.query,
worker,
h.db,
workerGroup,
)
if err != nil {
return err

View file

@ -6,7 +6,7 @@ import (
"encoding/hex"
"time"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/database/models"
"github.com/golang-jwt/jwt/v5"
"github.com/pkg/errors"
)

View file

@ -1,47 +0,0 @@
package models
import (
"time"
"gorm.io/gorm"
)
type OAuth2State struct {
State string `gorm:"primary_key"`
Expiry time.Time
}
const (
MonitorSuccess string = "SUCCESS"
MonitorFailure string = "FAILURE"
MonitorError string = "ERROR"
MonitorUnknown string = "UNKNOWN"
)
type Monitor struct {
gorm.Model
Slug string `gorm:"unique"`
Name string `gorm:"unique"`
Schedule string
WorkerGroups []WorkerGroup `gorm:"many2many:monitor_worker_groups;"`
Script string `validate:"required"`
History []MonitorHistory `gorm:"foreignKey:Monitor"`
}
type MonitorHistory struct {
gorm.Model
Monitor uint
Status string
Note string
}
type WorkerGroup struct {
gorm.Model
Name string `gorm:"unique"`
Slug string `gorm:"unique"`
Monitors []Monitor `gorm:"many2many:monitor_worker_groups;"`
}

View file

@ -1,127 +0,0 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"database/sql"
"gorm.io/gorm"
"gorm.io/gen"
"gorm.io/plugin/dbresolver"
)
var (
Q = new(Query)
Monitor *monitor
MonitorHistory *monitorHistory
OAuth2State *oAuth2State
WorkerGroup *workerGroup
)
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
*Q = *Use(db, opts...)
Monitor = &Q.Monitor
MonitorHistory = &Q.MonitorHistory
OAuth2State = &Q.OAuth2State
WorkerGroup = &Q.WorkerGroup
}
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
return &Query{
db: db,
Monitor: newMonitor(db, opts...),
MonitorHistory: newMonitorHistory(db, opts...),
OAuth2State: newOAuth2State(db, opts...),
WorkerGroup: newWorkerGroup(db, opts...),
}
}
type Query struct {
db *gorm.DB
Monitor monitor
MonitorHistory monitorHistory
OAuth2State oAuth2State
WorkerGroup workerGroup
}
func (q *Query) Available() bool { return q.db != nil }
func (q *Query) clone(db *gorm.DB) *Query {
return &Query{
db: db,
Monitor: q.Monitor.clone(db),
MonitorHistory: q.MonitorHistory.clone(db),
OAuth2State: q.OAuth2State.clone(db),
WorkerGroup: q.WorkerGroup.clone(db),
}
}
func (q *Query) ReadDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Read))
}
func (q *Query) WriteDB() *Query {
return q.ReplaceDB(q.db.Clauses(dbresolver.Write))
}
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
return &Query{
db: db,
Monitor: q.Monitor.replaceDB(db),
MonitorHistory: q.MonitorHistory.replaceDB(db),
OAuth2State: q.OAuth2State.replaceDB(db),
WorkerGroup: q.WorkerGroup.replaceDB(db),
}
}
type queryCtx struct {
Monitor IMonitorDo
MonitorHistory IMonitorHistoryDo
OAuth2State IOAuth2StateDo
WorkerGroup IWorkerGroupDo
}
func (q *Query) WithContext(ctx context.Context) *queryCtx {
return &queryCtx{
Monitor: q.Monitor.WithContext(ctx),
MonitorHistory: q.MonitorHistory.WithContext(ctx),
OAuth2State: q.OAuth2State.WithContext(ctx),
WorkerGroup: q.WorkerGroup.WithContext(ctx),
}
}
func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error {
return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...)
}
func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx {
tx := q.db.Begin(opts...)
return &QueryTx{Query: q.clone(tx), Error: tx.Error}
}
type QueryTx struct {
*Query
Error error
}
func (q *QueryTx) Commit() error {
return q.db.Commit().Error
}
func (q *QueryTx) Rollback() error {
return q.db.Rollback().Error
}
func (q *QueryTx) SavePoint(name string) error {
return q.db.SavePoint(name).Error
}
func (q *QueryTx) RollbackTo(name string) error {
return q.db.RollbackTo(name).Error
}

View file

@ -1,416 +0,0 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"code.tjo.space/mentos1386/zdravko/internal/models"
)
func newMonitorHistory(db *gorm.DB, opts ...gen.DOOption) monitorHistory {
_monitorHistory := monitorHistory{}
_monitorHistory.monitorHistoryDo.UseDB(db, opts...)
_monitorHistory.monitorHistoryDo.UseModel(&models.MonitorHistory{})
tableName := _monitorHistory.monitorHistoryDo.TableName()
_monitorHistory.ALL = field.NewAsterisk(tableName)
_monitorHistory.ID = field.NewUint(tableName, "id")
_monitorHistory.CreatedAt = field.NewTime(tableName, "created_at")
_monitorHistory.UpdatedAt = field.NewTime(tableName, "updated_at")
_monitorHistory.DeletedAt = field.NewField(tableName, "deleted_at")
_monitorHistory.Monitor = field.NewUint(tableName, "monitor")
_monitorHistory.Status = field.NewString(tableName, "status")
_monitorHistory.Note = field.NewString(tableName, "note")
_monitorHistory.fillFieldMap()
return _monitorHistory
}
type monitorHistory struct {
monitorHistoryDo monitorHistoryDo
ALL field.Asterisk
ID field.Uint
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Monitor field.Uint
Status field.String
Note field.String
fieldMap map[string]field.Expr
}
func (m monitorHistory) Table(newTableName string) *monitorHistory {
m.monitorHistoryDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m monitorHistory) As(alias string) *monitorHistory {
m.monitorHistoryDo.DO = *(m.monitorHistoryDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *monitorHistory) updateTableName(table string) *monitorHistory {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewUint(table, "id")
m.CreatedAt = field.NewTime(table, "created_at")
m.UpdatedAt = field.NewTime(table, "updated_at")
m.DeletedAt = field.NewField(table, "deleted_at")
m.Monitor = field.NewUint(table, "monitor")
m.Status = field.NewString(table, "status")
m.Note = field.NewString(table, "note")
m.fillFieldMap()
return m
}
func (m *monitorHistory) WithContext(ctx context.Context) IMonitorHistoryDo {
return m.monitorHistoryDo.WithContext(ctx)
}
func (m monitorHistory) TableName() string { return m.monitorHistoryDo.TableName() }
func (m monitorHistory) Alias() string { return m.monitorHistoryDo.Alias() }
func (m monitorHistory) Columns(cols ...field.Expr) gen.Columns {
return m.monitorHistoryDo.Columns(cols...)
}
func (m *monitorHistory) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *monitorHistory) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 7)
m.fieldMap["id"] = m.ID
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_at"] = m.UpdatedAt
m.fieldMap["deleted_at"] = m.DeletedAt
m.fieldMap["monitor"] = m.Monitor
m.fieldMap["status"] = m.Status
m.fieldMap["note"] = m.Note
}
func (m monitorHistory) clone(db *gorm.DB) monitorHistory {
m.monitorHistoryDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m monitorHistory) replaceDB(db *gorm.DB) monitorHistory {
m.monitorHistoryDo.ReplaceDB(db)
return m
}
type monitorHistoryDo struct{ gen.DO }
type IMonitorHistoryDo interface {
gen.SubQuery
Debug() IMonitorHistoryDo
WithContext(ctx context.Context) IMonitorHistoryDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IMonitorHistoryDo
WriteDB() IMonitorHistoryDo
As(alias string) gen.Dao
Session(config *gorm.Session) IMonitorHistoryDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IMonitorHistoryDo
Not(conds ...gen.Condition) IMonitorHistoryDo
Or(conds ...gen.Condition) IMonitorHistoryDo
Select(conds ...field.Expr) IMonitorHistoryDo
Where(conds ...gen.Condition) IMonitorHistoryDo
Order(conds ...field.Expr) IMonitorHistoryDo
Distinct(cols ...field.Expr) IMonitorHistoryDo
Omit(cols ...field.Expr) IMonitorHistoryDo
Join(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo
LeftJoin(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo
RightJoin(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo
Group(cols ...field.Expr) IMonitorHistoryDo
Having(conds ...gen.Condition) IMonitorHistoryDo
Limit(limit int) IMonitorHistoryDo
Offset(offset int) IMonitorHistoryDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IMonitorHistoryDo
Unscoped() IMonitorHistoryDo
Create(values ...*models.MonitorHistory) error
CreateInBatches(values []*models.MonitorHistory, batchSize int) error
Save(values ...*models.MonitorHistory) error
First() (*models.MonitorHistory, error)
Take() (*models.MonitorHistory, error)
Last() (*models.MonitorHistory, error)
Find() ([]*models.MonitorHistory, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MonitorHistory, err error)
FindInBatches(result *[]*models.MonitorHistory, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.MonitorHistory) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IMonitorHistoryDo
Assign(attrs ...field.AssignExpr) IMonitorHistoryDo
Joins(fields ...field.RelationField) IMonitorHistoryDo
Preload(fields ...field.RelationField) IMonitorHistoryDo
FirstOrInit() (*models.MonitorHistory, error)
FirstOrCreate() (*models.MonitorHistory, error)
FindByPage(offset int, limit int) (result []*models.MonitorHistory, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IMonitorHistoryDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (m monitorHistoryDo) Debug() IMonitorHistoryDo {
return m.withDO(m.DO.Debug())
}
func (m monitorHistoryDo) WithContext(ctx context.Context) IMonitorHistoryDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m monitorHistoryDo) ReadDB() IMonitorHistoryDo {
return m.Clauses(dbresolver.Read)
}
func (m monitorHistoryDo) WriteDB() IMonitorHistoryDo {
return m.Clauses(dbresolver.Write)
}
func (m monitorHistoryDo) Session(config *gorm.Session) IMonitorHistoryDo {
return m.withDO(m.DO.Session(config))
}
func (m monitorHistoryDo) Clauses(conds ...clause.Expression) IMonitorHistoryDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m monitorHistoryDo) Returning(value interface{}, columns ...string) IMonitorHistoryDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m monitorHistoryDo) Not(conds ...gen.Condition) IMonitorHistoryDo {
return m.withDO(m.DO.Not(conds...))
}
func (m monitorHistoryDo) Or(conds ...gen.Condition) IMonitorHistoryDo {
return m.withDO(m.DO.Or(conds...))
}
func (m monitorHistoryDo) Select(conds ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Select(conds...))
}
func (m monitorHistoryDo) Where(conds ...gen.Condition) IMonitorHistoryDo {
return m.withDO(m.DO.Where(conds...))
}
func (m monitorHistoryDo) Order(conds ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Order(conds...))
}
func (m monitorHistoryDo) Distinct(cols ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m monitorHistoryDo) Omit(cols ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m monitorHistoryDo) Join(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m monitorHistoryDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m monitorHistoryDo) RightJoin(table schema.Tabler, on ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m monitorHistoryDo) Group(cols ...field.Expr) IMonitorHistoryDo {
return m.withDO(m.DO.Group(cols...))
}
func (m monitorHistoryDo) Having(conds ...gen.Condition) IMonitorHistoryDo {
return m.withDO(m.DO.Having(conds...))
}
func (m monitorHistoryDo) Limit(limit int) IMonitorHistoryDo {
return m.withDO(m.DO.Limit(limit))
}
func (m monitorHistoryDo) Offset(offset int) IMonitorHistoryDo {
return m.withDO(m.DO.Offset(offset))
}
func (m monitorHistoryDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMonitorHistoryDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m monitorHistoryDo) Unscoped() IMonitorHistoryDo {
return m.withDO(m.DO.Unscoped())
}
func (m monitorHistoryDo) Create(values ...*models.MonitorHistory) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m monitorHistoryDo) CreateInBatches(values []*models.MonitorHistory, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m monitorHistoryDo) Save(values ...*models.MonitorHistory) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m monitorHistoryDo) First() (*models.MonitorHistory, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.MonitorHistory), nil
}
}
func (m monitorHistoryDo) Take() (*models.MonitorHistory, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.MonitorHistory), nil
}
}
func (m monitorHistoryDo) Last() (*models.MonitorHistory, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.MonitorHistory), nil
}
}
func (m monitorHistoryDo) Find() ([]*models.MonitorHistory, error) {
result, err := m.DO.Find()
return result.([]*models.MonitorHistory), err
}
func (m monitorHistoryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MonitorHistory, err error) {
buf := make([]*models.MonitorHistory, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m monitorHistoryDo) FindInBatches(result *[]*models.MonitorHistory, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m monitorHistoryDo) Attrs(attrs ...field.AssignExpr) IMonitorHistoryDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m monitorHistoryDo) Assign(attrs ...field.AssignExpr) IMonitorHistoryDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m monitorHistoryDo) Joins(fields ...field.RelationField) IMonitorHistoryDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m monitorHistoryDo) Preload(fields ...field.RelationField) IMonitorHistoryDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m monitorHistoryDo) FirstOrInit() (*models.MonitorHistory, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.MonitorHistory), nil
}
}
func (m monitorHistoryDo) FirstOrCreate() (*models.MonitorHistory, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.MonitorHistory), nil
}
}
func (m monitorHistoryDo) FindByPage(offset int, limit int) (result []*models.MonitorHistory, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m monitorHistoryDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m monitorHistoryDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m monitorHistoryDo) Delete(models ...*models.MonitorHistory) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *monitorHistoryDo) withDO(do gen.Dao) *monitorHistoryDo {
m.DO = *do.(*gen.DO)
return m
}

View file

@ -1,604 +0,0 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"code.tjo.space/mentos1386/zdravko/internal/models"
)
func newMonitor(db *gorm.DB, opts ...gen.DOOption) monitor {
_monitor := monitor{}
_monitor.monitorDo.UseDB(db, opts...)
_monitor.monitorDo.UseModel(&models.Monitor{})
tableName := _monitor.monitorDo.TableName()
_monitor.ALL = field.NewAsterisk(tableName)
_monitor.ID = field.NewUint(tableName, "id")
_monitor.CreatedAt = field.NewTime(tableName, "created_at")
_monitor.UpdatedAt = field.NewTime(tableName, "updated_at")
_monitor.DeletedAt = field.NewField(tableName, "deleted_at")
_monitor.Slug = field.NewString(tableName, "slug")
_monitor.Name = field.NewString(tableName, "name")
_monitor.Schedule = field.NewString(tableName, "schedule")
_monitor.Script = field.NewString(tableName, "script")
_monitor.History = monitorHasManyHistory{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("History", "models.MonitorHistory"),
}
_monitor.WorkerGroups = monitorManyToManyWorkerGroups{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("WorkerGroups", "models.WorkerGroup"),
Monitors: struct {
field.RelationField
History struct {
field.RelationField
}
WorkerGroups struct {
field.RelationField
}
}{
RelationField: field.NewRelation("WorkerGroups.Monitors", "models.Monitor"),
History: struct {
field.RelationField
}{
RelationField: field.NewRelation("WorkerGroups.Monitors.History", "models.MonitorHistory"),
},
WorkerGroups: struct {
field.RelationField
}{
RelationField: field.NewRelation("WorkerGroups.Monitors.WorkerGroups", "models.WorkerGroup"),
},
},
}
_monitor.fillFieldMap()
return _monitor
}
type monitor struct {
monitorDo monitorDo
ALL field.Asterisk
ID field.Uint
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Slug field.String
Name field.String
Schedule field.String
Script field.String
History monitorHasManyHistory
WorkerGroups monitorManyToManyWorkerGroups
fieldMap map[string]field.Expr
}
func (m monitor) Table(newTableName string) *monitor {
m.monitorDo.UseTable(newTableName)
return m.updateTableName(newTableName)
}
func (m monitor) As(alias string) *monitor {
m.monitorDo.DO = *(m.monitorDo.As(alias).(*gen.DO))
return m.updateTableName(alias)
}
func (m *monitor) updateTableName(table string) *monitor {
m.ALL = field.NewAsterisk(table)
m.ID = field.NewUint(table, "id")
m.CreatedAt = field.NewTime(table, "created_at")
m.UpdatedAt = field.NewTime(table, "updated_at")
m.DeletedAt = field.NewField(table, "deleted_at")
m.Slug = field.NewString(table, "slug")
m.Name = field.NewString(table, "name")
m.Schedule = field.NewString(table, "schedule")
m.Script = field.NewString(table, "script")
m.fillFieldMap()
return m
}
func (m *monitor) WithContext(ctx context.Context) IMonitorDo { return m.monitorDo.WithContext(ctx) }
func (m monitor) TableName() string { return m.monitorDo.TableName() }
func (m monitor) Alias() string { return m.monitorDo.Alias() }
func (m monitor) Columns(cols ...field.Expr) gen.Columns { return m.monitorDo.Columns(cols...) }
func (m *monitor) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := m.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (m *monitor) fillFieldMap() {
m.fieldMap = make(map[string]field.Expr, 10)
m.fieldMap["id"] = m.ID
m.fieldMap["created_at"] = m.CreatedAt
m.fieldMap["updated_at"] = m.UpdatedAt
m.fieldMap["deleted_at"] = m.DeletedAt
m.fieldMap["slug"] = m.Slug
m.fieldMap["name"] = m.Name
m.fieldMap["schedule"] = m.Schedule
m.fieldMap["script"] = m.Script
}
func (m monitor) clone(db *gorm.DB) monitor {
m.monitorDo.ReplaceConnPool(db.Statement.ConnPool)
return m
}
func (m monitor) replaceDB(db *gorm.DB) monitor {
m.monitorDo.ReplaceDB(db)
return m
}
type monitorHasManyHistory struct {
db *gorm.DB
field.RelationField
}
func (a monitorHasManyHistory) Where(conds ...field.Expr) *monitorHasManyHistory {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a monitorHasManyHistory) WithContext(ctx context.Context) *monitorHasManyHistory {
a.db = a.db.WithContext(ctx)
return &a
}
func (a monitorHasManyHistory) Session(session *gorm.Session) *monitorHasManyHistory {
a.db = a.db.Session(session)
return &a
}
func (a monitorHasManyHistory) Model(m *models.Monitor) *monitorHasManyHistoryTx {
return &monitorHasManyHistoryTx{a.db.Model(m).Association(a.Name())}
}
type monitorHasManyHistoryTx struct{ tx *gorm.Association }
func (a monitorHasManyHistoryTx) Find() (result []*models.MonitorHistory, err error) {
return result, a.tx.Find(&result)
}
func (a monitorHasManyHistoryTx) Append(values ...*models.MonitorHistory) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a monitorHasManyHistoryTx) Replace(values ...*models.MonitorHistory) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a monitorHasManyHistoryTx) Delete(values ...*models.MonitorHistory) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a monitorHasManyHistoryTx) Clear() error {
return a.tx.Clear()
}
func (a monitorHasManyHistoryTx) Count() int64 {
return a.tx.Count()
}
type monitorManyToManyWorkerGroups struct {
db *gorm.DB
field.RelationField
Monitors struct {
field.RelationField
History struct {
field.RelationField
}
WorkerGroups struct {
field.RelationField
}
}
}
func (a monitorManyToManyWorkerGroups) Where(conds ...field.Expr) *monitorManyToManyWorkerGroups {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a monitorManyToManyWorkerGroups) WithContext(ctx context.Context) *monitorManyToManyWorkerGroups {
a.db = a.db.WithContext(ctx)
return &a
}
func (a monitorManyToManyWorkerGroups) Session(session *gorm.Session) *monitorManyToManyWorkerGroups {
a.db = a.db.Session(session)
return &a
}
func (a monitorManyToManyWorkerGroups) Model(m *models.Monitor) *monitorManyToManyWorkerGroupsTx {
return &monitorManyToManyWorkerGroupsTx{a.db.Model(m).Association(a.Name())}
}
type monitorManyToManyWorkerGroupsTx struct{ tx *gorm.Association }
func (a monitorManyToManyWorkerGroupsTx) Find() (result []*models.WorkerGroup, err error) {
return result, a.tx.Find(&result)
}
func (a monitorManyToManyWorkerGroupsTx) Append(values ...*models.WorkerGroup) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a monitorManyToManyWorkerGroupsTx) Replace(values ...*models.WorkerGroup) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a monitorManyToManyWorkerGroupsTx) Delete(values ...*models.WorkerGroup) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a monitorManyToManyWorkerGroupsTx) Clear() error {
return a.tx.Clear()
}
func (a monitorManyToManyWorkerGroupsTx) Count() int64 {
return a.tx.Count()
}
type monitorDo struct{ gen.DO }
type IMonitorDo interface {
gen.SubQuery
Debug() IMonitorDo
WithContext(ctx context.Context) IMonitorDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IMonitorDo
WriteDB() IMonitorDo
As(alias string) gen.Dao
Session(config *gorm.Session) IMonitorDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IMonitorDo
Not(conds ...gen.Condition) IMonitorDo
Or(conds ...gen.Condition) IMonitorDo
Select(conds ...field.Expr) IMonitorDo
Where(conds ...gen.Condition) IMonitorDo
Order(conds ...field.Expr) IMonitorDo
Distinct(cols ...field.Expr) IMonitorDo
Omit(cols ...field.Expr) IMonitorDo
Join(table schema.Tabler, on ...field.Expr) IMonitorDo
LeftJoin(table schema.Tabler, on ...field.Expr) IMonitorDo
RightJoin(table schema.Tabler, on ...field.Expr) IMonitorDo
Group(cols ...field.Expr) IMonitorDo
Having(conds ...gen.Condition) IMonitorDo
Limit(limit int) IMonitorDo
Offset(offset int) IMonitorDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IMonitorDo
Unscoped() IMonitorDo
Create(values ...*models.Monitor) error
CreateInBatches(values []*models.Monitor, batchSize int) error
Save(values ...*models.Monitor) error
First() (*models.Monitor, error)
Take() (*models.Monitor, error)
Last() (*models.Monitor, error)
Find() ([]*models.Monitor, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Monitor, err error)
FindInBatches(result *[]*models.Monitor, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.Monitor) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IMonitorDo
Assign(attrs ...field.AssignExpr) IMonitorDo
Joins(fields ...field.RelationField) IMonitorDo
Preload(fields ...field.RelationField) IMonitorDo
FirstOrInit() (*models.Monitor, error)
FirstOrCreate() (*models.Monitor, error)
FindByPage(offset int, limit int) (result []*models.Monitor, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IMonitorDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (m monitorDo) Debug() IMonitorDo {
return m.withDO(m.DO.Debug())
}
func (m monitorDo) WithContext(ctx context.Context) IMonitorDo {
return m.withDO(m.DO.WithContext(ctx))
}
func (m monitorDo) ReadDB() IMonitorDo {
return m.Clauses(dbresolver.Read)
}
func (m monitorDo) WriteDB() IMonitorDo {
return m.Clauses(dbresolver.Write)
}
func (m monitorDo) Session(config *gorm.Session) IMonitorDo {
return m.withDO(m.DO.Session(config))
}
func (m monitorDo) Clauses(conds ...clause.Expression) IMonitorDo {
return m.withDO(m.DO.Clauses(conds...))
}
func (m monitorDo) Returning(value interface{}, columns ...string) IMonitorDo {
return m.withDO(m.DO.Returning(value, columns...))
}
func (m monitorDo) Not(conds ...gen.Condition) IMonitorDo {
return m.withDO(m.DO.Not(conds...))
}
func (m monitorDo) Or(conds ...gen.Condition) IMonitorDo {
return m.withDO(m.DO.Or(conds...))
}
func (m monitorDo) Select(conds ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Select(conds...))
}
func (m monitorDo) Where(conds ...gen.Condition) IMonitorDo {
return m.withDO(m.DO.Where(conds...))
}
func (m monitorDo) Order(conds ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Order(conds...))
}
func (m monitorDo) Distinct(cols ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Distinct(cols...))
}
func (m monitorDo) Omit(cols ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Omit(cols...))
}
func (m monitorDo) Join(table schema.Tabler, on ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Join(table, on...))
}
func (m monitorDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMonitorDo {
return m.withDO(m.DO.LeftJoin(table, on...))
}
func (m monitorDo) RightJoin(table schema.Tabler, on ...field.Expr) IMonitorDo {
return m.withDO(m.DO.RightJoin(table, on...))
}
func (m monitorDo) Group(cols ...field.Expr) IMonitorDo {
return m.withDO(m.DO.Group(cols...))
}
func (m monitorDo) Having(conds ...gen.Condition) IMonitorDo {
return m.withDO(m.DO.Having(conds...))
}
func (m monitorDo) Limit(limit int) IMonitorDo {
return m.withDO(m.DO.Limit(limit))
}
func (m monitorDo) Offset(offset int) IMonitorDo {
return m.withDO(m.DO.Offset(offset))
}
func (m monitorDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMonitorDo {
return m.withDO(m.DO.Scopes(funcs...))
}
func (m monitorDo) Unscoped() IMonitorDo {
return m.withDO(m.DO.Unscoped())
}
func (m monitorDo) Create(values ...*models.Monitor) error {
if len(values) == 0 {
return nil
}
return m.DO.Create(values)
}
func (m monitorDo) CreateInBatches(values []*models.Monitor, batchSize int) error {
return m.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (m monitorDo) Save(values ...*models.Monitor) error {
if len(values) == 0 {
return nil
}
return m.DO.Save(values)
}
func (m monitorDo) First() (*models.Monitor, error) {
if result, err := m.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.Monitor), nil
}
}
func (m monitorDo) Take() (*models.Monitor, error) {
if result, err := m.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.Monitor), nil
}
}
func (m monitorDo) Last() (*models.Monitor, error) {
if result, err := m.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.Monitor), nil
}
}
func (m monitorDo) Find() ([]*models.Monitor, error) {
result, err := m.DO.Find()
return result.([]*models.Monitor), err
}
func (m monitorDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Monitor, err error) {
buf := make([]*models.Monitor, 0, batchSize)
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (m monitorDo) FindInBatches(result *[]*models.Monitor, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return m.DO.FindInBatches(result, batchSize, fc)
}
func (m monitorDo) Attrs(attrs ...field.AssignExpr) IMonitorDo {
return m.withDO(m.DO.Attrs(attrs...))
}
func (m monitorDo) Assign(attrs ...field.AssignExpr) IMonitorDo {
return m.withDO(m.DO.Assign(attrs...))
}
func (m monitorDo) Joins(fields ...field.RelationField) IMonitorDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Joins(_f))
}
return &m
}
func (m monitorDo) Preload(fields ...field.RelationField) IMonitorDo {
for _, _f := range fields {
m = *m.withDO(m.DO.Preload(_f))
}
return &m
}
func (m monitorDo) FirstOrInit() (*models.Monitor, error) {
if result, err := m.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.Monitor), nil
}
}
func (m monitorDo) FirstOrCreate() (*models.Monitor, error) {
if result, err := m.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.Monitor), nil
}
}
func (m monitorDo) FindByPage(offset int, limit int) (result []*models.Monitor, count int64, err error) {
result, err = m.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = m.Offset(-1).Limit(-1).Count()
return
}
func (m monitorDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = m.Count()
if err != nil {
return
}
err = m.Offset(offset).Limit(limit).Scan(result)
return
}
func (m monitorDo) Scan(result interface{}) (err error) {
return m.DO.Scan(result)
}
func (m monitorDo) Delete(models ...*models.Monitor) (result gen.ResultInfo, err error) {
return m.DO.Delete(models)
}
func (m *monitorDo) withDO(do gen.Dao) *monitorDo {
m.DO = *do.(*gen.DO)
return m
}

View file

@ -1,394 +0,0 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"code.tjo.space/mentos1386/zdravko/internal/models"
)
func newOAuth2State(db *gorm.DB, opts ...gen.DOOption) oAuth2State {
_oAuth2State := oAuth2State{}
_oAuth2State.oAuth2StateDo.UseDB(db, opts...)
_oAuth2State.oAuth2StateDo.UseModel(&models.OAuth2State{})
tableName := _oAuth2State.oAuth2StateDo.TableName()
_oAuth2State.ALL = field.NewAsterisk(tableName)
_oAuth2State.State = field.NewString(tableName, "state")
_oAuth2State.Expiry = field.NewTime(tableName, "expiry")
_oAuth2State.fillFieldMap()
return _oAuth2State
}
type oAuth2State struct {
oAuth2StateDo oAuth2StateDo
ALL field.Asterisk
State field.String
Expiry field.Time
fieldMap map[string]field.Expr
}
func (o oAuth2State) Table(newTableName string) *oAuth2State {
o.oAuth2StateDo.UseTable(newTableName)
return o.updateTableName(newTableName)
}
func (o oAuth2State) As(alias string) *oAuth2State {
o.oAuth2StateDo.DO = *(o.oAuth2StateDo.As(alias).(*gen.DO))
return o.updateTableName(alias)
}
func (o *oAuth2State) updateTableName(table string) *oAuth2State {
o.ALL = field.NewAsterisk(table)
o.State = field.NewString(table, "state")
o.Expiry = field.NewTime(table, "expiry")
o.fillFieldMap()
return o
}
func (o *oAuth2State) WithContext(ctx context.Context) IOAuth2StateDo {
return o.oAuth2StateDo.WithContext(ctx)
}
func (o oAuth2State) TableName() string { return o.oAuth2StateDo.TableName() }
func (o oAuth2State) Alias() string { return o.oAuth2StateDo.Alias() }
func (o oAuth2State) Columns(cols ...field.Expr) gen.Columns { return o.oAuth2StateDo.Columns(cols...) }
func (o *oAuth2State) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := o.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (o *oAuth2State) fillFieldMap() {
o.fieldMap = make(map[string]field.Expr, 2)
o.fieldMap["state"] = o.State
o.fieldMap["expiry"] = o.Expiry
}
func (o oAuth2State) clone(db *gorm.DB) oAuth2State {
o.oAuth2StateDo.ReplaceConnPool(db.Statement.ConnPool)
return o
}
func (o oAuth2State) replaceDB(db *gorm.DB) oAuth2State {
o.oAuth2StateDo.ReplaceDB(db)
return o
}
type oAuth2StateDo struct{ gen.DO }
type IOAuth2StateDo interface {
gen.SubQuery
Debug() IOAuth2StateDo
WithContext(ctx context.Context) IOAuth2StateDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IOAuth2StateDo
WriteDB() IOAuth2StateDo
As(alias string) gen.Dao
Session(config *gorm.Session) IOAuth2StateDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IOAuth2StateDo
Not(conds ...gen.Condition) IOAuth2StateDo
Or(conds ...gen.Condition) IOAuth2StateDo
Select(conds ...field.Expr) IOAuth2StateDo
Where(conds ...gen.Condition) IOAuth2StateDo
Order(conds ...field.Expr) IOAuth2StateDo
Distinct(cols ...field.Expr) IOAuth2StateDo
Omit(cols ...field.Expr) IOAuth2StateDo
Join(table schema.Tabler, on ...field.Expr) IOAuth2StateDo
LeftJoin(table schema.Tabler, on ...field.Expr) IOAuth2StateDo
RightJoin(table schema.Tabler, on ...field.Expr) IOAuth2StateDo
Group(cols ...field.Expr) IOAuth2StateDo
Having(conds ...gen.Condition) IOAuth2StateDo
Limit(limit int) IOAuth2StateDo
Offset(offset int) IOAuth2StateDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IOAuth2StateDo
Unscoped() IOAuth2StateDo
Create(values ...*models.OAuth2State) error
CreateInBatches(values []*models.OAuth2State, batchSize int) error
Save(values ...*models.OAuth2State) error
First() (*models.OAuth2State, error)
Take() (*models.OAuth2State, error)
Last() (*models.OAuth2State, error)
Find() ([]*models.OAuth2State, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.OAuth2State, err error)
FindInBatches(result *[]*models.OAuth2State, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.OAuth2State) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IOAuth2StateDo
Assign(attrs ...field.AssignExpr) IOAuth2StateDo
Joins(fields ...field.RelationField) IOAuth2StateDo
Preload(fields ...field.RelationField) IOAuth2StateDo
FirstOrInit() (*models.OAuth2State, error)
FirstOrCreate() (*models.OAuth2State, error)
FindByPage(offset int, limit int) (result []*models.OAuth2State, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IOAuth2StateDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (o oAuth2StateDo) Debug() IOAuth2StateDo {
return o.withDO(o.DO.Debug())
}
func (o oAuth2StateDo) WithContext(ctx context.Context) IOAuth2StateDo {
return o.withDO(o.DO.WithContext(ctx))
}
func (o oAuth2StateDo) ReadDB() IOAuth2StateDo {
return o.Clauses(dbresolver.Read)
}
func (o oAuth2StateDo) WriteDB() IOAuth2StateDo {
return o.Clauses(dbresolver.Write)
}
func (o oAuth2StateDo) Session(config *gorm.Session) IOAuth2StateDo {
return o.withDO(o.DO.Session(config))
}
func (o oAuth2StateDo) Clauses(conds ...clause.Expression) IOAuth2StateDo {
return o.withDO(o.DO.Clauses(conds...))
}
func (o oAuth2StateDo) Returning(value interface{}, columns ...string) IOAuth2StateDo {
return o.withDO(o.DO.Returning(value, columns...))
}
func (o oAuth2StateDo) Not(conds ...gen.Condition) IOAuth2StateDo {
return o.withDO(o.DO.Not(conds...))
}
func (o oAuth2StateDo) Or(conds ...gen.Condition) IOAuth2StateDo {
return o.withDO(o.DO.Or(conds...))
}
func (o oAuth2StateDo) Select(conds ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Select(conds...))
}
func (o oAuth2StateDo) Where(conds ...gen.Condition) IOAuth2StateDo {
return o.withDO(o.DO.Where(conds...))
}
func (o oAuth2StateDo) Order(conds ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Order(conds...))
}
func (o oAuth2StateDo) Distinct(cols ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Distinct(cols...))
}
func (o oAuth2StateDo) Omit(cols ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Omit(cols...))
}
func (o oAuth2StateDo) Join(table schema.Tabler, on ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Join(table, on...))
}
func (o oAuth2StateDo) LeftJoin(table schema.Tabler, on ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.LeftJoin(table, on...))
}
func (o oAuth2StateDo) RightJoin(table schema.Tabler, on ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.RightJoin(table, on...))
}
func (o oAuth2StateDo) Group(cols ...field.Expr) IOAuth2StateDo {
return o.withDO(o.DO.Group(cols...))
}
func (o oAuth2StateDo) Having(conds ...gen.Condition) IOAuth2StateDo {
return o.withDO(o.DO.Having(conds...))
}
func (o oAuth2StateDo) Limit(limit int) IOAuth2StateDo {
return o.withDO(o.DO.Limit(limit))
}
func (o oAuth2StateDo) Offset(offset int) IOAuth2StateDo {
return o.withDO(o.DO.Offset(offset))
}
func (o oAuth2StateDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IOAuth2StateDo {
return o.withDO(o.DO.Scopes(funcs...))
}
func (o oAuth2StateDo) Unscoped() IOAuth2StateDo {
return o.withDO(o.DO.Unscoped())
}
func (o oAuth2StateDo) Create(values ...*models.OAuth2State) error {
if len(values) == 0 {
return nil
}
return o.DO.Create(values)
}
func (o oAuth2StateDo) CreateInBatches(values []*models.OAuth2State, batchSize int) error {
return o.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (o oAuth2StateDo) Save(values ...*models.OAuth2State) error {
if len(values) == 0 {
return nil
}
return o.DO.Save(values)
}
func (o oAuth2StateDo) First() (*models.OAuth2State, error) {
if result, err := o.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.OAuth2State), nil
}
}
func (o oAuth2StateDo) Take() (*models.OAuth2State, error) {
if result, err := o.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.OAuth2State), nil
}
}
func (o oAuth2StateDo) Last() (*models.OAuth2State, error) {
if result, err := o.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.OAuth2State), nil
}
}
func (o oAuth2StateDo) Find() ([]*models.OAuth2State, error) {
result, err := o.DO.Find()
return result.([]*models.OAuth2State), err
}
func (o oAuth2StateDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.OAuth2State, err error) {
buf := make([]*models.OAuth2State, 0, batchSize)
err = o.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (o oAuth2StateDo) FindInBatches(result *[]*models.OAuth2State, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return o.DO.FindInBatches(result, batchSize, fc)
}
func (o oAuth2StateDo) Attrs(attrs ...field.AssignExpr) IOAuth2StateDo {
return o.withDO(o.DO.Attrs(attrs...))
}
func (o oAuth2StateDo) Assign(attrs ...field.AssignExpr) IOAuth2StateDo {
return o.withDO(o.DO.Assign(attrs...))
}
func (o oAuth2StateDo) Joins(fields ...field.RelationField) IOAuth2StateDo {
for _, _f := range fields {
o = *o.withDO(o.DO.Joins(_f))
}
return &o
}
func (o oAuth2StateDo) Preload(fields ...field.RelationField) IOAuth2StateDo {
for _, _f := range fields {
o = *o.withDO(o.DO.Preload(_f))
}
return &o
}
func (o oAuth2StateDo) FirstOrInit() (*models.OAuth2State, error) {
if result, err := o.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.OAuth2State), nil
}
}
func (o oAuth2StateDo) FirstOrCreate() (*models.OAuth2State, error) {
if result, err := o.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.OAuth2State), nil
}
}
func (o oAuth2StateDo) FindByPage(offset int, limit int) (result []*models.OAuth2State, count int64, err error) {
result, err = o.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = o.Offset(-1).Limit(-1).Count()
return
}
func (o oAuth2StateDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = o.Count()
if err != nil {
return
}
err = o.Offset(offset).Limit(limit).Scan(result)
return
}
func (o oAuth2StateDo) Scan(result interface{}) (err error) {
return o.DO.Scan(result)
}
func (o oAuth2StateDo) Delete(models ...*models.OAuth2State) (result gen.ResultInfo, err error) {
return o.DO.Delete(models)
}
func (o *oAuth2StateDo) withDO(do gen.Dao) *oAuth2StateDo {
o.DO = *do.(*gen.DO)
return o
}

View file

@ -1,516 +0,0 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"code.tjo.space/mentos1386/zdravko/internal/models"
)
func newWorkerGroup(db *gorm.DB, opts ...gen.DOOption) workerGroup {
_workerGroup := workerGroup{}
_workerGroup.workerGroupDo.UseDB(db, opts...)
_workerGroup.workerGroupDo.UseModel(&models.WorkerGroup{})
tableName := _workerGroup.workerGroupDo.TableName()
_workerGroup.ALL = field.NewAsterisk(tableName)
_workerGroup.ID = field.NewUint(tableName, "id")
_workerGroup.CreatedAt = field.NewTime(tableName, "created_at")
_workerGroup.UpdatedAt = field.NewTime(tableName, "updated_at")
_workerGroup.DeletedAt = field.NewField(tableName, "deleted_at")
_workerGroup.Name = field.NewString(tableName, "name")
_workerGroup.Slug = field.NewString(tableName, "slug")
_workerGroup.Monitors = workerGroupManyToManyMonitors{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Monitors", "models.Monitor"),
History: struct {
field.RelationField
}{
RelationField: field.NewRelation("Monitors.History", "models.MonitorHistory"),
},
WorkerGroups: struct {
field.RelationField
Monitors struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Monitors.WorkerGroups", "models.WorkerGroup"),
Monitors: struct {
field.RelationField
}{
RelationField: field.NewRelation("Monitors.WorkerGroups.Monitors", "models.Monitor"),
},
},
}
_workerGroup.fillFieldMap()
return _workerGroup
}
type workerGroup struct {
workerGroupDo workerGroupDo
ALL field.Asterisk
ID field.Uint
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Name field.String
Slug field.String
Monitors workerGroupManyToManyMonitors
fieldMap map[string]field.Expr
}
func (w workerGroup) Table(newTableName string) *workerGroup {
w.workerGroupDo.UseTable(newTableName)
return w.updateTableName(newTableName)
}
func (w workerGroup) As(alias string) *workerGroup {
w.workerGroupDo.DO = *(w.workerGroupDo.As(alias).(*gen.DO))
return w.updateTableName(alias)
}
func (w *workerGroup) updateTableName(table string) *workerGroup {
w.ALL = field.NewAsterisk(table)
w.ID = field.NewUint(table, "id")
w.CreatedAt = field.NewTime(table, "created_at")
w.UpdatedAt = field.NewTime(table, "updated_at")
w.DeletedAt = field.NewField(table, "deleted_at")
w.Name = field.NewString(table, "name")
w.Slug = field.NewString(table, "slug")
w.fillFieldMap()
return w
}
func (w *workerGroup) WithContext(ctx context.Context) IWorkerGroupDo {
return w.workerGroupDo.WithContext(ctx)
}
func (w workerGroup) TableName() string { return w.workerGroupDo.TableName() }
func (w workerGroup) Alias() string { return w.workerGroupDo.Alias() }
func (w workerGroup) Columns(cols ...field.Expr) gen.Columns { return w.workerGroupDo.Columns(cols...) }
func (w *workerGroup) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := w.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (w *workerGroup) fillFieldMap() {
w.fieldMap = make(map[string]field.Expr, 7)
w.fieldMap["id"] = w.ID
w.fieldMap["created_at"] = w.CreatedAt
w.fieldMap["updated_at"] = w.UpdatedAt
w.fieldMap["deleted_at"] = w.DeletedAt
w.fieldMap["name"] = w.Name
w.fieldMap["slug"] = w.Slug
}
func (w workerGroup) clone(db *gorm.DB) workerGroup {
w.workerGroupDo.ReplaceConnPool(db.Statement.ConnPool)
return w
}
func (w workerGroup) replaceDB(db *gorm.DB) workerGroup {
w.workerGroupDo.ReplaceDB(db)
return w
}
type workerGroupManyToManyMonitors struct {
db *gorm.DB
field.RelationField
History struct {
field.RelationField
}
WorkerGroups struct {
field.RelationField
Monitors struct {
field.RelationField
}
}
}
func (a workerGroupManyToManyMonitors) Where(conds ...field.Expr) *workerGroupManyToManyMonitors {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a workerGroupManyToManyMonitors) WithContext(ctx context.Context) *workerGroupManyToManyMonitors {
a.db = a.db.WithContext(ctx)
return &a
}
func (a workerGroupManyToManyMonitors) Session(session *gorm.Session) *workerGroupManyToManyMonitors {
a.db = a.db.Session(session)
return &a
}
func (a workerGroupManyToManyMonitors) Model(m *models.WorkerGroup) *workerGroupManyToManyMonitorsTx {
return &workerGroupManyToManyMonitorsTx{a.db.Model(m).Association(a.Name())}
}
type workerGroupManyToManyMonitorsTx struct{ tx *gorm.Association }
func (a workerGroupManyToManyMonitorsTx) Find() (result []*models.Monitor, err error) {
return result, a.tx.Find(&result)
}
func (a workerGroupManyToManyMonitorsTx) Append(values ...*models.Monitor) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a workerGroupManyToManyMonitorsTx) Replace(values ...*models.Monitor) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a workerGroupManyToManyMonitorsTx) Delete(values ...*models.Monitor) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a workerGroupManyToManyMonitorsTx) Clear() error {
return a.tx.Clear()
}
func (a workerGroupManyToManyMonitorsTx) Count() int64 {
return a.tx.Count()
}
type workerGroupDo struct{ gen.DO }
type IWorkerGroupDo interface {
gen.SubQuery
Debug() IWorkerGroupDo
WithContext(ctx context.Context) IWorkerGroupDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IWorkerGroupDo
WriteDB() IWorkerGroupDo
As(alias string) gen.Dao
Session(config *gorm.Session) IWorkerGroupDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IWorkerGroupDo
Not(conds ...gen.Condition) IWorkerGroupDo
Or(conds ...gen.Condition) IWorkerGroupDo
Select(conds ...field.Expr) IWorkerGroupDo
Where(conds ...gen.Condition) IWorkerGroupDo
Order(conds ...field.Expr) IWorkerGroupDo
Distinct(cols ...field.Expr) IWorkerGroupDo
Omit(cols ...field.Expr) IWorkerGroupDo
Join(table schema.Tabler, on ...field.Expr) IWorkerGroupDo
LeftJoin(table schema.Tabler, on ...field.Expr) IWorkerGroupDo
RightJoin(table schema.Tabler, on ...field.Expr) IWorkerGroupDo
Group(cols ...field.Expr) IWorkerGroupDo
Having(conds ...gen.Condition) IWorkerGroupDo
Limit(limit int) IWorkerGroupDo
Offset(offset int) IWorkerGroupDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IWorkerGroupDo
Unscoped() IWorkerGroupDo
Create(values ...*models.WorkerGroup) error
CreateInBatches(values []*models.WorkerGroup, batchSize int) error
Save(values ...*models.WorkerGroup) error
First() (*models.WorkerGroup, error)
Take() (*models.WorkerGroup, error)
Last() (*models.WorkerGroup, error)
Find() ([]*models.WorkerGroup, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.WorkerGroup, err error)
FindInBatches(result *[]*models.WorkerGroup, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*models.WorkerGroup) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IWorkerGroupDo
Assign(attrs ...field.AssignExpr) IWorkerGroupDo
Joins(fields ...field.RelationField) IWorkerGroupDo
Preload(fields ...field.RelationField) IWorkerGroupDo
FirstOrInit() (*models.WorkerGroup, error)
FirstOrCreate() (*models.WorkerGroup, error)
FindByPage(offset int, limit int) (result []*models.WorkerGroup, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IWorkerGroupDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (w workerGroupDo) Debug() IWorkerGroupDo {
return w.withDO(w.DO.Debug())
}
func (w workerGroupDo) WithContext(ctx context.Context) IWorkerGroupDo {
return w.withDO(w.DO.WithContext(ctx))
}
func (w workerGroupDo) ReadDB() IWorkerGroupDo {
return w.Clauses(dbresolver.Read)
}
func (w workerGroupDo) WriteDB() IWorkerGroupDo {
return w.Clauses(dbresolver.Write)
}
func (w workerGroupDo) Session(config *gorm.Session) IWorkerGroupDo {
return w.withDO(w.DO.Session(config))
}
func (w workerGroupDo) Clauses(conds ...clause.Expression) IWorkerGroupDo {
return w.withDO(w.DO.Clauses(conds...))
}
func (w workerGroupDo) Returning(value interface{}, columns ...string) IWorkerGroupDo {
return w.withDO(w.DO.Returning(value, columns...))
}
func (w workerGroupDo) Not(conds ...gen.Condition) IWorkerGroupDo {
return w.withDO(w.DO.Not(conds...))
}
func (w workerGroupDo) Or(conds ...gen.Condition) IWorkerGroupDo {
return w.withDO(w.DO.Or(conds...))
}
func (w workerGroupDo) Select(conds ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Select(conds...))
}
func (w workerGroupDo) Where(conds ...gen.Condition) IWorkerGroupDo {
return w.withDO(w.DO.Where(conds...))
}
func (w workerGroupDo) Order(conds ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Order(conds...))
}
func (w workerGroupDo) Distinct(cols ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Distinct(cols...))
}
func (w workerGroupDo) Omit(cols ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Omit(cols...))
}
func (w workerGroupDo) Join(table schema.Tabler, on ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Join(table, on...))
}
func (w workerGroupDo) LeftJoin(table schema.Tabler, on ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.LeftJoin(table, on...))
}
func (w workerGroupDo) RightJoin(table schema.Tabler, on ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.RightJoin(table, on...))
}
func (w workerGroupDo) Group(cols ...field.Expr) IWorkerGroupDo {
return w.withDO(w.DO.Group(cols...))
}
func (w workerGroupDo) Having(conds ...gen.Condition) IWorkerGroupDo {
return w.withDO(w.DO.Having(conds...))
}
func (w workerGroupDo) Limit(limit int) IWorkerGroupDo {
return w.withDO(w.DO.Limit(limit))
}
func (w workerGroupDo) Offset(offset int) IWorkerGroupDo {
return w.withDO(w.DO.Offset(offset))
}
func (w workerGroupDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IWorkerGroupDo {
return w.withDO(w.DO.Scopes(funcs...))
}
func (w workerGroupDo) Unscoped() IWorkerGroupDo {
return w.withDO(w.DO.Unscoped())
}
func (w workerGroupDo) Create(values ...*models.WorkerGroup) error {
if len(values) == 0 {
return nil
}
return w.DO.Create(values)
}
func (w workerGroupDo) CreateInBatches(values []*models.WorkerGroup, batchSize int) error {
return w.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (w workerGroupDo) Save(values ...*models.WorkerGroup) error {
if len(values) == 0 {
return nil
}
return w.DO.Save(values)
}
func (w workerGroupDo) First() (*models.WorkerGroup, error) {
if result, err := w.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.WorkerGroup), nil
}
}
func (w workerGroupDo) Take() (*models.WorkerGroup, error) {
if result, err := w.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.WorkerGroup), nil
}
}
func (w workerGroupDo) Last() (*models.WorkerGroup, error) {
if result, err := w.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.WorkerGroup), nil
}
}
func (w workerGroupDo) Find() ([]*models.WorkerGroup, error) {
result, err := w.DO.Find()
return result.([]*models.WorkerGroup), err
}
func (w workerGroupDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.WorkerGroup, err error) {
buf := make([]*models.WorkerGroup, 0, batchSize)
err = w.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (w workerGroupDo) FindInBatches(result *[]*models.WorkerGroup, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return w.DO.FindInBatches(result, batchSize, fc)
}
func (w workerGroupDo) Attrs(attrs ...field.AssignExpr) IWorkerGroupDo {
return w.withDO(w.DO.Attrs(attrs...))
}
func (w workerGroupDo) Assign(attrs ...field.AssignExpr) IWorkerGroupDo {
return w.withDO(w.DO.Assign(attrs...))
}
func (w workerGroupDo) Joins(fields ...field.RelationField) IWorkerGroupDo {
for _, _f := range fields {
w = *w.withDO(w.DO.Joins(_f))
}
return &w
}
func (w workerGroupDo) Preload(fields ...field.RelationField) IWorkerGroupDo {
for _, _f := range fields {
w = *w.withDO(w.DO.Preload(_f))
}
return &w
}
func (w workerGroupDo) FirstOrInit() (*models.WorkerGroup, error) {
if result, err := w.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.WorkerGroup), nil
}
}
func (w workerGroupDo) FirstOrCreate() (*models.WorkerGroup, error) {
if result, err := w.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.WorkerGroup), nil
}
}
func (w workerGroupDo) FindByPage(offset int, limit int) (result []*models.WorkerGroup, count int64, err error) {
result, err = w.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = w.Offset(-1).Limit(-1).Count()
return
}
func (w workerGroupDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = w.Count()
if err != nil {
return
}
err = w.Offset(offset).Limit(limit).Scan(result)
return
}
func (w workerGroupDo) Scan(result interface{}) (err error) {
return w.DO.Scan(result)
}
func (w workerGroupDo) Delete(models ...*models.WorkerGroup) (result gen.ResultInfo, err error) {
return w.DO.Delete(models)
}
func (w *workerGroupDo) withDO(do gen.Dao) *workerGroupDo {
w.DO = *do.(*gen.DO)
return w
}

View file

@ -5,62 +5,193 @@ import (
"log"
"time"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/internal/models/query"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/workflows"
"github.com/jmoiron/sqlx"
"go.temporal.io/sdk/client"
"go.temporal.io/sdk/temporal"
"gorm.io/gorm"
"golang.org/x/exp/maps"
)
func getScheduleId(monitor *models.Monitor, group string) string {
return "monitor-" + monitor.Slug + "-" + group
}
func CreateMonitor(ctx context.Context, query *query.Query, monitor *models.Monitor) error {
return query.Monitor.WithContext(ctx).Create(monitor)
}
func UpdateMonitor(ctx context.Context, q *query.Query, monitor *models.Monitor) error {
_, err := q.Monitor.WithContext(ctx).Where(
q.Monitor.Slug.Eq(monitor.Slug),
).Updates(monitor)
func CreateMonitor(ctx context.Context, db *sqlx.DB, monitor *models.Monitor) error {
_, err := db.NamedExecContext(ctx,
"INSERT INTO monitors (slug, name, script, schedule) VALUES (:slug, :name, :script, :schedule)",
monitor,
)
return err
}
func UpdateMonitorWorkerGroups(ctx context.Context, q *query.Query, monitor *models.Monitor, workerGroups []*models.WorkerGroup) error {
return q.Monitor.WorkerGroups.Model(monitor).Replace(workerGroups...)
func UpdateMonitor(ctx context.Context, db *sqlx.DB, monitor *models.Monitor) error {
_, err := db.NamedExecContext(ctx,
"UPDATE monitors SET name=:name, script=:script, schedule=:schedule WHERE slug=:slug",
monitor,
)
return err
}
func GetMonitor(ctx context.Context, q *query.Query, slug string) (*models.Monitor, error) {
return q.Monitor.WithContext(ctx).Where(
q.Monitor.Slug.Eq(slug),
).Preload(
q.Monitor.WorkerGroups,
q.Monitor.History,
).First()
func UpdateMonitorWorkerGroups(ctx context.Context, db *sqlx.DB, monitor *models.Monitor, workerGroups []*models.WorkerGroup) error {
tx, err := db.BeginTxx(ctx, nil)
if err != nil {
return err
}
_, err = tx.ExecContext(ctx,
"DELETE FROM monitor_worker_groups WHERE monitor_slug=$1",
monitor.Slug,
)
if err != nil {
tx.Rollback()
return err
}
for _, group := range workerGroups {
_, err = tx.ExecContext(ctx,
"INSERT INTO monitor_worker_groups (monitor_slug, worker_group_slug) VALUES ($1, $2)",
monitor.Slug,
group.Slug,
)
if err != nil {
tx.Rollback()
return err
}
}
return tx.Commit()
}
func GetMonitors(ctx context.Context, q *query.Query) ([]*models.Monitor, error) {
return q.Monitor.WithContext(ctx).Preload(
q.Monitor.History,
).Preload(
q.Monitor.WorkerGroups,
).Find()
func GetMonitor(ctx context.Context, db *sqlx.DB, slug string) (*models.Monitor, error) {
monitor := &models.Monitor{}
err := db.GetContext(ctx, monitor,
"SELECT * FROM monitors WHERE slug=$1 AND deleted_at IS NULL",
slug,
)
return monitor, err
}
func GetMonitorWithWorkerGroups(ctx context.Context, db *sqlx.DB, slug string) (*models.MonitorWithWorkerGroups, error) {
rows, err := db.QueryContext(ctx,
`
SELECT
monitors.slug,
monitors.name,
monitors.script,
monitors.schedule,
monitors.created_at,
monitors.updated_at,
monitors.deleted_at,
worker_groups.name as worker_group_name
FROM monitors
LEFT OUTER JOIN monitor_worker_groups ON monitors.slug = monitor_worker_groups.monitor_slug
LEFT OUTER JOIN worker_groups ON monitor_worker_groups.worker_group_slug = worker_groups.slug
WHERE monitors.slug=$1 AND monitors.deleted_at IS NULL
`,
slug,
)
if err != nil {
return nil, err
}
defer rows.Close()
monitor := &models.MonitorWithWorkerGroups{}
for rows.Next() {
var workerGroupName *string
err = rows.Scan(
&monitor.Slug,
&monitor.Name,
&monitor.Script,
&monitor.Schedule,
&monitor.CreatedAt,
&monitor.UpdatedAt,
&monitor.DeletedAt,
&workerGroupName,
)
if err != nil {
return nil, err
}
if workerGroupName != nil {
monitor.WorkerGroups = append(monitor.WorkerGroups, *workerGroupName)
}
}
return monitor, err
}
func GetMonitors(ctx context.Context, db *sqlx.DB) ([]*models.Monitor, error) {
monitors := []*models.Monitor{}
err := db.SelectContext(ctx, &monitors,
"SELECT * FROM monitors WHERE deleted_at IS NULL",
)
return monitors, err
}
func GetMonitorsWithWorkerGroups(ctx context.Context, db *sqlx.DB) ([]*models.MonitorWithWorkerGroups, error) {
rows, err := db.QueryContext(ctx,
`
SELECT
monitors.slug,
monitors.name,
monitors.script,
monitors.schedule,
monitors.created_at,
monitors.updated_at,
monitors.deleted_at,
worker_groups.name as worker_group_name
FROM monitors
LEFT OUTER JOIN monitor_worker_groups ON monitors.slug = monitor_worker_groups.monitor_slug
LEFT OUTER JOIN worker_groups ON monitor_worker_groups.worker_group_slug = worker_groups.slug
WHERE monitors.deleted_at IS NULL
`)
if err != nil {
return nil, err
}
defer rows.Close()
monitors := map[string]*models.MonitorWithWorkerGroups{}
for rows.Next() {
monitor := &models.MonitorWithWorkerGroups{}
var workerGroupName *string
err = rows.Scan(
&monitor.Slug,
&monitor.Name,
&monitor.Script,
&monitor.Schedule,
&monitor.CreatedAt,
&monitor.UpdatedAt,
&monitor.DeletedAt,
&workerGroupName,
)
if err != nil {
return nil, err
}
if workerGroupName != nil {
workerGroups := []string{}
if monitors[monitor.Slug] != nil {
workerGroups = monitors[monitor.Slug].WorkerGroups
}
monitor.WorkerGroups = append(workerGroups, *workerGroupName)
}
monitors[monitor.Slug] = monitor
}
return maps.Values(monitors), err
}
func CreateOrUpdateMonitorSchedule(
ctx context.Context,
t client.Client,
monitor *models.Monitor,
workerGroups []*models.WorkerGroup,
) error {
log.Println("Creating or Updating Monitor Schedule")
args := make([]interface{}, 0)
args = append(args, workflows.MonitorWorkflowParam{Script: monitor.Script, Slug: monitor.Slug})
for _, group := range monitor.WorkerGroups {
for _, group := range workerGroups {
options := client.ScheduleOptions{
ID: getScheduleId(monitor, group.Slug),
Spec: client.ScheduleSpec{
@ -113,7 +244,3 @@ func CreateOrUpdateMonitorSchedule(
return nil
}
func CreateMonitorHistory(ctx context.Context, db *gorm.DB, monitorHistory *models.MonitorHistory) error {
return db.WithContext(ctx).Create(monitorHistory).Error
}

View file

@ -0,0 +1,25 @@
package services
import (
"context"
"code.tjo.space/mentos1386/zdravko/database/models"
"github.com/jmoiron/sqlx"
)
func GetMonitorHistoryForMonitor(ctx context.Context, db *sqlx.DB, monitorSlug string) ([]*models.MonitorHistory, error) {
var monitorHistory []*models.MonitorHistory
err := db.SelectContext(ctx, &monitorHistory,
"SELECT * FROM monitor_histories WHERE monitor_slug = $1 ORDER BY created_at DESC",
monitorSlug,
)
return monitorHistory, err
}
func AddHistoryForMonitor(ctx context.Context, db *sqlx.DB, history *models.MonitorHistory) error {
_, err := db.NamedExecContext(ctx,
"INSERT INTO monitor_histories (monitor_slug, status, note) VALUES (:monitor_slug, :status, :note)",
history,
)
return err
}

View file

@ -0,0 +1,30 @@
package services
import (
"context"
"code.tjo.space/mentos1386/zdravko/database/models"
"github.com/jmoiron/sqlx"
)
func CreateOAuth2State(ctx context.Context, db *sqlx.DB, oauth2State *models.OAuth2State) error {
_, err := db.NamedExecContext(ctx,
"INSERT INTO oauth2_states (state, expires_at) VALUES (:state, :expires_at)",
oauth2State,
)
return err
}
func DeleteOAuth2State(ctx context.Context, db *sqlx.DB, state string) (deleted bool, err error) {
res, err := db.ExecContext(ctx, "DELETE FROM oauth2_states WHERE state = $1 AND expires_at > NOW()", state)
if err != nil {
return false, err
}
affected, err := res.RowsAffected()
if err != nil {
return false, err
}
return affected > 0, err
}

View file

@ -3,42 +3,138 @@ package services
import (
"context"
"code.tjo.space/mentos1386/zdravko/internal/models"
"code.tjo.space/mentos1386/zdravko/internal/models/query"
"gorm.io/gorm/clause"
"code.tjo.space/mentos1386/zdravko/database/models"
"github.com/jmoiron/sqlx"
"golang.org/x/exp/maps"
)
func GetOrCreateWorkerGroup(ctx context.Context, q *query.Query, workerGroup models.WorkerGroup) (*models.WorkerGroup, error) {
tx := q.Begin()
func CreateWorkerGroup(ctx context.Context, db *sqlx.DB, workerGroup *models.WorkerGroup) error {
_, err := db.NamedExecContext(ctx,
"INSERT INTO worker_groups (slug, name) VALUES (:slug, :name)",
workerGroup,
)
return err
}
if err := tx.WorkerGroup.WithContext(ctx).Clauses(clause.OnConflict{DoNothing: true}).Create(&workerGroup); err != nil {
_ = tx.Rollback()
return nil, err
}
func GetWorkerGroups(ctx context.Context, db *sqlx.DB) ([]*models.WorkerGroup, error) {
var workerGroups []*models.WorkerGroup
err := db.SelectContext(ctx, &workerGroups,
"SELECT * FROM worker_groups WHERE deleted_at IS NULL",
)
return workerGroups, err
}
wg, err := tx.WorkerGroup.WithContext(ctx).Where(
q.WorkerGroup.Slug.Eq(workerGroup.Slug),
).First()
func GetWorkerGroupsWithMonitors(ctx context.Context, db *sqlx.DB) ([]*models.WorkerGroupWithMonitors, error) {
rows, err := db.QueryContext(ctx,
`
SELECT
worker_groups.slug,
worker_groups.name,
worker_groups.created_at,
worker_groups.updated_at,
worker_groups.deleted_at,
monitors.name as monitor_name
FROM worker_groups
LEFT OUTER JOIN monitor_worker_groups ON worker_groups.slug = monitor_worker_groups.worker_group_slug
LEFT OUTER JOIN monitors ON monitor_worker_groups.monitor_slug = monitors.slug
WHERE worker_groups.deleted_at IS NULL AND monitors.deleted_at IS NULL
`)
if err != nil {
_ = tx.Rollback()
return nil, err
}
defer rows.Close()
return wg, tx.Commit()
workerGroups := map[string]*models.WorkerGroupWithMonitors{}
for rows.Next() {
workerGroup := &models.WorkerGroupWithMonitors{}
var monitorName *string
err = rows.Scan(
&workerGroup.Slug,
&workerGroup.Name,
&workerGroup.CreatedAt,
&workerGroup.UpdatedAt,
&workerGroup.DeletedAt,
&monitorName,
)
if err != nil {
return nil, err
}
if monitorName != nil {
monitors := []string{}
if workerGroups[workerGroup.Slug] != nil {
monitors = workerGroups[workerGroup.Slug].Monitors
}
workerGroup.Monitors = append(monitors, *monitorName)
}
workerGroups[workerGroup.Slug] = workerGroup
}
return maps.Values(workerGroups), err
}
func GetWorkerGroups(ctx context.Context, q *query.Query) ([]*models.WorkerGroup, error) {
return q.WorkerGroup.WithContext(ctx).Preload(q.WorkerGroup.Monitors).Find()
func GetWorkerGroupsBySlug(ctx context.Context, db *sqlx.DB, slugs []string) ([]*models.WorkerGroup, error) {
var workerGroups []*models.WorkerGroup
err := db.SelectContext(ctx, &workerGroups,
"SELECT * FROM worker_groups WHERE slug = ANY($1) AND deleted_at IS NULL",
slugs,
)
return workerGroups, err
}
func GetWorkerGroupsBySlug(ctx context.Context, q *query.Query, slugs []string) ([]*models.WorkerGroup, error) {
return q.WorkerGroup.WithContext(ctx).Where(
q.WorkerGroup.Slug.In(slugs...),
).Find()
func GetWorkerGroup(ctx context.Context, db *sqlx.DB, slug string) (*models.WorkerGroup, error) {
var workerGroup models.WorkerGroup
err := db.GetContext(ctx, &workerGroup,
"SELECT * FROM worker_groups WHERE slug = $1 AND deleted_at IS NULL",
slug,
)
return &workerGroup, err
}
func GetWorkerGroup(ctx context.Context, q *query.Query, slug string) (*models.WorkerGroup, error) {
return q.WorkerGroup.WithContext(ctx).Where(
q.WorkerGroup.Slug.Eq(slug),
).First()
func GetWorkerGroupWithMonitors(ctx context.Context, db *sqlx.DB, slug string) (*models.WorkerGroupWithMonitors, error) {
rows, err := db.QueryContext(ctx,
`
SELECT
worker_groups.slug,
worker_groups.name,
worker_groups.created_at,
worker_groups.updated_at,
worker_groups.deleted_at,
monitors.name as monitor_name
FROM worker_groups
LEFT OUTER JOIN monitor_worker_groups ON worker_groups.slug = monitor_worker_groups.worker_group_slug
LEFT OUTER JOIN monitors ON monitor_worker_groups.monitor_slug = monitors.slug
WHERE worker_groups.slug=$1 AND worker_groups.deleted_at IS NULL AND monitors.deleted_at IS NULL
`,
slug,
)
if err != nil {
return nil, err
}
defer rows.Close()
workerGroup := &models.WorkerGroupWithMonitors{}
for rows.Next() {
var monitorName *string
err = rows.Scan(
&workerGroup.Slug,
&workerGroup.Name,
&workerGroup.CreatedAt,
&workerGroup.UpdatedAt,
&workerGroup.DeletedAt,
&monitorName,
)
if err != nil {
return nil, err
}
if monitorName != nil {
workerGroup.Monitors = append(workerGroup.Monitors, *monitorName)
}
}
return workerGroup, err
}

View file

@ -2,6 +2,7 @@ package temporal
import (
"context"
"log/slog"
"time"
"code.tjo.space/mentos1386/zdravko/internal/config"
@ -21,7 +22,7 @@ func (p *AuthHeadersProvider) GetHeaders(ctx context.Context) (map[string]string
}, nil
}
func ConnectServerToTemporal(cfg *config.ServerConfig) (client.Client, error) {
func ConnectServerToTemporal(logger *slog.Logger, cfg *config.ServerConfig) (client.Client, error) {
// For server we generate new token with admin permissions
token, err := jwt.NewTokenForServer(cfg.Jwt.PrivateKey, cfg.Jwt.PublicKey)
if err != nil {
@ -31,12 +32,18 @@ func ConnectServerToTemporal(cfg *config.ServerConfig) (client.Client, error) {
provider := &AuthHeadersProvider{token}
// Try to connect to the Temporal Server
return retry.Retry(10, 2*time.Second, func() (client.Client, error) {
c, err := retry.Retry(10, 2*time.Second, func() (client.Client, error) {
return client.Dial(client.Options{
HostPort: cfg.Temporal.ServerHost,
HeadersProvider: provider,
})
})
if err != nil {
logger.Error("Failed to connect to Temporal Server after retries")
return nil, errors.Wrap(err, "failed to connect to Temporal Server after retries")
}
return c, nil
}
func ConnectWorkerToTemporal(token string, temporalHost string) (client.Client, error) {

View file

@ -3,8 +3,8 @@ package workflows
import (
"time"
"code.tjo.space/mentos1386/zdravko/database/models"
"code.tjo.space/mentos1386/zdravko/internal/activities"
"code.tjo.space/mentos1386/zdravko/internal/models"
"go.temporal.io/sdk/workflow"
)

View file

@ -17,7 +17,9 @@ _default:
# Run full development environment
run:
watchexec -r -e tmpl,css just _tailwindcss-build | sed -e 's/^/tailwind: /;' &
sleep 1
just run-temporal | sed -e 's/^/temporal: /;' &
sleep 1
watchexec -r -e go,tmpl,css just run-server
# Start worker
@ -81,13 +83,12 @@ run-docker:
-e WORKER_TOKEN \
{{DOCKER_IMAGE}} --server --temporal --worker
# Start devbox shell
shell:
devbox shell
# Start Sqlite web client
sqlite-web:
sqlite_web zdravko.db
# Generate and download all external dependencies.
generate:
rm -rf internal/models/query/*
go generate ./...
_tailwindcss-build:
@ -114,6 +115,3 @@ _monaco-download:
_feather-icons-download:
mkdir -p {{STATIC_DIR}}/icons
curl -sLo {{STATIC_DIR}}/icons/feather-sprite.svg https://unpkg.com/feather-icons/dist/feather-sprite.svg
_generate-gorm:
go run tools/generate/main.go

View file

@ -2,10 +2,10 @@ package server
import (
"context"
"log"
"log/slog"
"net/http"
"code.tjo.space/mentos1386/zdravko/internal"
"code.tjo.space/mentos1386/zdravko/database"
"code.tjo.space/mentos1386/zdravko/internal/config"
"code.tjo.space/mentos1386/zdravko/internal/handlers"
"code.tjo.space/mentos1386/zdravko/internal/temporal"
@ -16,14 +16,16 @@ import (
)
type Server struct {
echo *echo.Echo
cfg *config.ServerConfig
echo *echo.Echo
cfg *config.ServerConfig
logger *slog.Logger
}
func NewServer(cfg *config.ServerConfig) (*Server, error) {
return &Server{
cfg: cfg,
echo: echo.New(),
cfg: cfg,
echo: echo.New(),
logger: slog.Default().WithGroup("server"),
}, nil
}
@ -36,31 +38,24 @@ func (s *Server) Start() error {
//s.echo.Use(middleware.Logger())
s.echo.Use(middleware.Recover())
db, query, err := internal.ConnectToDatabase(s.cfg.DatabasePath)
db, err := database.ConnectToDatabase(s.logger, s.cfg.DatabasePath)
if err != nil {
return err
}
log.Println("Connected to database")
temporalClient, err := temporal.ConnectServerToTemporal(s.cfg)
temporalClient, err := temporal.ConnectServerToTemporal(s.logger, s.cfg)
if err != nil {
return err
}
log.Println("Connected to Temporal")
h := handlers.NewBaseHandler(query, temporalClient, s.cfg)
h := handlers.NewBaseHandler(db, temporalClient, s.cfg, s.logger)
// Health
s.echo.GET("/health", func(c echo.Context) error {
d, err := db.DB()
err = db.Ping()
if err != nil {
return err
}
err = d.Ping()
if err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]string{"status": "ok"})
})

View file

@ -1,40 +0,0 @@
package main
import (
"code.tjo.space/mentos1386/zdravko/internal/config"
"code.tjo.space/mentos1386/zdravko/internal/models"
"gorm.io/driver/sqlite"
"gorm.io/gen"
"gorm.io/gorm"
)
func main() {
config := config.NewServerConfig()
// Initialize the generator with configuration
g := gen.NewGenerator(gen.Config{
OutPath: "internal/models/query",
Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
FieldNullable: true,
})
db, err := gorm.Open(sqlite.Open(config.DatabasePath), &gorm.Config{})
if err != nil {
panic(err)
}
// Use the above `*gorm.DB` instance to initialize the generator,
// which is required to generate structs from db when using `GenerateModel/GenerateModelAs`
g.UseDB(db)
// Generate default DAO interface for those specified structs
g.ApplyBasic(
models.Monitor{},
models.WorkerGroup{},
models.MonitorHistory{},
models.OAuth2State{},
)
// Execute the generator
g.Execute()
}

View file

@ -60,7 +60,7 @@
<td>
{{range .WorkerGroups}}
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 text-blue-800">
{{ .Name }}
{{ . }}
</span>
{{end}}
</td>

View file

@ -5,7 +5,7 @@
Configuration
</h2>
<label for="workergroups">Worker Groups</label>
<input type="text" name="workergroups" id="workergroups" value="{{ range .Monitor.WorkerGroups }}{{.Name}} {{end}}"/>
<input type="text" name="workergroups" id="workergroups" value="{{ range .Monitor.WorkerGroups }}{{.}} {{end}}"/>
<p>Worker groups are used to distribute the monitor to specific workers.</p>
<label for="schedule">Schedule</label>
<input type="text" name="schedule" id="schedule" value="{{ .Monitor.Schedule }}"/>
@ -31,7 +31,7 @@
<caption class="p-5 text-lg font-semibold text-left rtl:text-right text-gray-900 bg-white">
History
<p class="mt-1 text-sm font-normal text-gray-500">
Last executions of monitor script.
Last 10 executions of monitor script.
</p>
</caption>
<thead>
@ -43,7 +43,7 @@
</tr>
</thead>
<tbody>
{{range .Monitor.History}}
{{range .History}}
<tr>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full {{if eq .Status "SUCCESS"}}bg-green-100 text-green-800{{else}}bg-red-100 text-red-800{{end}}">