Phase 13 : sogoms-cron
- Jobs planifiés avec schedule cron standard
- Types: query_email, http, service
- Actions: list, trigger, status
Phase 16 : Réorganisation config/apps/{app}/
- Tous les fichiers d'une app dans un seul dossier
- Migration prokov vers nouvelle structure
Phase 17 : sogoms-admin
- Interface web d'administration (Go templates + htmx)
- Auth sessions cookies signées HMAC-SHA256
- Rôles super_admin / app_admin avec permissions
Phase 19 : Création d'app via Admin UI
- Formulaire création app avec config DB/auth
- Bouton "Scanner la base" : introspection + schema.yaml
- Rechargement automatique sogoway via SIGHUP
Infrastructure :
- sogoctl : socket de contrôle /run/sogoctl.sock
- sogoway : reload config sur SIGHUP sans restart
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
256 lines
6.4 KiB
YAML
256 lines
6.4 KiB
YAML
app: prokov
|
|
tables:
|
|
project_tags:
|
|
columns:
|
|
project_id:
|
|
foreign: projects.id
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
tag_id:
|
|
foreign: tags.id
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
crud: []
|
|
primary:
|
|
- project_id
|
|
- tag_id
|
|
projects:
|
|
columns:
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
description:
|
|
default: "NULL"
|
|
length: 65535
|
|
type: text
|
|
id:
|
|
auto: true
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
name:
|
|
length: 100
|
|
required: true
|
|
type: string
|
|
parent_id:
|
|
default: "NULL"
|
|
foreign: projects.id
|
|
type: int
|
|
position:
|
|
default: "0"
|
|
type: int
|
|
updated_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
user_id:
|
|
filter: owner
|
|
foreign: users.id
|
|
required: true
|
|
type: int
|
|
crud:
|
|
- list
|
|
- show
|
|
- create
|
|
- update
|
|
- delete
|
|
statuses:
|
|
columns:
|
|
code:
|
|
required: true
|
|
type: int
|
|
color:
|
|
default: '''#6B7280'''
|
|
length: 7
|
|
type: string
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
id:
|
|
auto: true
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
name:
|
|
length: 50
|
|
required: true
|
|
type: string
|
|
position:
|
|
default: "0"
|
|
type: int
|
|
project_id:
|
|
default: "NULL"
|
|
type: int
|
|
user_id:
|
|
filter: owner
|
|
foreign: users.id
|
|
required: true
|
|
type: int
|
|
crud:
|
|
- list
|
|
- show
|
|
- create
|
|
- update
|
|
- delete
|
|
tags:
|
|
columns:
|
|
color:
|
|
default: '''#3B82F6'''
|
|
length: 7
|
|
type: string
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
id:
|
|
auto: true
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
name:
|
|
length: 50
|
|
required: true
|
|
type: string
|
|
unique: true
|
|
user_id:
|
|
filter: owner
|
|
foreign: users.id
|
|
required: true
|
|
type: int
|
|
unique: true
|
|
crud:
|
|
- list
|
|
- show
|
|
- create
|
|
- update
|
|
- delete
|
|
task_tags:
|
|
columns:
|
|
tag_id:
|
|
foreign: tags.id
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
task_id:
|
|
foreign: tasks.id
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
crud: []
|
|
primary:
|
|
- task_id
|
|
- tag_id
|
|
tasks:
|
|
columns:
|
|
billing:
|
|
default: "0.00"
|
|
type: float
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
date_end:
|
|
default: "NULL"
|
|
type: date
|
|
date_start:
|
|
default: "NULL"
|
|
type: date
|
|
description:
|
|
default: "NULL"
|
|
length: 65535
|
|
type: text
|
|
id:
|
|
auto: true
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
position:
|
|
default: "0"
|
|
type: int
|
|
priority:
|
|
default: "5"
|
|
type: int
|
|
project_id:
|
|
foreign: projects.id
|
|
required: true
|
|
type: int
|
|
status_id:
|
|
foreign: statuses.id
|
|
required: true
|
|
type: int
|
|
time_estimated:
|
|
default: "0"
|
|
type: int
|
|
time_spent:
|
|
default: "0"
|
|
type: int
|
|
title:
|
|
length: 255
|
|
required: true
|
|
type: string
|
|
updated_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
user_id:
|
|
filter: owner
|
|
foreign: users.id
|
|
required: true
|
|
type: int
|
|
crud:
|
|
- list
|
|
- show
|
|
- create
|
|
- update
|
|
- delete
|
|
users:
|
|
columns:
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
email:
|
|
length: 255
|
|
required: true
|
|
type: string
|
|
unique: true
|
|
id:
|
|
auto: true
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
name:
|
|
length: 100
|
|
required: true
|
|
type: string
|
|
password:
|
|
length: 255
|
|
required: true
|
|
type: string
|
|
role_id:
|
|
default: "1"
|
|
foreign: users_roles.id
|
|
required: true
|
|
type: int
|
|
updated_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
crud:
|
|
- list
|
|
- show
|
|
- create
|
|
- update
|
|
- delete
|
|
users_roles:
|
|
columns:
|
|
created_at:
|
|
default: current_timestamp()
|
|
type: datetime
|
|
id:
|
|
primary: true
|
|
required: true
|
|
type: int
|
|
name:
|
|
length: 50
|
|
required: true
|
|
type: string
|
|
crud: []
|
|
version: "1.0"
|