# mobarrio/sanfra-movilidad architecture

> Architecture diagram of the GitHub repository mobarrio/sanfra-movilidad, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mobarrio/sanfra-movilidad
- Repository: https://github.com/mobarrio/sanfra-movilidad
- Video tour (about a minute): https://gitdiagram.com/mobarrio/sanfra-movilidad/video

## Overview

Vértice Playlist is a web application for managing personal video collections and publishing public playlists. Administrators sign in, create playlists and sections, add or import YouTube videos, and edit or reorder content; visitors browse public collections and play embedded videos. The Go server routes requests through authentication and handlers to SQLite. The README documents CSV bulk import, user/role management, and branding configuration. Some handler wiring is inferred from route registration and documented capabilities because the source excerpts are partial.

Main entry points: [`main.go`](https://github.com/mobarrio/sanfra-movilidad/blob/main/main.go) (HTTP server), [`handlers.go`](https://github.com/mobarrio/sanfra-movilidad/blob/main/handlers.go) (API handlers), [`store.go`](https://github.com/mobarrio/sanfra-movilidad/blob/main/store.go) (Store and setup), [`web/playlist.js`](https://github.com/mobarrio/sanfra-movilidad/blob/main/web/playlist.js) (Playlist viewer)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web interfaces"]
  node_admin["Admin console<br/>[admin.js]"]
  node_public["Public catalog<br/>[public.js]"]
  node_playlist_page["Playlist viewer<br/>[playlist.js]"]
end

subgraph group_server["Go application"]
  node_server["HTTP server<br/>[main.go]"]
  node_api_handlers["API handlers<br/>[handlers.go]"]
  node_models["Domain models<br/>[models.go]"]
  node_sanitizer["Description sanitizer<br/>[sanitize.go]"]
end

subgraph group_identity["Identity and access"]
  node_auth["JWT and RBAC<br/>[auth.go]"]
end

subgraph group_persistence["Persistent data"]
  node_store["Store and setup<br/>[store.go]"]
  node_sqlite[("SQLite database")]
end

node_admin_actor(("Administrator"))
node_visitor(("Visitor"))
node_youtube["YouTube embeds"]

node_admin_actor -->|"manages content"| node_admin
node_visitor -->|"browses playlists"| node_public
node_admin -->|"HTTP requests"| node_server
node_public -->|"fetches catalog"| node_server
node_playlist_page -->|"fetches playlist"| node_server
node_server -->|"dispatches routes"| node_api_handlers
node_server -->|"initializes store"| node_store
node_server -->|"serves admin page"| node_admin
node_server -->|"serves public page"| node_public
node_server -->|"serves playlist page"| node_playlist_page
node_api_handlers -->|"authenticates requests"| node_auth
node_api_handlers -->|"reads and writes"| node_store
node_auth -->|"checks identities"| node_store
node_store -->|"reads and writes"| node_sqlite
node_api_handlers -->|"sanitizes descriptions"| node_sanitizer
node_playlist_page -.->|"embeds videos"| node_youtube
node_api_handlers -->|"uses domain data"| node_models

click node_admin "https://github.com/mobarrio/sanfra-movilidad/blob/main/web/admin.js"
click node_public "https://github.com/mobarrio/sanfra-movilidad/blob/main/web/public.js"
click node_playlist_page "https://github.com/mobarrio/sanfra-movilidad/blob/main/web/playlist.js"
click node_server "https://github.com/mobarrio/sanfra-movilidad/blob/main/main.go"
click node_api_handlers "https://github.com/mobarrio/sanfra-movilidad/blob/main/handlers.go"
click node_auth "https://github.com/mobarrio/sanfra-movilidad/blob/main/auth.go"
click node_models "https://github.com/mobarrio/sanfra-movilidad/blob/main/models.go"
click node_sanitizer "https://github.com/mobarrio/sanfra-movilidad/blob/main/sanitize.go"
click node_store "https://github.com/mobarrio/sanfra-movilidad/blob/main/store.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_admin,node_public,node_playlist_page toneBlue
class node_server,node_api_handlers,node_models,node_sanitizer toneAmber
class node_auth toneMint
class node_store,node_sqlite toneRose
class node_admin_actor,node_visitor,node_youtube toneIndigo
```

## Components

### Web interfaces

- [Admin console](https://github.com/mobarrio/sanfra-movilidad/blob/main/web/admin.js): `web/admin.js`
- [Public catalog](https://github.com/mobarrio/sanfra-movilidad/blob/main/web/public.js): `web/public.js`
- [Playlist viewer](https://github.com/mobarrio/sanfra-movilidad/blob/main/web/playlist.js): `web/playlist.js`

### Go application

- [HTTP server](https://github.com/mobarrio/sanfra-movilidad/blob/main/main.go): `main.go`
- [API handlers](https://github.com/mobarrio/sanfra-movilidad/blob/main/handlers.go): `handlers.go`
- [Domain models](https://github.com/mobarrio/sanfra-movilidad/blob/main/models.go): `models.go`
- [Description sanitizer](https://github.com/mobarrio/sanfra-movilidad/blob/main/sanitize.go): `sanitize.go`

### Identity and access

- [JWT and RBAC](https://github.com/mobarrio/sanfra-movilidad/blob/main/auth.go): `auth.go`

### Persistent data

- [Store and setup](https://github.com/mobarrio/sanfra-movilidad/blob/main/store.go): `store.go`
- **SQLite database**

### Other components

- **Administrator**
- **Visitor**
- **YouTube embeds**

## Connections

- Administrator → Admin console: manages content
- Visitor → Public catalog: browses playlists
- Admin console → HTTP server: HTTP requests
- Public catalog → HTTP server: fetches catalog
- Playlist viewer → HTTP server: fetches playlist
- HTTP server → API handlers: dispatches routes
- HTTP server → Store and setup: initializes store
- HTTP server → Admin console: serves admin page
- HTTP server → Public catalog: serves public page
- HTTP server → Playlist viewer: serves playlist page
- API handlers → JWT and RBAC: authenticates requests
- API handlers → Store and setup: reads and writes
- JWT and RBAC → Store and setup: checks identities
- Store and setup → SQLite database: reads and writes
- API handlers → Description sanitizer: sanitizes descriptions
- Playlist viewer → YouTube embeds: embeds videos
- API handlers → Domain models: uses domain data
