navigation

This commit is contained in:
2026-08-07 19:20:16 +02:00
parent 5810c4c94f
commit ff6ef46cd4
78 changed files with 681 additions and 282 deletions
@@ -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
}
+3 -2
View File
@@ -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()
}
+12 -12
View File
@@ -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
}
+20
View File
@@ -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)
}
+21 -7
View File
@@ -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,
}
}
+27
View File
@@ -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)
}
+7 -10
View File
@@ -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">&nbsp;</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
View File
@@ -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 = '&#xe805;&nbsp;'); }
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;&nbsp;'); }
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); }
@@ -18,6 +18,7 @@
.icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;&nbsp;'); }
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); }
+8 -7
View File
@@ -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">&#xe808;</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">&#xf09a;</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">&#xf0c9;</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">&#xf113;</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">&#xf179;</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">&#xf1a0;</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">&#xf1d8;</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">&#xf1da;</i> <span class="i-name">icon-history</span><span class="i-code">0xf1da</span>
</div>
@@ -22,6 +22,8 @@
<glyph glyph-name="logout" unicode="&#xe807;" 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="&#xe808;" 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="&#xf09a;" 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="&#xf0ae;" 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

+9 -9
View File
@@ -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);
});
+109
View File
@@ -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)
}
+13 -2
View File
@@ -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
}