navigation
This commit is contained in:
+2
-1
@@ -1 +1,2 @@
|
||||
lassistanoque.db
|
||||
lassistanoque.db*
|
||||
build/*
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="13mm"
|
||||
height="13mm"
|
||||
viewBox="0 0 13 13"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
|
||||
sodipodi:docname="logo-small.svg"
|
||||
inkscape:export-filename="../backend/web/src/lib/assets/logo-txt.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.4431818"
|
||||
inkscape:cx="287.90552"
|
||||
inkscape:cy="214.80315"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:14.1111px;font-family:pixelart;-inkscape-font-specification:pixelart;writing-mode:lr-tb;direction:ltr;fill:#37abc8;stroke-width:0.264583"
|
||||
x="2.7499995"
|
||||
y="11.549997"
|
||||
id="text1"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.1111px;font-family:'GohuFont 11 Nerd Font';-inkscape-font-specification:'GohuFont 11 Nerd Font';fill:#0ea5e9;fill-opacity:1;stroke-width:0.264583"
|
||||
x="2.7499995"
|
||||
y="11.549997">l</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.7 KiB |
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="100mm"
|
||||
height="14mm"
|
||||
viewBox="0 0 100 14"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
|
||||
sodipodi:docname="logo-txt.svg"
|
||||
inkscape:export-filename="logo-txt.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.4431818"
|
||||
inkscape:cx="287.90552"
|
||||
inkscape:cy="214.80315"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:14.1111px;font-family:pixelart;-inkscape-font-specification:pixelart;writing-mode:lr-tb;direction:ltr;fill:#37abc8;stroke-width:0.264583"
|
||||
x="-0.73333383"
|
||||
y="10.999997"
|
||||
id="text1"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.1111px;font-family:'GohuFont 11 Nerd Font';-inkscape-font-specification:'GohuFont 11 Nerd Font';fill:#0ea5e9;fill-opacity:1;stroke-width:0.264583"
|
||||
x="-0.73333383"
|
||||
y="10.999997">lassistanoque</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
+13
-9
@@ -7,9 +7,11 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/auth/password"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/database"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/file"
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/security"
|
||||
"trankilou.fr/lassistanoque/backend/internal/http"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/auth"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/storage"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/user"
|
||||
)
|
||||
|
||||
@@ -45,31 +47,33 @@ func runServe() {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
settings, err := db.SettingsReporitory().GetSettings()
|
||||
// storage
|
||||
store, err := file.GetStorageProvider(db.FileRepository())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Adapters
|
||||
tokenManager := security.NewJwtTokenManager(12*time.Hour, 7*24*time.Hour, "lassistanoque")
|
||||
pwdAuth := password.NewPasswordAuthenticator(tokenManager, db.UserReporitory())
|
||||
pwdAuth := password.NewPasswordAuthenticator(tokenManager, db.UserRepository())
|
||||
|
||||
// services
|
||||
authService := auth.NewService(
|
||||
db.SettingsReporitory(),
|
||||
db.UserReporitory(),
|
||||
db.SettingsRepository(),
|
||||
db.UserRepository(),
|
||||
map[string]auth.Authenticator{
|
||||
"password": pwdAuth,
|
||||
},
|
||||
)
|
||||
userService := user.NewService(db.UserReporitory())
|
||||
userService := user.NewService(db.UserRepository())
|
||||
storageService := storage.NewService(store)
|
||||
|
||||
// http server
|
||||
router := http.NewRouter(http.Dependencies{
|
||||
Settings: settings,
|
||||
AuthService: authService,
|
||||
UserService: userService,
|
||||
TokenManager: tokenManager,
|
||||
StorageService: storageService,
|
||||
AuthService: authService,
|
||||
UserService: userService,
|
||||
TokenManager: tokenManager,
|
||||
})
|
||||
|
||||
if err := router.Start(); err != nil {
|
||||
|
||||
@@ -26,7 +26,7 @@ func NewPasswordAuthenticator(
|
||||
func (s *PasswordAuthenticator) Authenticate(ctx context.Context, creds auth.Credentials) (*auth.Session, error) {
|
||||
|
||||
user, err := s.userRepository.FindUserByEmail(creds.Email)
|
||||
if err != nil {
|
||||
if err != nil || !user.Enabled {
|
||||
return nil, fmt.Errorf("Unauthorized user %s : %s", creds.Email, err)
|
||||
}
|
||||
|
||||
@@ -61,15 +61,28 @@ func (s *PasswordAuthenticator) Register(ctx context.Context, registration auth.
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user, err := s.userRepository.CreateUser(&domain.User{
|
||||
|
||||
user := &domain.User{
|
||||
Email: registration.Email,
|
||||
Firstname: registration.Firstname,
|
||||
Lastname: registration.Lastname,
|
||||
Password: hashedPassord,
|
||||
})
|
||||
Enabled: true,
|
||||
}
|
||||
|
||||
count, err := s.userRepository.CountUsers()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_ = user
|
||||
return nil, nil
|
||||
if count == 0 {
|
||||
user.Administrator = true
|
||||
}
|
||||
|
||||
user, err = s.userRepository.CreateUser(user)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &auth.Session{User: user}, nil
|
||||
}
|
||||
|
||||
@@ -9,8 +9,9 @@ import (
|
||||
)
|
||||
|
||||
type Database interface {
|
||||
SettingsReporitory() domain.SettingsRepository
|
||||
UserReporitory() domain.UserRepository
|
||||
SettingsRepository() domain.SettingsRepository
|
||||
UserRepository() domain.UserRepository
|
||||
FileRepository() domain.FileRepository
|
||||
Migrate() error
|
||||
Close()
|
||||
}
|
||||
|
||||
@@ -31,18 +31,6 @@ func NewTursoDB(cfg *config.Config) (*TursoDB, error) {
|
||||
}, 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()
|
||||
}
|
||||
@@ -67,3 +55,15 @@ func (db *TursoDB) Migrate() error {
|
||||
m.Up()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (db *TursoDB) UserRepository() domain.UserRepository {
|
||||
return &TursoUserRepository{DB: db.DB}
|
||||
}
|
||||
|
||||
func (db *TursoDB) SettingsRepository() domain.SettingsRepository {
|
||||
return &TursoSettingsRepository{DB: db.DB}
|
||||
}
|
||||
|
||||
func (db *TursoDB) FileRepository() domain.FileRepository {
|
||||
return &TursoFileRepository{DB: db.DB}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
package turso
|
||||
|
||||
import (
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"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 TursoFileRepository struct {
|
||||
DB *sqlx.DB
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) FindByID(id string) (*domain.File, error) {
|
||||
var file domain.File
|
||||
err := fr.DB.Get(&file, "select id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version from files where id=$1", id)
|
||||
return &file, err
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) Create(file *domain.File) (*domain.File, error) {
|
||||
file.ID = utility.GenID()
|
||||
file.VersionId = utility.GenID()
|
||||
file.DateCreated = time.Now()
|
||||
file.DateUpdated = time.Now()
|
||||
_, err := fr.DB.NamedExec(
|
||||
`insert into files (id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version)
|
||||
values (:id, :name, :content_type, :storage_path, :storage_filename, :date_created, :date_updated, :_version)`,
|
||||
file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return file, nil
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) Update(file *domain.File) (*domain.File, error) {
|
||||
newVersion := utility.GenID()
|
||||
file.DateUpdated = time.Now()
|
||||
res, err := fr.DB.Exec(
|
||||
`update files
|
||||
set name=$1,
|
||||
content_type=$2,
|
||||
storage_path=$3,
|
||||
storage_filename=$4,
|
||||
date_updated=$5,
|
||||
_version=$6
|
||||
where id=$7 and _version=$8`,
|
||||
file.Name, file.ContentType, file.StoragePath, file.StorageFilename, file.DateUpdated,
|
||||
newVersion, file.ID, file.VersionId,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if count, _ := res.RowsAffected(); count == 0 {
|
||||
return nil, dberrors.ErrNoRowUpdated
|
||||
}
|
||||
|
||||
file.VersionId = newVersion
|
||||
|
||||
return file, nil
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) Delete(id string) error {
|
||||
res, err := fr.DB.Exec("delete from files where id=$1", id)
|
||||
if count, _ := res.RowsAffected(); count == 0 {
|
||||
return dberrors.ErrNoRowUpdated
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) Upload(reader io.Reader, path string, name string, contentType string, replace bool) (*domain.File, error) {
|
||||
|
||||
bytes, err := io.ReadAll(reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
file := &domain.File{
|
||||
ID: utility.GenID(),
|
||||
Name: name,
|
||||
StoragePath: path,
|
||||
StorageFilename: name,
|
||||
ContentType: contentType,
|
||||
VersionId: utility.GenID(),
|
||||
DateCreated: time.Now(),
|
||||
DateUpdated: time.Now(),
|
||||
Content: bytes,
|
||||
}
|
||||
|
||||
_, err = fr.DB.NamedExec(
|
||||
`insert into files (id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version, content)
|
||||
values (:id, :name, :content_type, :storage_path, :storage_filename, :date_created, :date_updated, :_version, :content)`,
|
||||
file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return file, nil
|
||||
}
|
||||
|
||||
func (fr *TursoFileRepository) Download(id string) (*domain.File, error) {
|
||||
var file domain.File
|
||||
err := fr.DB.Get(&file, "select * from files where id=$1", id)
|
||||
return &file, err
|
||||
}
|
||||
@@ -24,72 +24,72 @@ create table settings (
|
||||
);
|
||||
|
||||
create table oidc (
|
||||
id string not null primary key,
|
||||
label string,
|
||||
domain string,
|
||||
client_id string,
|
||||
client_secret string,
|
||||
wellknown_url string,
|
||||
id text not null primary key,
|
||||
label text,
|
||||
domain text,
|
||||
client_id text,
|
||||
client_secret text,
|
||||
wellknown_url text,
|
||||
_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 '',
|
||||
id text not null primary key,
|
||||
firstname text not null default '',
|
||||
lastname text not null default '',
|
||||
password text not null default '',
|
||||
email text not null unique,
|
||||
picture text 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,
|
||||
id text not null primary key,
|
||||
user_id text,
|
||||
type text,
|
||||
address text,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table channels (
|
||||
id string not null primary key,
|
||||
name string,
|
||||
type string,
|
||||
id text not null primary key,
|
||||
name text,
|
||||
type text,
|
||||
enabled numeric,
|
||||
configuration string,
|
||||
configuration text,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table tools (
|
||||
id string not null primary key,
|
||||
name string,
|
||||
type string,
|
||||
id text not null primary key,
|
||||
name text,
|
||||
type text,
|
||||
enabled numeric,
|
||||
configuration string,
|
||||
configuration text,
|
||||
_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,
|
||||
id text not null primary key,
|
||||
owner_id text,
|
||||
model_id text,
|
||||
label text,
|
||||
prompt text,
|
||||
cron text,
|
||||
status text,
|
||||
next_datetime numeric,
|
||||
_version text
|
||||
);
|
||||
|
||||
create table history (
|
||||
id string not null primary key,
|
||||
task_id string,
|
||||
id text not null primary key,
|
||||
task_id text,
|
||||
start_datetimle numeric,
|
||||
end_datetime numeric,
|
||||
prompt string,
|
||||
log string,
|
||||
response string,
|
||||
prompt text,
|
||||
log text,
|
||||
response text,
|
||||
_version text
|
||||
);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
drop table files;
|
||||
@@ -0,0 +1,11 @@
|
||||
create table files (
|
||||
id text not null primary key,
|
||||
name text not null default '',
|
||||
content_type text not null default '',
|
||||
storage_path text not null default '',
|
||||
storage_filename text not null default '',
|
||||
date_created numeric not null default current_timestamp,
|
||||
date_updated numeric not null default 0,
|
||||
content blob,
|
||||
_version text not null
|
||||
);
|
||||
@@ -37,21 +37,18 @@ func (ur *TursoUserRepository) ListUsers() ([]*domain.User, error) {
|
||||
|
||||
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(
|
||||
_, err := 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
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (ur *TursoUserRepository) UpdateUser(user *domain.User) (*domain.User, error) {
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
)
|
||||
|
||||
type DatabaseStorageProvider struct {
|
||||
repo domain.FileRepository
|
||||
}
|
||||
|
||||
func NewDatabaseStorageProvider(repo domain.FileRepository) *DatabaseStorageProvider {
|
||||
return &DatabaseStorageProvider{repo}
|
||||
}
|
||||
|
||||
func (p *DatabaseStorageProvider) EnsureBucket(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *DatabaseStorageProvider) PutObject(
|
||||
ctx context.Context,
|
||||
reader io.Reader,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
contentType string,
|
||||
) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *DatabaseStorageProvider) GetObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (io.ReadCloser, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (p *DatabaseStorageProvider) DeleteObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *DatabaseStorageProvider) ExistsObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
func (p *DatabaseStorageProvider) GetPresignedURL(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
Expiry time.Time,
|
||||
) (*url.URL, error) {
|
||||
parsed, _ := url.Parse("https://localhost")
|
||||
return parsed, nil
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package file
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"trankilou.fr/lassistanoque/backend/internal/adapter/file/database"
|
||||
"trankilou.fr/lassistanoque/backend/internal/config"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/storage"
|
||||
)
|
||||
|
||||
func GetStorageProvider(repository domain.FileRepository) (storage.StorageProvider, error) {
|
||||
cfg := config.GetConfig()
|
||||
switch cfg.StorageType {
|
||||
case "database":
|
||||
return database.NewDatabaseStorageProvider(repository), nil
|
||||
default:
|
||||
}
|
||||
return nil, fmt.Errorf("Storage %s not implemented", cfg.StorageType)
|
||||
}
|
||||
@@ -9,16 +9,24 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
DEFAULT_DB_TYPE = "turso"
|
||||
DEFAULT_DB_URL = "lassistanoque.db"
|
||||
DEFAULT_HTTP_PORT = 3000
|
||||
DEFAULT_DB_TYPE = "turso"
|
||||
DEFAULT_DB_URL = "lassistanoque.db"
|
||||
DEFAULT_HTTP_PORT = 3000
|
||||
DEFAULT_STORAGE_TYPE = "database"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
DatabaseType string
|
||||
DatabaseURL string
|
||||
HttpPort int
|
||||
JWTSecret string
|
||||
DatabaseType string
|
||||
DatabaseURL string
|
||||
HttpPort int
|
||||
JWTSecret string
|
||||
StorageType string // Database, S3, filesystem
|
||||
StoragePath string // filesystem
|
||||
StorageS3Bucket string // S3
|
||||
StorageS3Endpoint string // S3
|
||||
StorageS3AccessKeyID string // S3
|
||||
StorageS3AccessKeySecret string // S3
|
||||
StorageS3UseSSL string // S3
|
||||
}
|
||||
|
||||
var config *Config
|
||||
@@ -44,11 +52,17 @@ func GetConfig() *Config {
|
||||
if jwtsecret == "" {
|
||||
log.Fatal("LASSISTANOQUE_JWT_SECRET must be set")
|
||||
}
|
||||
storageType := os.Getenv("LASSISTANOQUE_STORAGE_TYPE")
|
||||
if storageType == "" {
|
||||
storageType = DEFAULT_STORAGE_TYPE
|
||||
}
|
||||
|
||||
config = &Config{
|
||||
DatabaseType: databaseType,
|
||||
DatabaseURL: databaseURL,
|
||||
HttpPort: httpPort,
|
||||
JWTSecret: jwtsecret,
|
||||
StorageType: storageType,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package domain
|
||||
|
||||
import (
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
type File struct {
|
||||
ID string `db:"id" json:"id"`
|
||||
Name string `db:"name" json:"name"`
|
||||
ContentType string `db:"content_type" json:"contentType"`
|
||||
StoragePath string `db:"storage_path" json:"-"`
|
||||
StorageFilename string `db:"storage_filename" json:"-"`
|
||||
Content []byte `db:"content" json:"-"`
|
||||
DateCreated time.Time `db:"date_created" json:"-"`
|
||||
DateUpdated time.Time `db:"date_updated" json:"-"`
|
||||
VersionId string `db:"_version" json:"-"`
|
||||
}
|
||||
|
||||
type FileRepository interface {
|
||||
FindByID(id string) (*File, error)
|
||||
Create(file *File) (*File, error)
|
||||
Update(file *File) (*File, error)
|
||||
Delete(id string) error
|
||||
Upload(reader io.Reader, path string, name string, contentType string, replace bool) (*File, error)
|
||||
Download(id string) (*File, error)
|
||||
}
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
"github.com/labstack/echo/v5"
|
||||
"github.com/labstack/echo/v5/middleware"
|
||||
"trankilou.fr/lassistanoque/backend/internal/config"
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
"trankilou.fr/lassistanoque/backend/internal/http/handlers"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/auth"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/storage"
|
||||
"trankilou.fr/lassistanoque/backend/internal/service/user"
|
||||
)
|
||||
|
||||
@@ -28,15 +28,14 @@ var indexhtml []byte
|
||||
var robotstxt []byte
|
||||
|
||||
type Router struct {
|
||||
settings *domain.Settings
|
||||
echo *echo.Echo
|
||||
echo *echo.Echo
|
||||
}
|
||||
|
||||
type Dependencies struct {
|
||||
Settings *domain.Settings
|
||||
AuthService *auth.Service
|
||||
UserService *user.Service
|
||||
TokenManager auth.TokenManager
|
||||
StorageService *storage.Service
|
||||
AuthService *auth.Service
|
||||
UserService *user.Service
|
||||
TokenManager auth.TokenManager
|
||||
}
|
||||
|
||||
func NewRouter(deps Dependencies) *Router {
|
||||
@@ -71,11 +70,9 @@ func NewRouter(deps Dependencies) *Router {
|
||||
api := e.Group("/api")
|
||||
_ = handlers.NewAuthGroup("/auth", api, deps.AuthService)
|
||||
_ = handlers.NewUserGroup("/user", api, deps.UserService, deps.TokenManager.TokenMiddleware)
|
||||
//_ = handlers.NewUserGroup("/user", e, deps.UserService)
|
||||
|
||||
return &Router{
|
||||
settings: deps.Settings,
|
||||
echo: e,
|
||||
echo: e,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import"./DxmhE1z1.js";import{a as e,r as t}from"./DZTG_XPZ.js";var n={get data(){return e.data},get error(){return e.error},get form(){return e.form},get params(){return e.params},get route(){return e.route},get state(){return e.state},get status(){return e.status},get url(){return e.url}};t.updated.check;var r=n;export{r as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{B as e,C as t,D as n,F as r,H as i,K as a,P as o,Q as s,R as c,V as l,_ as u,g as d,h as f,k as p,m,q as h,v as g,z as _}from"./DxmhE1z1.js";import"./xihTtKlq.js";var v=class extends Map{#e=new Map;#t=l(0);#n=l(0);#r=n||-1;constructor(e){if(super(),e){for(var[t,n]of e)super.set(t,n);this.#n.v=super.size}}#i(t){return n===this.#r?l(t):e(t)}has(e){var n=this.#e,r=n.get(e);if(r===void 0)if(super.has(e))r=this.#i(0),n.set(e,r);else return t(this.#t),!1;return t(r),!0}forEach(e,t){this.#a(),super.forEach(e,t)}get(e){var n=this.#e,r=n.get(e);if(r===void 0)if(super.has(e))r=this.#i(0),n.set(e,r);else{t(this.#t);return}return t(r),super.get(e)}set(e,t){var n=this.#e,r=n.get(e),i=super.get(e),a=super.set(e,t),o=this.#t;if(r===void 0)r=this.#i(0),n.set(e,r),_(this.#n,super.size),c(o);else if(i!==t){c(r);var s=o.reactions===null?null:new Set(o.reactions);(s===null||!r.reactions?.every(e=>s.has(e)))&&c(o)}return a}delete(e){var t=this.#e,n=t.get(e),r=super.delete(e);return n!==void 0&&(t.delete(e),_(n,-1)),r&&(_(this.#n,super.size),c(this.#t)),r}clear(){if(super.size!==0){super.clear();var e=this.#e;_(this.#n,0);for(var t of e.values())_(t,-1);c(this.#t),e.clear()}}#a(){t(this.#t);var e=this.#e;if(this.#n.v!==e.size){for(var n of super.keys())if(!e.has(n)){var r=this.#i(0);e.set(n,r)}}for([,r]of this.#e)t(r)}keys(){return t(this.#t),super.keys()}values(){return this.#a(),super.values()}entries(){return this.#a(),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return t(this.#n),super.size}},y=g(`<span class="text-red-700 dark:text-red-400 text-xs"> </span>`),b=g(`<span class="text-xs"> </span>`);function x(e,n){h(n,!0);var c=u(),l=r(c),g=e=>{var t=y(),r=o(t,!0);s(t),p(e=>f(r,e),[()=>n.errors.get(n.key)]),d(e,t)},_=i(()=>n.errors.has(n.key)),v=e=>{var t=b();d(e,t)};m(l,e=>{t(_)?e(g):e(v,-1)}),d(e,c),a()}export{v as n,x as t};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import"./tTEyPFub.js";
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{n as e}from"./puscbPt7.js";var t={register:t=>e.post(`/auth/register`,t),status:()=>e.get(`/auth/status`),login:t=>e.post(`/auth/login`,t)};export{t};
|
||||
@@ -1 +0,0 @@
|
||||
var e=`data:image/png;base64,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`;export{e as t};
|
||||
@@ -1 +0,0 @@
|
||||
import{P as e}from"./BXe04aPf.js";var t=e({user:null,accessToken:null,status:`loading`}),n=()=>{t.status=`unauthenticated`};export{n,t};
|
||||
@@ -0,0 +1 @@
|
||||
import{L as e}from"./DxmhE1z1.js";import{t}from"./DZTG_XPZ.js";var n=e({user:null,status:`loading`}),r=()=>{localStorage.removeItem(`accessToken`),n.status=`unauthenticated`},i=()=>localStorage.getItem(`accessToken`),a=e=>{localStorage.setItem(`accessToken`,e)},o=`/api`,s=class extends Error{status;body;constructor(e,t){super(`API Error ${e}`),this.status=e,this.body=t}};async function c(e,n={}){let{auth:a=!0,headers:c,...u}=n,d={"Content-Type":`application/json`,...c},f=new Headers(d);if(a){let e=i();e&&f.append(`Authorization`,`Bearer ${e}`)}let p=await fetch(`${o}${e}`,{...u,headers:f});if(p.status===401&&(r(),t(`/login`)),!p.ok)throw new s(p.status,await l(p));if(p.status!==204)return p.json()}async function l(e){try{return await e.json()}catch{return null}}var u={get:(e,t)=>c(e,{...t,method:`GET`}),post:(e,t,n)=>c(e,{...n,method:`POST`,body:JSON.stringify(t)}),put:(e,t,n)=>c(e,{...n,method:`PUT`,body:JSON.stringify(t)}),delete:(e,t)=>c(e,{...t,method:`DELETE`})},d=`data:image/png;base64,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`;export{a,r as i,u as n,n as r,d as t};
|
||||
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DUhcgpvL.js","../chunks/BXe04aPf.js","../chunks/xihTtKlq.js","../assets/0.CHStj0oN.css","../nodes/1.Dh_qEDnK.js","../chunks/tTEyPFub.js","../nodes/2.C55SYr5i.js","../chunks/kaCwo2dy.js","../chunks/Bthvo3p_.js","../nodes/3.BZSqsgG4.js","../chunks/bT040zHf.js","../nodes/4.5uyrhTtI.js","../nodes/5.z-y4HE0j.js"])))=>i.map(i=>d[i]);
|
||||
import{C as e,D as t,F as n,G as r,H as i,I as a,L as o,M as s,N as c,O as l,T as u,V as d,_ as f,a as p,f as m,g as h,h as g,i as _,j as v,k as y,m as b,n as x,r as S,v as C,y as w}from"../chunks/BXe04aPf.js";import"../chunks/xihTtKlq.js";var T=`modulepreload`,E=function(e,t){return new URL(e,t).href},D={},O=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=E(t,n),t=s(t),t in D)return;D[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:T,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},k={},A=C(`<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>`),j=C(`<!> <!>`,1);function M(S,C){i(C,!0);let T=_(C,`components`,23,()=>[]),E=_(C,`data_0`,3,null),D=_(C,`data_1`,3,null),O=_(C,`data_2`,3,null);y(()=>C.stores.page.set(C.page)),l(()=>{C.stores,C.page,C.constructors,T(),C.form,E(),D(),O(),C.stores.page.notify()});let k=a(!1),M=a(!1),N=a(null);x(()=>{let t=C.stores.page.subscribe(()=>{e(k)&&(n(M,!0),u().then(()=>{n(N,document.title||`untitled page`,!0)}))});return n(k,!0),t});let P=o(()=>C.constructors[2]);var F=j(),I=s(F),L=t=>{let n=o(()=>C.constructors[0]);var r=f(),i=s(r);m(i,()=>e(n),(t,n)=>{p(n(t,{get data(){return E()},get form(){return C.form},get params(){return C.page.params},children:(t,n)=>{var r=f(),i=s(r),a=t=>{let n=o(()=>C.constructors[1]);var r=f(),i=s(r);m(i,()=>e(n),(t,n)=>{p(n(t,{get data(){return D()},get form(){return C.form},get params(){return C.page.params},children:(t,n)=>{var r=f(),i=s(r);m(i,()=>e(P),(e,t)=>{p(t(e,{get data(){return O()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),h(t,r)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),h(t,r)},c=t=>{let n=o(()=>C.constructors[1]);var r=f(),i=s(r);m(i,()=>e(n),(e,t)=>{p(t(e,{get data(){return D()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),h(t,r)};b(i,e=>{C.constructors[2]?e(a):e(c,-1)}),h(t,r)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),h(t,r)},R=t=>{let n=o(()=>C.constructors[0]);var r=f(),i=s(r);m(i,()=>e(n),(e,t)=>{p(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),h(t,r)};b(I,e=>{C.constructors[1]?e(L):e(R,-1)});var z=c(I,2),B=n=>{var i=A(),a=v(i),o=n=>{var r=w();t(()=>g(r,e(N))),h(n,r)};b(a,t=>{e(M)&&t(o)}),r(i),h(n,i)};b(z,t=>{e(k)&&t(B)}),h(S,F),d()}var N=S(M),P=[()=>O(()=>import(`../nodes/0.DUhcgpvL.js`),__vite__mapDeps([0,1,2,3]),import.meta.url),()=>O(()=>import(`../nodes/1.Dh_qEDnK.js`),__vite__mapDeps([4,1,5,2]),import.meta.url),()=>O(()=>import(`../nodes/2.C55SYr5i.js`),__vite__mapDeps([6,1,5,2,7,8]),import.meta.url),()=>O(()=>import(`../nodes/3.BZSqsgG4.js`),__vite__mapDeps([9,1,2,7,10]),import.meta.url),()=>O(()=>import(`../nodes/4.5uyrhTtI.js`),__vite__mapDeps([11,1,5,2,7,8,10]),import.meta.url),()=>O(()=>import(`../nodes/5.z-y4HE0j.js`),__vite__mapDeps([12,1,5,2,7,8,10]),import.meta.url)],F=[],I={"/(authenticated)":[3,[2]],"/(public)/login":[4],"/(public)/register":[5]},L={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},R=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.decode])),z=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.encode])),B=!1,V=(e,t)=>R[e](t),H=()=>O(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{V as decode,R as decoders,I as dictionary,z as encoders,H as get_error_template,B as hash,L as hooks,k as matchers,P as nodes,N as root,F as server_loads};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{n as e,s as t}from"../chunks/tTEyPFub.js";export{t as load_css,e as start};
|
||||
@@ -0,0 +1 @@
|
||||
import{n as e,s as t}from"../chunks/DZTG_XPZ.js";export{t as load_css,e as start};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,F as t,M as n,O as r,Z as i,_ as a,c as o,d as s,g as c,k as l,p as u,v as d}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var f=e({prerender:()=>!1,ssr:()=>!1}),p=`data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iMTNtbSIKICAgaGVpZ2h0PSIxM21tIgogICB2aWV3Qm94PSIwIDAgMTMgMTMiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzEiCiAgIGlua3NjYXBlOnZlcnNpb249IjEuNC40IChkY2FmM2U3ZDllLCAyMDI2LTA1LTA1KSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmF2aWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iLi4vYmFja2VuZC93ZWIvc3JjL2xpYi9hc3NldHMvbG9nby10eHQucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTYiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5NiIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9Im5hbWVkdmlldzEiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjMDAwMDAwIgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMjUiCiAgICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIwIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6em9vbT0iMS40NDMxODE4IgogICAgIGlua3NjYXBlOmN4PSIyODcuOTA1NTIiCiAgICAgaW5rc2NhcGU6Y3k9IjIxNC44MDMxNSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMSIgLz4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJDYWxxdWUgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjExMTFweDtmb250LWZhbWlseTpwaXhlbGFydDstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOnBpeGVsYXJ0O3dyaXRpbmctbW9kZTpsci10YjtkaXJlY3Rpb246bHRyO2ZpbGw6IzM3YWJjODtzdHJva2Utd2lkdGg6MC4yNjQ1ODMiCiAgICAgICB4PSIyLjc0OTk5OTUiCiAgICAgICB5PSIxMS41NDk5OTciCiAgICAgICBpZD0idGV4dDEiPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICBpZD0idHNwYW4xIgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6MTQuMTExMXB4O2ZvbnQtZmFtaWx5OidHb2h1Rm9udCAxMSBOZXJkIEZvbnQnOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246J0dvaHVGb250IDExIE5lcmQgRm9udCc7ZmlsbDojMGVhNWU5O2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjI2NDU4MyIKICAgICAgICAgeD0iMi43NDk5OTk1IgogICAgICAgICB5PSIxMS41NDk5OTciPmw8L3RzcGFuPjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=`,m=d(`<link rel="icon"/> <link rel="stylesheet" href="/assets/fontello/css/fontello.css"/>`,1);function h(e,d){var f=a();s(`12qhfyh`,e=>{var a=m(),s=t(a);i(2),l(()=>o(s,`href`,p)),r(()=>{n.title=`Lasssistanoque`}),c(e,a)});var h=t(f);u(h,()=>d.children),c(e,f)}export{h as component,f as universal};
|
||||
@@ -1 +0,0 @@
|
||||
import{D as e,K as t,M as n,W as r,_ as i,c as a,d as o,g as s,p as c,v as l}from"../chunks/BXe04aPf.js";import"../chunks/xihTtKlq.js";var u=t({prerender:()=>!1,ssr:()=>!1}),d=`data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!--%20Created%20with%20Inkscape%20(http://www.inkscape.org/)%20--%3e%3csvg%20width='80mm'%20height='80mm'%20viewBox='0%200%2080%2080'%20version='1.1'%20id='svg1'%20inkscape:version='1.4.4%20(dcaf3e7d9e,%202026-05-05)'%20sodipodi:docname='dessin.svg'%20xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'%20xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:svg='http://www.w3.org/2000/svg'%3e%3csodipodi:namedview%20id='namedview1'%20pagecolor='%23ffffff'%20bordercolor='%23000000'%20borderopacity='0.25'%20inkscape:showpageshadow='2'%20inkscape:pageopacity='0.0'%20inkscape:pagecheckerboard='0'%20inkscape:deskcolor='%23d1d1d1'%20inkscape:document-units='mm'%20inkscape:zoom='0.5'%20inkscape:cx='397'%20inkscape:cy='561'%20inkscape:window-width='2560'%20inkscape:window-height='1011'%20inkscape:window-x='0'%20inkscape:window-y='0'%20inkscape:window-maximized='1'%20inkscape:current-layer='layer1'%20inkscape:export-bgcolor='%23ffffff00'%20/%3e%3cdefs%20id='defs1'%20/%3e%3cg%20inkscape:label='Calque%201'%20inkscape:groupmode='layer'%20id='layer1'%3e%3ccircle%20style='fill:%23164450;stroke-width:0.265;stroke-dasharray:none'%20id='path1'%20cy='45.644962'%20cx='23.643471'%20r='20'%20/%3e%3ccircle%20style='fill:%23216778;stroke-width:0.264583'%20id='path1-3-1-6'%20cx='34.202797'%20cy='41.673168'%20r='17.5'%20/%3e%3ccircle%20style='fill:%232c89a0;stroke-width:0.264583'%20id='path1-3'%20cx='45.844456'%20cy='38.072063'%20r='15'%20/%3e%3ccircle%20style='fill:%2337abc8;stroke-width:0.264583'%20id='path1-3-1-3'%20cx='56.873432'%20cy='34.070667'%20r='12.5'%20/%3e%3ccircle%20style='fill:%235fbcd3;stroke-width:0.264583'%20id='path1-3-1'%20cx='65.639908'%20cy='30.484972'%20r='10'%20/%3e%3c/g%3e%3c/svg%3e`,f=l(`<link rel="icon"/> <link rel="stylesheet" href="/assets/fontello/css/fontello.css"/>`,1);function p(t,l){var u=i();o(`12qhfyh`,t=>{var i=f(),o=n(i);r(2),e(()=>a(o,`href`,d)),s(t,i)});var p=n(u);c(p,()=>l.children),s(t,u)}export{p as component,u as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{F as e,I as t,K as n,P as r,Q as i,g as a,h as o,k as s,q as c,v as l}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";import{t as u}from"../chunks/BJ9updZG.js";var d=l(`<h1> </h1> <p> </p>`,1);function f(l,f){c(f,!0);var p=d(),m=e(p),h=r(m,!0);i(m);var g=t(m,2),_=r(g,!0);i(g),s(()=>{o(h,u.status),o(_,u.error?.message)}),a(l,p),n()}export{f as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{D as e,G as t,H as n,M as r,N as i,V as a,g as o,h as s,j as c,v as l}from"../chunks/BXe04aPf.js";import{a as u,r as d}from"../chunks/tTEyPFub.js";import"../chunks/xihTtKlq.js";var f={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};d.updated.check;var p=f,m=l(`<h1> </h1> <p> </p>`,1);function h(l,u){n(u,!0);var d=m(),f=r(d),h=c(f,!0);t(f);var g=i(f,2),_=c(g,!0);t(g),e(()=>{s(h,p.status),s(_,p.error?.message)}),o(l,d),a()}export{h as component};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Base de connaissance`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Mémoire`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Modèles`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Skills`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Outils`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Utilisateurs`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Tâches`}}var a=n(`<div>Tâches</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{F as e,I as t,K as n,L as r,P as i,Q as a,S as o,U as s,Z as c,b as l,c as u,g as d,k as f,m as p,o as m,q as h,s as g,v as _,x as v}from"../chunks/DxmhE1z1.js";import{t as y}from"../chunks/DZTG_XPZ.js";import"../chunks/xihTtKlq.js";import{a as b,r as x,t as S}from"../chunks/puscbPt7.js";import{t as C}from"../chunks/Nqp1gr6g.js";var w=_(`<form><div class="flex"><label for="email" class="block mb-2 flex-1">Email</label> <a href="/recover-password" class="text-xs">Mot de passe oublié ?</a></div> <div class="flex flex-row"><input type="text" class="textinput mr-1"/> <button class="bt" title="page suivante"><i class="icon-right-big"></i></button></div></form> <div class="my-4 text-xs"><a href="/register">Pas encore de compte ? Incrivez-vous.</a></div>`,1),T=_(`<form><div class="flex"><label for="email" class="block mb-2 flex-1">Mot de passe</label></div> <div class="flex flex-row"><input type="password" class="textinput mr-1"/> <button class="bt">Entrer</button></div> <a href="/login" class="text-xs">← Retour</a></form>`),E=_(`<div class="h-full w-full flex items-center public"><div class="m-auto w-96 max-w-full p-4"><img class="h-10 mb-4" alt="logo"/> <h1>Identifiez-vous ...</h1> <!> <hr class="my-4"/> <div class="grid grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-4"><button class="bt p-5 text-center" title="Connexion avec Google"><i class="icon-google"></i></button> <button class="bt p-5 text-center" title="Connexion avec Facebook"><i class="icon-facebook"></i></button> <button class="bt p-5 text-center" title="Connexion avec Github"><i class="icon-github"></i></button> <button class="bt p-5 text-center" title="Connexion avec Apple"><i class="icon-apple"></i></button></div></div></div>`);function D(l,_){h(_,!0);let D=r({email:``,password:``,validemail:!1}),O=()=>{D.validemail=!0},k=e=>{e.preventDefault(),C.login(D).then(e=>{x.user=e.user,b(e.accessToken),y(`/`)}).catch(e=>{console.log(e)})};var A=E(),j=i(A),M=i(j),N=t(M,4),P=n=>{var r=w(),l=e(r),u=t(i(l),2),f=i(u);g(f),s(f,!0),c(2),a(u),a(l),c(2),o(`submit`,l,O),m(f,()=>D.email,e=>D.email=e),d(n,r)},F=e=>{var n=T(),r=t(i(n),2),l=i(r);g(l),s(l,!0),c(2),a(r);var u=t(r,2);a(n),o(`submit`,n,k),m(l,()=>D.password,e=>D.password=e),v(`click`,u,()=>{D.validemail=!1}),d(e,n)};p(N,e=>{D.validemail?e(F,-1):e(P)}),c(4),a(j),a(A),f(()=>u(M,`src`,S)),d(l,A),n()}l([`click`]);export{D as component};
|
||||
@@ -0,0 +1 @@
|
||||
import{I as e,K as t,L as n,P as r,Q as i,S as a,U as o,b as s,c,g as l,k as u,o as d,q as f,s as p,v as m,x as h}from"../chunks/DxmhE1z1.js";import{t as g}from"../chunks/DZTG_XPZ.js";import"../chunks/xihTtKlq.js";import{t as _}from"../chunks/puscbPt7.js";import{n as v,t as y}from"../chunks/BT9KdPme.js";import{t as b}from"../chunks/Nqp1gr6g.js";var x=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;function S(e){return x.test(e)}var C=m(`<div class="h-full w-full flex items-center public"><div class="m-auto w-96 max-w-full p-4"><img class="h-10 mb-4" alt="logo"/> <h1>Inscription</h1> <form><label for="email" class="block my-1 flex-1">Email</label> <input id="email" type="text" class="textinput"/> <!> <label for="firstname" class="block my-1 flex-1">Prénom</label> <input id="firstname" type="text" class="textinput"/> <!> <label for="lastname" class="block my-1 flex-1">Nom</label> <input id="lastname" type="text" class="textinput"/> <!> <label for="password" class="block my-1 flex-1">Mot de passe</label> <input id="password" type="password" class="textinput"/> <!> <label for="verifpassword" class="block my-1 flex-1">Vérification du mot de passe</label> <input id="verifpassword" type="password" class="textinput"/> <!> <button class="bt my-2 w-full ">Enregistrer</button> <!></form></div></div>`);function w(s,m){f(m,!0);let x=new v,w=n({email:``,firstname:``,lastname:``,password:``,verifPassword:``}),T=e=>{if(e.preventDefault(),x.clear(),S(w.email)||x.set(`email`,`Adresse email invalide !`),w.password!==w.verifPassword&&x.set(`verifPassword`,`Les mots de pass ne correspondent pas.`),x.size==0){let e={method:`password`,email:w.email,firstname:w.firstname,lastname:w.lastname,password:w.password};b.register(e).then(()=>{g(`/`)}).catch(e=>{x.set(`submit`,`Erreur: `+e)})}};var E=C(),D=r(E),O=r(D),k=e(O,4),A=e(r(k),2);p(A),o(A,!0);var j=e(A,2);y(j,{key:`email`,get errors(){return x}});var M=e(j,4);p(M);var N=e(M,2);y(N,{key:`firstname`,get errors(){return x}});var P=e(N,4);p(P);var F=e(P,2);y(F,{key:`lastname`,get errors(){return x}});var I=e(F,4);p(I);var L=e(I,2);y(L,{key:`password`,get errors(){return x}});var R=e(L,4);p(R);var z=e(R,2);y(z,{key:`verifPassword`,get errors(){return x}});var B=e(z,4);y(B,{key:`submit`,get errors(){return x}}),i(k),i(D),i(E),u(()=>c(O,`src`,_)),a(`submit`,k,T),h(`change`,k,()=>{x.clear()}),d(A,()=>w.email,e=>w.email=e),d(M,()=>w.firstname,e=>w.firstname=e),d(P,()=>w.lastname,e=>w.lastname=e),d(I,()=>w.password,e=>w.password=e),d(R,()=>w.verifPassword,e=>w.verifPassword=e),l(s,E),t()}s([`change`]);export{w as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{H as e,K as t,M as n,O as r,V as i,_ as a,g as o,p as s}from"../chunks/BXe04aPf.js";import{t as c}from"../chunks/tTEyPFub.js";import"../chunks/xihTtKlq.js";import{t as l}from"../chunks/kaCwo2dy.js";import"../chunks/Bthvo3p_.js";var u=t({});function d(t,u){e(u,!0),r(()=>{l.status==`unauthenticated`&&c(`/login`)});var d=a(),f=n(d);s(f,()=>u.children),o(t,d),i()}export{d as component,u as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,A as t,F as n,I as r,K as i,L as a,N as o,P as s,Q as c,S as l,b as u,c as d,g as f,h as p,i as m,k as h,l as g,m as _,n as v,p as y,q as b,u as x,v as S,x as C}from"../chunks/DxmhE1z1.js";import{t as w}from"../chunks/DZTG_XPZ.js";import"../chunks/xihTtKlq.js";import{t as T}from"../chunks/BJ9updZG.js";import{i as E,n as D,r as O,t as k}from"../chunks/puscbPt7.js";var A={me:()=>D.get(`/user/me`)},j=e({load:()=>M}),M=async()=>({me:await A.me()}),N=a({sidebarDesktopOpen:!0,sidebarMobileOpen:!1,menuContentVisible:!0}),P=S(`<span class="ml-4"> </span>`),F=S(`<div class="my-2 block"><a class="p-2 w-full text-left menuitem block"><i></i> <!></a></div>`);function I(e,t){b(t,!0);let n=m(t,`label`,3,``),a=m(t,`icon`,3,``),o=m(t,`link`,3,``);var l=F(),u=s(l),v=s(u),y=r(v,2),S=e=>{var t=P(),r=s(t,!0);c(t),h(()=>p(r,n())),f(e,t)};_(y,e=>{N.menuContentVisible&&e(S)}),c(u),c(l),h(()=>{d(u,`href`,o()),g(v,1,x([a()]))}),f(e,l),i()}var L=S(`<div class="flex-1 p-3 font openonly"><img class="h-5" alt="logo"/></div>`),R=S(`<div class="p-4 flex-1 profile"><div>Fabien Masson</div> <div class="flex"><a href="/profile" class="text-xs flex-1">Modifier</a></div></div> <div class="p-2"><button class="w-full bt" title="Déconecter"><i class="icon-logout"></i></button></div>`,1),z=S(`<div class="flex flex-row italic mb-4"><!> <button id="hamburgerDesktop" title="Open menu"><i class="icon-menu pointer block p-2"></i></button> <button id="hamburgerMobile" title="Open menu"><i class="icon-menu pointer block p-2"></i></button></div> <div id="menu" class="flex-1 overflow-y-scroll"><!> <!> <!> <!> <!></div> <div id="profile" class="w-full flex flex-row items-center border-t border-stone-200 dark:border-stone-800"><!></div>`,1);function B(e,t){b(t,!0);let a=()=>{E()};var o=z(),l=n(o),u=s(l),p=e=>{var t=L(),n=s(t);c(t),h(()=>d(n,`src`,k)),f(e,t)};_(u,e=>{N.menuContentVisible&&e(p)});var m=r(u,2),g=r(m,2);c(l);var v=r(l,2),y=s(v);I(y,{label:`Conversation`,icon:`icon-chat`,link:`/`});var x=r(y,2);I(x,{label:`Tâches`,icon:`icon-tasks`,link:`/tasks`});var S=r(x,2);I(S,{label:`Connaissances`,icon:`icon-graduation-cap`,link:`/kb`});var w=r(S,2);I(w,{label:`Historique`,icon:`icon-history`,link:`/history`});var T=r(w,2),D=e=>{I(e,{label:`Paramétrage`,icon:`icon-cog`,link:`/settings`})};_(T,e=>{O.user?.administrator&&e(D)}),c(v);var A=r(v,2),j=s(A),M=e=>{var t=R(),i=r(n(t),2),o=s(i);c(i),C(`click`,o,a),f(e,t)},P=e=>{I(e,{label:`User`,icon:`icon-user`,link:`/profile`})};_(j,e=>{N.menuContentVisible?e(M):e(P,-1)}),c(A),C(`click`,m,function(...e){t.handleMenuDesktop?.apply(this,e)}),C(`click`,g,function(...e){t.handleMenuMobile?.apply(this,e)}),f(e,o),i()}u([`click`]);var V=S(`<span><a title="retour"><i class="icon-left-big"></i></a></span>`),H=S(`<div id="outer"><div id="sidebar" class="flex flex-col"><!></div> <div id="main"><div class="flex flex-col h-screen "><div class="header"><h1 class="flex"><span class="flex-1"> </span> <!></h1></div> <div class="overflow-scroll flex-1 p-2"><!></div></div></div></div>`);function U(e,n){b(n,!0);let a=()=>{N.sidebarDesktopOpen=!N.sidebarDesktopOpen,N.sidebarDesktopOpen?setTimeout(()=>{N.menuContentVisible=N.sidebarDesktopOpen},200):N.menuContentVisible=N.sidebarDesktopOpen},u=()=>{N.sidebarMobileOpen=!N.sidebarMobileOpen,N.sidebarMobileOpen?setTimeout(()=>{N.menuContentVisible=N.sidebarMobileOpen},200):N.menuContentVisible=N.sidebarMobileOpen},m=()=>{N.menuContentVisible=window.innerWidth<640?N.sidebarMobileOpen:N.sidebarDesktopOpen};v(async()=>{m(),n.data.me?(O.user=n.data.me,O.status=`authenticated`):O.status=`unauthenticated`}),t(()=>{O.status==`unauthenticated`&&w(`/login`)});var S=H();l(`resize`,o,m);var C=s(S);B(s(C),{handleMenuDesktop:a,handleMenuMobile:u}),c(C);var E=r(C,2),D=s(E),k=s(D),A=s(k),j=s(A),M=s(j,!0);c(j);var P=r(j,2),F=e=>{var t=V(),n=s(t);c(t),h(()=>d(n,`href`,T.data.back)),f(e,t)};_(P,e=>{T.data.back&&e(F)}),c(A),c(k);var I=r(k,2),L=s(I);y(L,()=>n.children),c(I),c(D),c(E),c(S),h(()=>{g(S,1,x([N.sidebarDesktopOpen?`desktopMenuOpen`:`desktopMenuClosed`,N.sidebarMobileOpen?`mobileMenuOpen`:`mobileMenuClosed`])),p(M,T.data.title)}),f(e,S),i()}export{U as component,j as universal};
|
||||
@@ -0,0 +1,6 @@
|
||||
import{$ as e,Z as t,g as n,y as r}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var i=e({load:()=>a});function a(){return{title:`Conversation`}}function o(e){t();var i=r(`Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?`);n(e,i)}export{o as component,i as universal};
|
||||
@@ -1 +0,0 @@
|
||||
import{A as e,D as t,G as n,H as r,M as i,N as a,P as o,S as s,V as c,W as l,b as u,c as d,g as f,h as p,i as m,j as h,l as g,m as _,n as v,u as y,v as b,x}from"../chunks/BXe04aPf.js";import"../chunks/xihTtKlq.js";import{n as S}from"../chunks/kaCwo2dy.js";import{t as C}from"../chunks/bT040zHf.js";var w=o({sidebarDesktopOpen:!0,sidebarMobileOpen:!1,menuContentVisible:!0}),T=b(`<span class="ml-4"> </span>`),E=b(`<div class="p-2" tabindex="0" role="button"><i></i> <!></div>`);function D(e,i){r(i,!0);let o=m(i,`label`,3,``),s=m(i,`icon`,3,``);var l=E(),u=h(l),d=a(u,2),v=e=>{var r=T(),i=h(r,!0);n(r),t(()=>p(i,o())),f(e,r)};_(d,e=>{w.menuContentVisible&&e(v)}),n(l),t(()=>g(u,1,y([s()]))),f(e,l),c()}var O=b(`<div class="flex-1 p-3 font openonly"><img class="w-24"/></div>`),k=b(`<div class="p-2 flex-1 "><div>Fabien Masson</div> <div class="flex"><a href="#" class="text-xs flex-1">Modifier</a></div></div> <div class="p-2"><button class="w-full bt"><i class="icon-logout"></i></button></div>`,1),A=b(`<div class="flex flex-row italic mb-4"><!> <i id="hamburgerDesktop" class="icon-menu pointer block p-2" tabindex="0" role="button"></i> <i id="hamburgerMobile" class="icon-menu pointer block p-2" tabindex="0" role="button"></i></div> <div id="menu" class="flex-1 overflow-y-scroll"><!> <!> <!> <!></div> <div id="profile" class="w-full flex flex-row items-center border-t border-stone-200 dark:border-stone-800"><!></div>`,1);function j(e,o){r(o,!0);let s=()=>{S()};var l=A(),u=i(l),p=h(u),m=e=>{var r=O(),i=h(r);n(r),t(()=>d(i,`src`,C)),f(e,r)};_(p,e=>{w.menuContentVisible&&e(m)});var g=a(p,2),v=a(g,2);n(u);var y=a(u,2),b=h(y);D(b,{label:`Conversation`,icon:`icon-chat`});var T=a(b,2);D(T,{label:`Tâches`,icon:`icon-tasks`});var E=a(T,2);D(E,{label:`Historique`,icon:`icon-history`}),D(a(E,2),{label:`Paramétrage`,icon:`icon-cog`}),n(y);var j=a(y,2),M=h(j),N=e=>{var t=k(),r=a(i(t),2),o=h(r);n(r),x(`click`,o,s),f(e,t)},P=e=>{D(e,{label:`User`,icon:`icon-user`})};_(M,e=>{w.menuContentVisible?e(N):e(P,-1)}),n(j),x(`click`,g,function(...e){o.handleMenuDesktop?.apply(this,e)}),x(`click`,v,function(...e){o.handleMenuMobile?.apply(this,e)}),f(e,l),c()}u([`click`]);var M=b(`<div id="outer"><div id="sidebar" class="flex flex-col"><!></div> <div id="main"><div id="content">Contenu</div></div></div>`);function N(i,a){r(a,!0);let o=()=>{w.sidebarDesktopOpen=!w.sidebarDesktopOpen,w.sidebarDesktopOpen?setTimeout(()=>{w.menuContentVisible=w.sidebarDesktopOpen},200):w.menuContentVisible=w.sidebarDesktopOpen},u=()=>{w.sidebarMobileOpen=!w.sidebarMobileOpen,w.sidebarMobileOpen?setTimeout(()=>{w.menuContentVisible=w.sidebarMobileOpen},200):w.menuContentVisible=w.sidebarMobileOpen},d=()=>{w.menuContentVisible=window.innerWidth<640?w.sidebarMobileOpen:w.sidebarDesktopOpen};v(()=>{d()});var p=M();s(`resize`,e,d);var m=h(p);j(h(m),{handleMenuDesktop:o,handleMenuMobile:u}),n(m),l(2),n(p),t(()=>g(p,1,y([w.sidebarDesktopOpen?`desktopMenuOpen`:`desktopMenuClosed`,w.sidebarMobileOpen?`mobileMenuOpen`:`mobileMenuClosed`]))),f(i,p),c()}export{N as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{D as e,G as t,H as n,M as r,N as i,P as a,R as o,S as s,V as c,W as l,b as u,c as d,g as f,j as p,m,o as h,s as g,v as _,x as v}from"../chunks/BXe04aPf.js";import{t as y}from"../chunks/tTEyPFub.js";import"../chunks/xihTtKlq.js";import{t as b}from"../chunks/kaCwo2dy.js";import"../chunks/Bthvo3p_.js";import{t as x}from"../chunks/bT040zHf.js";var S=_(`<form><div class="flex"><label for="email" class="block mb-2 flex-1">Email</label> <a href="#" class="text-xs">Mot de passe oublié ?</a></div> <div class="flex flex-row"><input type="text" class="textinput mr-1"/> <button class="bt"><i class="icon-right-big"></i></button></div></form> <div class="my-4 text-xs"><a href="/register">Pas encore de compte ? Incrivez-vous.</a></div>`,1),C=_(`<form><div class="flex"><label for="email" class="block mb-2 flex-1">Mot de passe</label></div> <div class="flex flex-row"><input type="text" class="textinput mr-1"/> <button class="bt">Entrer</button></div> <a href="/register" class="text-xs">← Retour</a></form>`),w=_(`<div class="h-full w-full flex items-center"><div class="m-auto min-w-64 p-4"><img class="h-8 mb-4"/> <h1>Préparerez votre galet ...</h1> <!> <hr class="my-4"/> <div class="grid grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-4"><button class="bt p-5 text-center"><i class="icon-google"></i></button> <button class="bt p-5 text-center"><i class="icon-facebook"></i></button> <button class="bt p-5 text-center"><i class="icon-github"></i></button> <button class="bt p-5 text-center"><i class="icon-apple"></i></button></div></div></div>`);function T(u,_){n(_,!0);let T=a({email:``,password:``,validemail:!1}),E=()=>{T.validemail=!0},D=e=>{e.preventDefault(),console.log(`formSubmitPass `+b.status),b.status=`authenticated`,console.log(`formSubmitPass après `+b.status),y(`/`)};var O=w(),k=p(O),A=p(k),j=i(A,4),M=e=>{var n=S(),a=r(n),c=i(p(a),2),u=p(c);g(u),o(u,!0),l(2),t(c),t(a),l(2),s(`submit`,a,E),h(u,()=>T.email,e=>T.email=e),f(e,n)},N=e=>{var n=C(),r=i(p(n),2),a=p(r);g(a),o(a,!0),l(2),t(r);var c=i(r,2);t(n),s(`submit`,n,D),h(a,()=>T.password,e=>T.password=e),v(`click`,c,()=>{T.validemail=!1}),f(e,n)};m(j,e=>{T.validemail?e(N,-1):e(M)}),l(4),t(k),t(O),e(()=>d(A,`src`,x)),f(u,O),c()}u([`click`]);export{T as component};
|
||||
@@ -0,0 +1,6 @@
|
||||
import{$ as e,Z as t,g as n,y as r}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var i=e({load:()=>a});function a(){return{title:`Historique`}}function o(e){t();var i=r(`Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur?`);n(e,i)}export{o as component,i as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var t=e({load:()=>n});function n(){return{title:`Base de connaissance`}}function r(e){}export{r as component,t as universal};
|
||||
@@ -1 +0,0 @@
|
||||
import{D as e,G as t,H as n,N as r,P as i,R as a,S as o,V as s,W as c,c as l,g as u,j as d,o as f,s as p,v as m}from"../chunks/BXe04aPf.js";import{t as h}from"../chunks/tTEyPFub.js";import"../chunks/xihTtKlq.js";import"../chunks/kaCwo2dy.js";import"../chunks/Bthvo3p_.js";import{t as g}from"../chunks/bT040zHf.js";var _=m(`<div class="h-full w-full flex items-center"><div class="m-auto min-w-64 p-4"><img class="h-8 mb-4"/> <h1>Inscription</h1> <form><label for="email" class="block my-1 flex-1">Email</label> <input id="email" type="text" class="textinput mb-4"/> <label for="firstname" class="block my-1 flex-1">Prénom</label> <input id="firstname" type="text" class="textinput mb-4"/> <label for="lastname" class="block my-1 flex-1">Nom</label> <input id="lastname" type="text" class="textinput mb-4"/> <label for="password" class="block my-1 flex-1">Mot de passe</label> <input id="password" type="password" class="textinput mb-4"/> <label for="verifpassword" class="block my-1 flex-1">Vérification du mot de passe</label> <input id="verifpassword" type="password" class="textinput mb-4"/> <button class="bt my-2">Enregistrer</button></form></div></div>`);function v(m,v){n(v,!0);let y=i({email:``,firstname:``,lastname:``,password:``,verifPassword:``,validation:!1}),b=()=>{y.validation=!0,h(`/`)};var x=_(),S=d(x),C=d(S),w=r(C,4),T=r(d(w),2);p(T),a(T,!0);var E=r(T,4);p(E);var D=r(E,4);p(D);var O=r(D,4);p(O);var k=r(O,4);p(k),c(2),t(w),t(S),t(x),e(()=>l(C,`src`,g)),o(`submit`,w,b),f(T,()=>y.email,e=>y.email=e),f(E,()=>y.firstname,e=>y.firstname=e),f(D,()=>y.lastname,e=>y.lastname=e),f(O,()=>y.password,e=>y.password=e),f(k,()=>y.verifPassword,e=>y.verifPassword=e),u(m,x),s()}export{v as component};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,F as t,I as n,K as r,L as i,P as a,Q as o,U as s,Z as c,g as l,o as u,q as d,s as f,v as p}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";import{n as m,t as h}from"../chunks/BT9KdPme.js";var g=e({load:()=>_});function _(){return{title:`Profil`}}var v=p(`<div class="mb-4 formgroup"><h2>Mon compte</h2> <label for="email" class="block my-1 flex-1">Email</label> <input id="email" type="text" class="textinput"/> <!> <div class="flex"><div class="flex-1 mr-2"><label for="firstname" class="block my-1 flex-1">Prénom</label> <input id="firstname" type="text" class="textinput"/> <!></div> <div class="flex-1 ml-2"><label for="lastname" class="block my-1 flex-1">Nom</label> <input id="lastname" type="text" class="textinput"/> <!></div></div> <div class="flex"><div class="flex-1 mr-2"><label for="theme" class="block my-1 flex-1">Thème</label> <input id="theme" type="text" class="textinput"/> <!></div> <div class="flex-1 ml-2"><label for="lang" class="block my-1 flex-1">Langue</label> <input id="lang" type="text" class="textinput"/> <!></div></div></div> <div class="mb-4 formgroup"><h2>Canaux de communication</h2></div>`,1);function y(e,p){d(p,!0);let g=i({email:``,firstname:``,lastname:``,lang:`en`,theme:`auto`}),_=new m;var y=v(),b=t(y),x=n(a(b),4);f(x),s(x,!0);var S=n(x,2);h(S,{key:`email`,get errors(){return _}});var C=n(S,2),w=a(C),T=n(a(w),2);f(T);var E=n(T,2);h(E,{key:`firstname`,get errors(){return _}}),o(w);var D=n(w,2),O=n(a(D),2);f(O);var k=n(O,2);h(k,{key:`lastname`,get errors(){return _}}),o(D),o(C);var A=n(C,2),j=a(A),M=n(a(j),2);f(M);var N=n(M,2);h(N,{key:`theme`,get errors(){return _}}),o(j);var P=n(j,2),F=n(a(P),2);f(F);var I=n(F,2);h(I,{key:`lang`,get errors(){return _}}),o(P),o(A),o(b),c(2),u(x,()=>g.email,e=>g.email=e),u(T,()=>g.firstname,e=>g.firstname=e),u(O,()=>g.lastname,e=>g.lastname=e),u(M,()=>g.theme,e=>g.theme=e),u(F,()=>g.lang,e=>g.lang=e),l(e,y),r()}export{y as component,g as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage`}}var a=n(`<div class="grid grid-cols-[repeat(auto-fit,minmax(250px,1fr))] gap-4"><a class="bt p-5 text-center" title="Modèles" href="/settings/models">Modèles <span class="ml-2 opacity-50 text-xs">mistral-medium-latest</span></a> <a class="bt p-5 text-center" title="Outils" href="/settings/tools">Outils <span class="ml-2 text-xs bg-red-900 text-red-300 rounded-lg p-1">12</span></a> <a class="bt p-5 text-center" title="Skills" href="/settings/skills">Skills <span class="ml-2 text-xs bg-red-900 text-red-300 rounded-lg p-1">3</span></a> <a class="bt p-5 text-center" title="Canaux de communication" href="/settings/channels">Canaux de communication <span class="ml-2 text-xs bg-red-900 text-red-300 rounded-lg p-1">12</span></a> <a class="bt p-5 text-center" title="Bases de connaissance" href="/settings/kb">Bases de connaissance</a> <a class="bt p-5 text-center" title="Agents" href="/settings/agents">Agents</a> <a class="bt p-5 text-center" title="Mémoire" href="/settings/memory">Mémoire <span class="ml-2 opacity-50 text-xs">standard</span></a> <a class="bt p-5 text-center" title="Utilisateurs" href="/settings/users">Utilisateurs <span class="ml-2 text-xs bg-red-900 text-red-300 rounded-lg p-1">1</span></a></div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Agents`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -0,0 +1 @@
|
||||
import{$ as e,g as t,v as n}from"../chunks/DxmhE1z1.js";import"../chunks/xihTtKlq.js";var r=e({load:()=>i});function i(){return{title:`Paramétrage : Canaux de communication`,back:`/settings`}}var a=n(`<div>Modèles</div>`);function o(e){var n=a();t(e,n)}export{o as component,r as universal};
|
||||
@@ -1 +1 @@
|
||||
{"version":"1785917155183"}
|
||||
{"version":"1786123021130"}
|
||||
@@ -107,6 +107,12 @@
|
||||
"css": "logout",
|
||||
"code": 59399,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "555ef8c86832e686fef85f7af2eb7cde",
|
||||
"css": "left-big",
|
||||
"code": 59400,
|
||||
"src": "fontawesome"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
.icon-edit:before { content: '\e805'; } /* '' */
|
||||
.icon-right-big:before { content: '\e806'; } /* '' */
|
||||
.icon-logout:before { content: '\e807'; } /* '' */
|
||||
.icon-left-big:before { content: '\e808'; } /* '' */
|
||||
.icon-facebook:before { content: '\f09a'; } /* '' */
|
||||
.icon-tasks:before { content: '\f0ae'; } /* '' */
|
||||
.icon-menu:before { content: '\f0c9'; } /* '' */
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -7,6 +7,7 @@
|
||||
.icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
.icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('../font/fontello.eot?44639875');
|
||||
src: url('../font/fontello.eot?44639875#iefix') format('embedded-opentype'),
|
||||
url('../font/fontello.woff2?44639875') format('woff2'),
|
||||
url('../font/fontello.woff?44639875') format('woff'),
|
||||
url('../font/fontello.ttf?44639875') format('truetype'),
|
||||
url('../font/fontello.svg?44639875#fontello') format('svg');
|
||||
src: url('../font/fontello.eot?64785462');
|
||||
src: url('../font/fontello.eot?64785462#iefix') format('embedded-opentype'),
|
||||
url('../font/fontello.woff2?64785462') format('woff2'),
|
||||
url('../font/fontello.woff?64785462') format('woff'),
|
||||
url('../font/fontello.ttf?64785462') format('truetype'),
|
||||
url('../font/fontello.svg?64785462#fontello') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('../font/fontello.svg?44639875#fontello') format('svg');
|
||||
src: url('../font/fontello.svg?64785462#fontello') format('svg');
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -62,6 +62,7 @@
|
||||
.icon-edit:before { content: '\e805'; } /* '' */
|
||||
.icon-right-big:before { content: '\e806'; } /* '' */
|
||||
.icon-logout:before { content: '\e807'; } /* '' */
|
||||
.icon-left-big:before { content: '\e808'; } /* '' */
|
||||
.icon-facebook:before { content: '\f09a'; } /* '' */
|
||||
.icon-tasks:before { content: '\f0ae'; } /* '' */
|
||||
.icon-menu:before { content: '\f0c9'; } /* '' */
|
||||
|
||||
@@ -146,11 +146,11 @@
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('./font/fontello.eot?35012786');
|
||||
src: url('./font/fontello.eot?35012786#iefix') format('embedded-opentype'),
|
||||
url('./font/fontello.woff?35012786') format('woff'),
|
||||
url('./font/fontello.ttf?35012786') format('truetype'),
|
||||
url('./font/fontello.svg?35012786#fontello') format('svg');
|
||||
src: url('./font/fontello.eot?72761720');
|
||||
src: url('./font/fontello.eot?72761720#iefix') format('embedded-opentype'),
|
||||
url('./font/fontello.woff?72761720') format('woff'),
|
||||
url('./font/fontello.ttf?72761720') format('truetype'),
|
||||
url('./font/fontello.svg?72761720#fontello') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@@ -239,6 +239,9 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span3" title="Code: 0xe808">
|
||||
<i class="demo-icon icon-left-big"></i> <span class="i-name">icon-left-big</span><span class="i-code">0xe808</span>
|
||||
</div>
|
||||
<div class="span3" title="Code: 0xf09a">
|
||||
<i class="demo-icon icon-facebook"></i> <span class="i-name">icon-facebook</span><span class="i-code">0xf09a</span>
|
||||
</div>
|
||||
@@ -248,11 +251,11 @@
|
||||
<div class="span3" title="Code: 0xf0c9">
|
||||
<i class="demo-icon icon-menu"></i> <span class="i-name">icon-menu</span><span class="i-code">0xf0c9</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span3" title="Code: 0xf113">
|
||||
<i class="demo-icon icon-github"></i> <span class="i-name">icon-github</span><span class="i-code">0xf113</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span3" title="Code: 0xf179">
|
||||
<i class="demo-icon icon-apple"></i> <span class="i-name">icon-apple</span><span class="i-code">0xf179</span>
|
||||
</div>
|
||||
@@ -262,11 +265,11 @@
|
||||
<div class="span3" title="Code: 0xf1a0">
|
||||
<i class="demo-icon icon-google"></i> <span class="i-name">icon-google</span><span class="i-code">0xf1a0</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span3" title="Code: 0xf1d8">
|
||||
<i class="demo-icon icon-paper-plane"></i> <span class="i-name">icon-paper-plane</span><span class="i-code">0xf1d8</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span3" title="Code: 0xf1da">
|
||||
<i class="demo-icon icon-history"></i> <span class="i-name">icon-history</span><span class="i-code">0xf1da</span>
|
||||
</div>
|
||||
|
||||
Binary file not shown.
@@ -22,6 +22,8 @@
|
||||
|
||||
<glyph glyph-name="logout" unicode="" d="M357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-26t-27-64v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="left-big" unicode="" d="M857 350v-71q0-30-18-51t-47-21h-393l164-164q21-20 21-50t-21-50l-42-43q-21-20-51-20-29 0-50 20l-364 364q-20 21-20 50 0 29 20 51l364 363q21 21 50 21 29 0 51-21l42-41q21-22 21-51t-21-51l-164-164h393q29 0 47-20t18-51z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="facebook" unicode="" d="M535 843v-147h-87q-48 0-65-20t-17-60v-106h164l-22-165h-142v-424h-171v424h-142v165h142v122q0 104 58 161t155 57q82 0 127-7z" horiz-adv-x="571.4" />
|
||||
|
||||
<glyph glyph-name="tasks" unicode="" d="M571 64h358v72h-358v-72z m-214 286h572v71h-572v-71z m357 286h215v71h-215v-71z m286-465v-142q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v142q0 15 11 26t25 10h928q15 0 25-10t11-26z m0 286v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v143q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 286v-143q0-14-11-25t-25-11h-928q-15 0-25 11t-11 25v143q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
|
||||
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 8.1 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,28 +4,28 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="text-scale" content="scale" />
|
||||
<link href="/_app/immutable/entry/start.BDBpcwWA.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/chunks/tTEyPFub.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/chunks/BXe04aPf.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/entry/app.3rrbglG1.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/entry/start.DIAl6VsA.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/chunks/DZTG_XPZ.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/chunks/DxmhE1z1.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/entry/app.ByOsvHj7.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/chunks/xihTtKlq.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/nodes/0.DUhcgpvL.js" rel="modulepreload">
|
||||
<link href="/_app/immutable/nodes/0.Bz_yxCPk.js" rel="modulepreload">
|
||||
|
||||
<link href="/_app/immutable/assets/0.CHStj0oN.css" rel="stylesheet">
|
||||
<link href="/_app/immutable/assets/0.tR7PeoVK.css" rel="stylesheet">
|
||||
</head>
|
||||
<body data-sveltekit-preload-data="hover">
|
||||
<div style="display: contents">
|
||||
<script>
|
||||
{
|
||||
__sveltekit_1tkqncq = {
|
||||
__sveltekit_vshol8 = {
|
||||
base: ""
|
||||
};
|
||||
|
||||
const element = document.currentScript.parentElement;
|
||||
|
||||
Promise.all([
|
||||
import("/_app/immutable/entry/start.BDBpcwWA.js"),
|
||||
import("/_app/immutable/entry/app.3rrbglG1.js")
|
||||
import("/_app/immutable/entry/start.DIAl6VsA.js"),
|
||||
import("/_app/immutable/entry/app.ByOsvHj7.js")
|
||||
]).then(([kit, app]) => {
|
||||
kit.start(app, element);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"log"
|
||||
"net/url"
|
||||
"time"
|
||||
)
|
||||
|
||||
const bucketName = "lassistanoque"
|
||||
|
||||
type StorageProvider interface {
|
||||
EnsureBucket(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
) error
|
||||
PutObject(
|
||||
ctx context.Context,
|
||||
reader io.Reader,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
contentType string,
|
||||
) error
|
||||
GetObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (io.ReadCloser, error)
|
||||
DeleteObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) error
|
||||
ExistsObject(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (bool, error)
|
||||
GetPresignedURL(
|
||||
ctx context.Context,
|
||||
bucketName string,
|
||||
objectName string,
|
||||
filePath string,
|
||||
Expiry time.Time,
|
||||
) (*url.URL, error)
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
provider StorageProvider
|
||||
}
|
||||
|
||||
func NewService(provider StorageProvider) *Service {
|
||||
err := provider.EnsureBucket(
|
||||
context.Background(),
|
||||
bucketName,
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatal("error creating bucket", err)
|
||||
}
|
||||
return &Service{provider}
|
||||
}
|
||||
|
||||
func (s *Service) PutObject(
|
||||
ctx context.Context,
|
||||
reader io.Reader,
|
||||
objectName string,
|
||||
filePath string,
|
||||
contentType string,
|
||||
) error {
|
||||
return s.provider.PutObject(ctx, reader, bucketName, objectName, filePath, contentType)
|
||||
}
|
||||
|
||||
func (s *Service) GetObject(
|
||||
ctx context.Context,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (io.ReadCloser, error) {
|
||||
return s.provider.GetObject(ctx, bucketName, objectName, filePath)
|
||||
}
|
||||
|
||||
func (s *Service) DeleteObject(
|
||||
ctx context.Context,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) error {
|
||||
return s.provider.DeleteObject(ctx, bucketName, objectName, filePath)
|
||||
}
|
||||
|
||||
func (s *Service) ExistsObject(
|
||||
ctx context.Context,
|
||||
objectName string,
|
||||
filePath string,
|
||||
) (bool, error) {
|
||||
return s.provider.ExistsObject(ctx, bucketName, objectName, filePath)
|
||||
}
|
||||
|
||||
func (s *Service) GetPresignedURL(
|
||||
ctx context.Context,
|
||||
objectName string,
|
||||
filePath string,
|
||||
Expiry time.Time,
|
||||
) (*url.URL, error) {
|
||||
return s.provider.GetPresignedURL(ctx, bucketName, objectName, filePath, Expiry)
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
package user
|
||||
|
||||
import "trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"trankilou.fr/lassistanoque/backend/internal/domain"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
repo domain.UserRepository
|
||||
@@ -13,5 +17,12 @@ func NewService(repo domain.UserRepository) *Service {
|
||||
}
|
||||
|
||||
func (s *Service) GetUser(id string) (*domain.User, error) {
|
||||
return s.repo.FindUser(id)
|
||||
user, err := s.repo.FindUser(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !user.Enabled {
|
||||
return nil, fmt.Errorf("unauthorized")
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,139 +0,0 @@
|
||||
# Application CONCIERGE
|
||||
|
||||
## Généralités
|
||||
|
||||
Nom d'application: lassistanoque
|
||||
|
||||
Objectif :
|
||||
Le but de l'application est d'être à la fois un outil de chat, mais surtout un lieu ou l'utilisateur peut créer des agents autonomes, à la fois dans un contexte professionnel et personnel.
|
||||
Fonctionnalité :
|
||||
- Espace de chat
|
||||
- Espace de visualisation/gestion des tâches (tâches longues ou tâches récurrente)
|
||||
- Paramétrage :
|
||||
- Sélection et paramétrage du/des modèles de LLM
|
||||
- Outils et serveurs MCP
|
||||
- Canaux de communication (en lecture et écriture)
|
||||
- Paramétrage de la mémoire
|
||||
|
||||
Cibles :
|
||||
- Petite entreprise
|
||||
- Particulier (en selfhosting)
|
||||
Il doit permettre parexemple à une PME d'automatiser les réponse à son adresse de contact, faire des études de marché, sourcer des produits, codes des applications, ...
|
||||
|
||||
## Technologies
|
||||
|
||||
Composants
|
||||
- backend : Go avec le framework Echo
|
||||
- Base de données : turso
|
||||
- frontend web : pure HTML 5 + tailwind + Typescript
|
||||
- frontend desktop : Wails
|
||||
|
||||
Style :
|
||||
- Style épuré, minimaliste
|
||||
- 2 thèmes fournis : light et dark
|
||||
- Tailwind
|
||||
|
||||
Authentification :
|
||||
- multi-utilisateur
|
||||
- connexion en Openid Connect ou bien par utilisateur/mot de passe
|
||||
|
||||
Développe :
|
||||
- le squelette du backend + app web
|
||||
- le squelette de l'application Wail
|
||||
- la gestion des utilisateurs
|
||||
- les thèmes
|
||||
|
||||
Ne développe pas tout de suite :
|
||||
- L'accès aux LLM
|
||||
|
||||
Simule :
|
||||
- L'accès au LLM
|
||||
- La création des tâches
|
||||
|
||||
Le projet doit être structuré selon les règles de l'art.
|
||||
Le code doit être maintenable par un développeur moyen.
|
||||
|
||||
Privilégie la création d'un seul exécutable pour le serveur (avec go embed pour embarquer l'app web), et un executable pour l'app desktop.
|
||||
Un mode d'installation docker-compose doit être proposée.
|
||||
|
||||
## Mode Web et mode Desktop
|
||||
|
||||
Le mode web et le mode desktop utilisent la même authentification.
|
||||
Le mode Desktop est juste la même applicatoin que l'application web, mais davantage intégrée à l'OS (system tray, notifications, accès par touche de raccourci, ...).
|
||||
Le mode Desktop se connecte soit à un serveur distant, soit lance lui-même un serveur lorsqu'aucun serveur distant n'est configuré. Dans le dernier cas, le serveur doit être tué à la fermeture de l'application.
|
||||
|
||||
## Tâches
|
||||
|
||||
les tâches sont créer lors de conversation de Chat.
|
||||
Par exemple si l'utilisateur demande : "Regarde tous les jours sur ebay si tu trouve des timbres rares, et enregistre les annonces intéressantes dans ma base Grist (table Timbres). Envoie-moi un email de compte-rendu de tes recherches"
|
||||
Les tâches peuvent aussi être modifié par Chat.
|
||||
Les tâche peuvent être répétitives ou ponctuelles, longues avec Harness ou non.
|
||||
|
||||
## Base de données
|
||||
|
||||
Table provider : Fournisseurs de LLM
|
||||
- id -> uuid
|
||||
- name -> string
|
||||
- provider -> string
|
||||
- key -> string
|
||||
- url -> string
|
||||
|
||||
Table models : Modèles LLM
|
||||
- id -> uuid
|
||||
- provider_uuid -> uuid
|
||||
- name -> string
|
||||
- modelname -> string
|
||||
- configuration -> json
|
||||
|
||||
Table system : Configuration system
|
||||
- chat_model_uuid -> uuid
|
||||
- default_lang -> string
|
||||
- port -> string
|
||||
- register_enabled -> bool
|
||||
- password_enabled -> bool
|
||||
- oidc_wellknown_url -> string
|
||||
- oidc_client_id -> string
|
||||
- oidc_client_secret -> string
|
||||
|
||||
Table users : Utilisateur
|
||||
- id -> uuid
|
||||
- name -> string
|
||||
- picture -> blob
|
||||
- ...
|
||||
|
||||
Table user_adresses : Adresse de contact de l'utilisateur
|
||||
- id -> uuid
|
||||
- user_uuid : uuid
|
||||
- type (email, telegram, whatsapp, ...) -> string
|
||||
|
||||
Table channels : Canaux de communication utilisés par l'agent
|
||||
- id -> uuid
|
||||
- name -> string
|
||||
- enabled -> boolean
|
||||
- type (email, telegram, whatsapp, ...) -> string
|
||||
- configuration -> json
|
||||
|
||||
Table tools : Paramétrage des outils
|
||||
- id -> uuid
|
||||
- name -> string
|
||||
- enabled -> boolean
|
||||
- configuration -> json
|
||||
|
||||
Table tasks : Tâches
|
||||
- id -> uuid
|
||||
- owner_uuid -> uuid
|
||||
- model_uuid -> uuid
|
||||
- name -> string
|
||||
- prompt -> string
|
||||
- cron -> string
|
||||
- status (scheduled, done, paused, error) -> string
|
||||
- next_datetime -> datetime
|
||||
|
||||
Table task_history : Historique de tâche
|
||||
- id -> uuid
|
||||
- task_uuid -> uuid
|
||||
- start_datetime -> datetime
|
||||
- enb_datetime -> datetime
|
||||
- prompt -> string
|
||||
- log -> string
|
||||
- response -> string
|
||||
Reference in New Issue
Block a user