renommage lassistanoque
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
package dberrors
|
||||
|
||||
import "errors"
|
||||
|
||||
var (
|
||||
ErrNoRowUpdated = errors.New("No row was updated")
|
||||
)
|
||||
@@ -0,0 +1,26 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/database/turso"
|
||||
"trankilou.fr/lassistanoque/backend/internal/config"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
)
|
||||
|
||||
type Database interface {
|
||||
SettingsReporitory() domain.SettingsRepository
|
||||
UserReporitory() domain.UserRepository
|
||||
Migrate() error
|
||||
Close()
|
||||
}
|
||||
|
||||
func GetDatabase() (Database, error) {
|
||||
cfg := config.GetConfig()
|
||||
switch cfg.DatabaseType {
|
||||
case "turso":
|
||||
return turso.NewTursoDB(cfg)
|
||||
default:
|
||||
}
|
||||
return nil, fmt.Errorf("Database %s not implemented", cfg.DatabaseType)
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package turso
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"fmt"
|
||||
|
||||
"github.com/golang-migrate/migrate/v4"
|
||||
"github.com/golang-migrate/migrate/v4/database/sqlite3"
|
||||
"github.com/golang-migrate/migrate/v4/source/iofs"
|
||||
"github.com/jmoiron/sqlx"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"trankilou.fr/lassistanoque/backend/internal/config"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
_ "turso.tech/database/tursogo"
|
||||
)
|
||||
|
||||
//go:embed migrations/*
|
||||
var FS embed.FS
|
||||
|
||||
type TursoDB struct {
|
||||
DB *sqlx.DB
|
||||
}
|
||||
|
||||
func NewTursoDB(cfg *config.Config) (*TursoDB, error) {
|
||||
db, err := sqlx.Connect("turso", cfg.DatabaseURL)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error connecting to db %: %s", cfg.DatabaseURL, err)
|
||||
}
|
||||
return &TursoDB{
|
||||
DB: db,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (db *TursoDB) UserReporitory() domain.UserRepository {
|
||||
return &TursoUserRepository{
|
||||
DB: db.DB,
|
||||
}
|
||||
}
|
||||
|
||||
func (db *TursoDB) SettingsReporitory() domain.SettingsRepository {
|
||||
return &TursoSettingsRepository{
|
||||
DB: db.DB,
|
||||
}
|
||||
}
|
||||
|
||||
func (db *TursoDB) Close() {
|
||||
db.DB.Close()
|
||||
}
|
||||
|
||||
func (db *TursoDB) Migrate() error {
|
||||
sqldb := db.DB.DB
|
||||
dbDriver, err := sqlite3.WithInstance(sqldb, &sqlite3.Config{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sourceInstance, err := iofs.New(FS, "migrations")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
m, err := migrate.NewWithInstance("iofs", sourceInstance, "sqlite3", dbDriver)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
m.Up()
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
drop table providers;
|
||||
drop table models;
|
||||
drop table system;
|
||||
drop table oidc;
|
||||
drop table users;
|
||||
drop table user_addresses;
|
||||
drop table channels;
|
||||
drop table tools;
|
||||
drop table tasks;
|
||||
drop table history;
|
||||
@@ -0,0 +1,95 @@
|
||||
create table providers (
|
||||
id text not null primary key,
|
||||
name text,
|
||||
key text,
|
||||
url text,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table models (
|
||||
id text not null primary key,
|
||||
provider_id text,
|
||||
name text,
|
||||
modelname text,
|
||||
configuration text,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table settings (
|
||||
chat_model_id text,
|
||||
default_lang text,
|
||||
register_enabled numeric,
|
||||
password_enabled numeric,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table oidc (
|
||||
id string not null primary key,
|
||||
label string,
|
||||
domain string,
|
||||
client_id string,
|
||||
client_secret string,
|
||||
wellknown_url string,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table users (
|
||||
id string not null primary key,
|
||||
firstname string not null default '',
|
||||
lastname string not null default '',
|
||||
password string not null default '',
|
||||
email string not null unique,
|
||||
picture string not null default '',
|
||||
enabled numeric default true,
|
||||
administrator numeric default false,
|
||||
_version text not null
|
||||
);
|
||||
|
||||
create table user_addresses (
|
||||
id string not null primary key,
|
||||
user_id string,
|
||||
type string,
|
||||
address string,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table channels (
|
||||
id string not null primary key,
|
||||
name string,
|
||||
type string,
|
||||
enabled numeric,
|
||||
configuration string,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table tools (
|
||||
id string not null primary key,
|
||||
name string,
|
||||
type string,
|
||||
enabled numeric,
|
||||
configuration string,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table tasks (
|
||||
id string not null primary key,
|
||||
owner_id string,
|
||||
model_id string,
|
||||
label string,
|
||||
prompt string,
|
||||
cron string,
|
||||
status string,
|
||||
next_datetime numeric,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table history (
|
||||
id string not null primary key,
|
||||
task_id string,
|
||||
start_datetimle numeric,
|
||||
end_datetime numeric,
|
||||
prompt string,
|
||||
log string,
|
||||
response string,
|
||||
_version text
|
||||
);
|
||||
@@ -0,0 +1 @@
|
||||
delete from sytem;
|
||||
@@ -0,0 +1,2 @@
|
||||
insert into settings (default_lang, register_enabled, password_enabled, _version)
|
||||
values ('en', true, true, 'init');
|
||||
@@ -0,0 +1,45 @@
|
||||
package turso
|
||||
|
||||
import (
|
||||
"github.com/jmoiron/sqlx"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/database/dberrors"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
"trankilou.fr/lassistanoque/backend/internal/utility"
|
||||
)
|
||||
|
||||
type TursoSettingsRepository struct {
|
||||
DB *sqlx.DB
|
||||
}
|
||||
|
||||
func (sr *TursoSettingsRepository) GetSettings() (*domain.Settings, error) {
|
||||
var settings domain.Settings
|
||||
err := sr.DB.Get(&settings, "select * from settings limit 1")
|
||||
return &settings, err
|
||||
}
|
||||
|
||||
func (sr *TursoSettingsRepository) UpdateSettings(setting *domain.Settings) (*domain.Settings, error) {
|
||||
newVersion := utility.GenID()
|
||||
|
||||
res, err := sr.DB.Exec(
|
||||
`update settings
|
||||
set chat_model_id=$1,
|
||||
default_lang=$2,
|
||||
register_enabled=$3,
|
||||
password_enabled=$4,
|
||||
_version=:$5
|
||||
where _version=$6`,
|
||||
setting.ChatModelID, setting.DefaultLang, setting.RegisterEnabled,
|
||||
setting.PasswordEnabled, newVersion, setting.VersionId,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if count, _ := res.RowsAffected(); count == 0 {
|
||||
return nil, dberrors.ErrNoRowUpdated
|
||||
}
|
||||
|
||||
setting.VersionId = newVersion
|
||||
|
||||
return setting, nil
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package turso
|
||||
|
||||
import (
|
||||
"github.com/jmoiron/sqlx"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/database/dberrors"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
"trankilou.fr/lassistanoque/backend/internal/utility"
|
||||
)
|
||||
|
||||
type TursoUserRepository struct {
|
||||
DB *sqlx.DB
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) FindUser(id string) (*domain.User, error) {
|
||||
var user domain.User
|
||||
err := ur.DB.Get(&user, "select * from users where id=$1", id)
|
||||
return &user, err
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) FindUserByEmail(email string) (*domain.User, error) {
|
||||
var user domain.User
|
||||
err := ur.DB.Get(&user, "select * from users where email=$1", email)
|
||||
return &user, err
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) CountUsers() (int, error) {
|
||||
var count int
|
||||
err := ur.DB.Get(&count, "select count(*) from users")
|
||||
return count, err
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) ListUsers() ([]*domain.User, error) {
|
||||
var users []*domain.User
|
||||
err := ur.DB.Select(&users, "select * from users order by lastname, firstname")
|
||||
return users, err
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) CreateUser(user *domain.User) (*domain.User, error) {
|
||||
|
||||
count, err := ur.CountUsers()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if count == 0 {
|
||||
user.Administrator = true
|
||||
}
|
||||
user.ID = utility.GenID()
|
||||
user.VersionId = utility.GenID()
|
||||
|
||||
ur.DB.NamedExec(
|
||||
`insert into users (id, email, firstname, lastname, enabled, password, administrator, _version)
|
||||
values (:id, :email, :firstname, :lastname, :enabled, :password, :administrator, :_version)`,
|
||||
user)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) UpdateUser(user *domain.User) (*domain.User, error) {
|
||||
|
||||
newVersion := utility.GenID()
|
||||
|
||||
res, err := ur.DB.Exec(
|
||||
`update users
|
||||
set email=$1,
|
||||
firstname=$2,
|
||||
lastname=$3,
|
||||
enabled=$4,
|
||||
administrator=$5
|
||||
_version=:$6
|
||||
where id=$7 and _version=$8`,
|
||||
user.Email, user.Firstname, user.Lastname,
|
||||
user.Enabled, user.Administrator,
|
||||
newVersion, user.ID, user.VersionId,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if count, _ := res.RowsAffected(); count == 0 {
|
||||
return nil, dberrors.ErrNoRowUpdated
|
||||
}
|
||||
|
||||
user.VersionId = newVersion
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) DeleteUser(id string) error {
|
||||
res, err := ur.DB.Exec("delete from users where id=$1", id)
|
||||
if count, _ := res.RowsAffected(); count == 0 {
|
||||
return dberrors.ErrNoRowUpdated
|
||||
}
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user