{"id":51009114,"url":"https://github.com/uggla/lovebin","last_synced_at":"2026-06-21T00:30:58.317Z","repository":{"id":360269489,"uuid":"1249389268","full_name":"uggla/lovebin","owner":"uggla","description":"Petite page web pour présenter une action de ramassage des déchets","archived":false,"fork":false,"pushed_at":"2026-06-06T09:40:01.000Z","size":714,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T03:07:57.438Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://lovebin.uggla.fr","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uggla.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T16:41:58.000Z","updated_at":"2026-06-06T09:40:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/uggla/lovebin","commit_stats":null,"previous_names":["uggla/lovebin"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/uggla/lovebin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uggla%2Flovebin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uggla%2Flovebin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uggla%2Flovebin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uggla%2Flovebin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uggla","download_url":"https://codeload.github.com/uggla/lovebin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uggla%2Flovebin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34590213,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-21T00:30:58.211Z","updated_at":"2026-06-21T00:30:58.312Z","avatar_url":"https://github.com/uggla.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lovebin\n\nPetite page web pour présenter une action de ramassage des déchets et permettre aux visiteurs d'envoyer un cœur de soutien.\n\n## Stack\n\n- Frontend Vite + TypeScript, sans framework.\n- Backend Rust Axum + SQLx + SQLite embarqué.\n- Déploiement en 2 containers : `frontend` public et `backend` privé.\n- SQLite persisté dans `backend/data/hearts.db` sur l'hôte et monté dans `/data` côté conteneur.\n- Les cœurs acceptés sont stockés comme des événements datés.\n\n## Site\n\nLa page publique est prévue pour `https://lovebin.uggla.fr`.\n\n## Lancer avec Docker ou Podman\n\n```bash\ndocker compose up --build\n```\n\nOu selon l'environnement :\n\n```bash\npodman compose up --build\npodman-compose up --build\n```\n\nLa page est ensuite disponible sur :\n\n```text\nhttp://localhost:8080\n```\n\nLe backend n'est pas publié sur l'hôte. Le frontend sert les fichiers statiques et proxifie `/api/*` vers le service `backend` sur le réseau interne Compose.\n\nLa base SQLite est créée sur le filesystem local dans :\n\n```text\nbackend/data/hearts.db\n```\n\nEn production, ce chemin correspond à `/home/uggla/lovebin/backend/data/hearts.db`.\n\n## Développement local\n\nBackend :\n\n```bash\ncd backend\nDATABASE_URL=sqlite:data/hearts.db COOKIE_SECURE=false cargo run\n```\n\nFrontend :\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\nLe serveur Vite proxifie `/api` vers `http://127.0.0.1:3000`.\n\n## Configuration backend\n\nVariables d'environnement disponibles :\n\n```text\nDATABASE_URL=sqlite:/data/hearts.db\nBIND_ADDR=0.0.0.0:3000\nCOOKIE_NAME=cleanup_heart_vote\nCOOKIE_SECURE=true\nCOOKIE_SAME_SITE=Lax\nVOTE_WINDOW_SECONDS=172800\n```\n\nEn local HTTP, `COOKIE_SECURE=false` est nécessaire pour que le navigateur conserve le cookie. En production HTTPS, utiliser `COOKIE_SECURE=true`.\n\n## API\n\nLe compteur est calculé depuis l'historique des cœurs. Les anciennes données du compteur initial ne sont pas conservées par la migration vers ce modèle événementiel.\n\n```http\nGET /api/hearts\n```\n\n```json\n{\n  \"count\": 123,\n  \"already_voted\": false\n}\n```\n\n```http\nPOST /api/hearts\n```\n\nSuccès :\n\n```json\n{\n  \"count\": 124,\n  \"voted\": true\n}\n```\n\nDéjà voté :\n\n```json\n{\n  \"count\": 124,\n  \"voted\": false,\n  \"reason\": \"already_voted\",\n  \"retry_after_seconds\": 172800\n}\n```\n\n```http\nGET /api/hearts/history\n```\n\nRetourne les timestamps publics des cœurs acceptés, triés du plus ancien au plus récent :\n\n```json\n{\n  \"events\": [\n    \"2026-05-26T12:34:56.789Z\",\n    \"2026-05-26T13:10:22.123Z\"\n  ]\n}\n```\n\n## Photos futures\n\nLe frontend contient déjà la section :\n\n```html\n\u003csection id=\"photos\"\u003e\n  \u003ch2\u003eLes photos de la journée\u003c/h2\u003e\n\u003c/section\u003e\n```\n\nElle peut recevoir plus tard une galerie responsive ou un carrousel simple avec des images statiques.\n\nLes images actuelles sont servies depuis `frontend/public/photos/` et sont embarquées dans l'image frontend au build.\n\n## Licence\n\nCe projet est distribué sous licence Apache 2.0. Voir le fichier [LICENSE](LICENSE) pour le texte complet.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuggla%2Flovebin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuggla%2Flovebin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuggla%2Flovebin/lists"}