SOGOMS v1.0.3 - Admin UI, Cron, Config reload

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>
This commit is contained in:
2025-12-19 20:30:56 +01:00
parent a4694a10d1
commit 65da4efdad
76 changed files with 5305 additions and 80 deletions

View File

@@ -0,0 +1,41 @@
# Template: Réinitialisation de mot de passe
subject: "Réinitialisation de votre mot de passe Prokov"
body: |
Bonjour {{.Name}},
Vous avez demandé la réinitialisation de votre mot de passe.
Cliquez sur le lien ci-dessous pour créer un nouveau mot de passe :
{{.ResetURL}}
Ce lien expire dans {{.ExpiresIn}}.
Si vous n'êtes pas à l'origine de cette demande, ignorez cet email.
Cordialement,
L'équipe Prokov
body_html: |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
<h1 style="color: #2563eb;">Réinitialisation de mot de passe</h1>
<p>Bonjour <strong>{{.Name}}</strong>,</p>
<p>Vous avez demandé la réinitialisation de votre mot de passe.</p>
<p style="text-align: center; margin: 30px 0;">
<a href="{{.ResetURL}}" style="background-color: #2563eb; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">
Réinitialiser mon mot de passe
</a>
</p>
<p style="color: #666; font-size: 14px;">Ce lien expire dans {{.ExpiresIn}}.</p>
<p style="color: #666; font-size: 14px;">Si vous n'êtes pas à l'origine de cette demande, ignorez cet email.</p>
<hr style="border: none; border-top: 1px solid #eee; margin: 20px 0;">
<p style="color: #666; font-size: 14px;">Cordialement,<br>L'équipe Prokov</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,45 @@
# Template: Notification d'assignation de tâche
subject: "Nouvelle tâche : {{.TaskName}}"
body: |
Bonjour {{.Name}},
Une nouvelle tâche vous a été assignée :
Projet : {{.ProjectName}}
Tâche : {{.TaskName}}
{{if .Description}}Description : {{.Description}}{{end}}
{{if .DueDate}}Échéance : {{.DueDate}}{{end}}
Connectez-vous pour voir les détails.
Cordialement,
L'équipe Prokov
body_html: |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
<h1 style="color: #2563eb;">Nouvelle tâche assignée</h1>
<p>Bonjour <strong>{{.Name}}</strong>,</p>
<p>Une nouvelle tâche vous a été assignée :</p>
<div style="background-color: #f8fafc; border-left: 4px solid #2563eb; padding: 15px; margin: 20px 0;">
<p style="margin: 5px 0;"><strong>Projet :</strong> {{.ProjectName}}</p>
<p style="margin: 5px 0;"><strong>Tâche :</strong> {{.TaskName}}</p>
{{if .Description}}<p style="margin: 5px 0;"><strong>Description :</strong> {{.Description}}</p>{{end}}
{{if .DueDate}}<p style="margin: 5px 0;"><strong>Échéance :</strong> {{.DueDate}}</p>{{end}}
</div>
<p style="text-align: center; margin: 30px 0;">
<a href="{{.TaskURL}}" style="background-color: #2563eb; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">
Voir la tâche
</a>
</p>
<hr style="border: none; border-top: 1px solid #eee; margin: 20px 0;">
<p style="color: #666; font-size: 14px;">Cordialement,<br>L'équipe Prokov</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,67 @@
# Template: Récapitulatif des tâches du jour
subject: "Vos tâches du jour - {{.Date}}"
body: |
Bonjour {{.Name}},
Voici vos tâches prévues pour aujourd'hui ({{.Date}}) :
{{range .Tasks}}
- [{{.Status}}] {{.Name}}{{if .Project}} ({{.Project}}){{end}}{{if .DueTime}} - {{.DueTime}}{{end}}
{{end}}
{{if .TaskCount}}Vous avez {{.TaskCount}} tâche(s) à accomplir.{{end}}
Bonne journée !
Cordialement,
L'équipe Prokov
body_html: |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
<h1 style="color: #2563eb;">Vos tâches du jour</h1>
<p>Bonjour <strong>{{.Name}}</strong>,</p>
<p>Voici vos tâches prévues pour aujourd'hui ({{.Date}}) :</p>
<table style="width: 100%; border-collapse: collapse; margin: 20px 0;">
<thead>
<tr style="background-color: #f8fafc;">
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #e2e8f0;">Tâche</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #e2e8f0;">Projet</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #e2e8f0;">Statut</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #e2e8f0;">Heure</th>
</tr>
</thead>
<tbody>
{{range .Tasks}}
<tr>
<td style="padding: 12px; border-bottom: 1px solid #e2e8f0;">{{.Name}}</td>
<td style="padding: 12px; border-bottom: 1px solid #e2e8f0;">{{.Project}}</td>
<td style="padding: 12px; border-bottom: 1px solid #e2e8f0;">
<span style="background-color: {{.StatusColor}}; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">{{.Status}}</span>
</td>
<td style="padding: 12px; border-bottom: 1px solid #e2e8f0;">{{.DueTime}}</td>
</tr>
{{end}}
</tbody>
</table>
{{if .TaskCount}}
<p style="background-color: #eff6ff; padding: 15px; border-radius: 6px; text-align: center;">
<strong>{{.TaskCount}}</strong> tâche(s) à accomplir aujourd'hui
</p>
{{end}}
<p>Bonne journée !</p>
<hr style="border: none; border-top: 1px solid #eee; margin: 20px 0;">
<p style="color: #666; font-size: 14px;">Cordialement,<br>L'équipe Prokov</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,34 @@
# Template: Email de bienvenue
subject: "Bienvenue sur Prokov, {{.Name}} !"
body: |
Bonjour {{.Name}},
Bienvenue sur Prokov !
Votre compte a été créé avec succès.
Email: {{.Email}}
Vous pouvez maintenant vous connecter et commencer à gérer vos projets.
Cordialement,
L'équipe Prokov
body_html: |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
<h1 style="color: #2563eb;">Bienvenue sur Prokov !</h1>
<p>Bonjour <strong>{{.Name}}</strong>,</p>
<p>Votre compte a été créé avec succès.</p>
<p><strong>Email :</strong> {{.Email}}</p>
<p>Vous pouvez maintenant vous connecter et commencer à gérer vos projets.</p>
<hr style="border: none; border-top: 1px solid #eee; margin: 20px 0;">
<p style="color: #666; font-size: 14px;">Cordialement,<br>L'équipe Prokov</p>
</div>
</body>
</html>