### Example output of kind cluster setup script Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This is an example of the output you can expect when running the './bin/start-kind.sh' script. It shows the progression of tasks including CA creation, registry setup, kind cluster creation, ingress-nginx installation, and namespace setup for 'meet'. The output confirms the successful creation of a 'kind' cluster named 'visio' and the deployment status of associated pods. ```shell $ ./bin/start-kind.sh 0. Create ca The local CA is already installed in the system trust store! 👍 The local CA is already installed in the Firefox and/or Chrome/Chromium trust store! 👍 Created a new certificate valid for the following names 📜 - "127.0.0.1.nip.io" - "*.127.0.0.1.nip.io" Reminder: X.509 wildcards only go one level deep, so this won't match a.b.127.0.0.1.nip.io â„šī¸ The certificate is at "./127.0.0.1.nip.io+1.pem" and the key at "./127.0.0.1.nip.io+1-key.pem" ✅ It will expire on 23 March 2027 🗓 1. Create registry container unless it already exists 2. Create kind cluster with containerd registry config dir enabled Creating cluster "visio" ... ✓ Ensuring node image (kindest/node:v1.27.3) đŸ–ŧ ✓ Preparing nodes đŸ“Ļ ✓ Writing configuration 📜 ✓ Starting control-plane đŸ•šī¸ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 Set kubectl context to "kind-visio" You can now use your cluster with: kubectl cluster-info --context kind-visio Thanks for using kind! 😊 3. Add the registry config to the nodes 4. Connect the registry to the cluster network if not already connected 5. Document the local registry configmap/local-registry-hosting created Warning: resource configmaps/coredns is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically. configmap/coredns configured deployment.apps/coredns restarted 6. Install ingress-nginx namespace/ingress-nginx created serviceaccount/ingress-nginx created serviceaccount/ingress-nginx-admission created role.rbac.authorization.k8s.io/ingress-nginx created role.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io/ingress-nginx created clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io/ingress-nginx created rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created configmap/ingress-nginx-controller created service/ingress-nginx-controller created service/ingress-nginx-controller-admission created deployment.apps/ingress-nginx-controller created job.batch/ingress-nginx-admission-create created job.batch/ingress-nginx-admission-patch created ingressclass.networking.k8s.io/nginx created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created secret/mkcert created deployment.apps/ingress-nginx-controller patched 7. Setup namespace namespace/meet created Context "kind-visio" modified. secret/mkcert created $ kind get clusters visio $ kubectl -n ingress-nginx get po NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-jgnc9 0/1 Completed 0 2m44s ingress-nginx-admission-patch-wrt47 0/1 Completed 0 2m44s ingress-nginx-controller-57c548c4cd-9xwt6 1/1 Running 0 2m44s ``` -------------------------------- ### Frontend Development Commands (npm) Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Provides the equivalent direct npm commands for running frontend development. These commands navigate to the frontend directory, install dependencies, and start the development server. ```shellscript cd src/frontend npm i npm run dev ``` -------------------------------- ### Start Application Stack with Tilt and Keycloak Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Initiates the application stack within the Kubernetes environment using Tilt, including Keycloak for authentication. Tilt facilitates Kubernetes-like development with smart rebuilds and live updates. ```shellscript $ make start-tilt-keycloak ``` -------------------------------- ### Kubernetes: Install PostgreSQL Database Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This command installs a PostgreSQL database using Helm, which serves as the backend for LaSuite Meet. The installation is configured via `examples/postgresql.values.yaml`. After installation, `kubectl get po` can be used to confirm that the PostgreSQL pod is running. ```bash helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql -f examples/postgresql.values.yaml kubectl get po ``` -------------------------------- ### Check LiveKit CLI Version Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Confirms the installation of the LiveKit CLI, a necessary tool for real-time communication features. This command verifies that the CLI is accessible and reports its version. ```shellscript $ lk --version lk version 2.3.1 ``` -------------------------------- ### Kubernetes: Install Redis for Livekit and Meet Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This command installs Redis using Helm, which is a dependency for both Livekit and LaSuite Meet. The installation is configured using `examples/redis.values.yaml`. After installation, `kubectl get po` can be used to verify that the Redis master pod is running. ```bash helm install redis oci://registry-1.docker.io/bitnamicharts/redis -f examples/redis.values.yaml kubectl get po ``` -------------------------------- ### Bootstrap Project with Docker Compose Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Initializes the project within a Docker Compose environment. This command builds the application container, installs dependencies, applies database migrations, and compiles translations, preparing the development environment. ```shellscript $ make bootstrap FLUSH_ARGS='--no-input' ``` -------------------------------- ### Kubernetes: Install Livekit Server Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This sequence installs the Livekit server, which handles the streaming component of LaSuite Meet. It first adds the Livekit Helm repository, updates it, and then installs the server using a specified values file (`examples/livekit.values.yaml`). The `curl` command at the end verifies that the Livekit server is accessible. ```bash helm repo add livekit https://helm.livekit.io helm repo update helm install livekit livekit/livekit-server -f examples/livekit.values.yaml kubectl get po curl https://livekit.127.0.0.1.nip.io ``` -------------------------------- ### Install Frontend Dependencies (Docker Compose) Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Installs all necessary npm packages for the frontend application within the Docker Compose environment. This is a prerequisite for running frontend development commands. ```shellscript $ make frontend-development-install ``` -------------------------------- ### Add Demo Data Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Populates the development database with sample data using a single command. This is helpful for testing features or demonstrating the application's capabilities. ```shellscript $ make demo ``` -------------------------------- ### Run Frontend Development Server (Docker Compose) Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Starts the frontend development server, enabling hot reloading and other development features. This command is typically used after `make frontend-development-install`. ```shellscript $ make run-frontend-development ``` -------------------------------- ### View Make Rules Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Lists all available GNU make utilities for project management. This command helps users understand and utilize the various scripts provided for development tasks. ```shellscript $ make help ``` -------------------------------- ### Check Docker and Docker Compose Versions Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Verifies the installation and versions of Docker and Docker Compose, which are prerequisites for the Docker Compose development stack. Ensures compatibility for running the project. ```shellscript $ docker -v Docker version 20.10.2, build 2291f61 $ docker compose version Docker Compose version v2.32.4 ``` -------------------------------- ### Execute kind cluster setup script Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This script automates the creation of a local Kubernetes cluster using 'kind'. It handles the setup of necessary components like a local registry, ingress-nginx, and mkcert certificates for HTTPS. Ensure Docker, Kind, Mkcert, Helm, and kubectl are installed and accessible by the administrator/root user before execution. ```shell ./bin/start-kind.sh ``` -------------------------------- ### Run the Application Stack Source: https://github.com/suitenumerique/meet/blob/main/src/summary/README.md Starts the main application stack after dependencies are installed and environment variables are configured. Ensure your env values in `env.d/summary` are set correctly for WhisperX and LLM API calls. ```sh make run ``` -------------------------------- ### Run Backend Services Only (Docker Compose) Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Starts only the backend services without the frontend container. This is useful for frontend developers who need to work on the UI while backend services are running independently. ```shellscript $ make run-backend ``` -------------------------------- ### Kubernetes: Set Current Namespace and Install Keycloak Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This snippet first sets the current Kubernetes context to the 'meet' namespace, then installs Keycloak using Helm. Keycloak serves as the OIDC provider for user authentication. The installation uses a specified values file (`examples/keycloak.values.yaml`) for configuration. It's recommended to wait for the pods to become 'Running' before proceeding. ```bash kubectl config set-context --current --namespace=meet helm install keycloak oci://registry-1.docker.io/bitnamicharts/keycloak -f examples/keycloak.values.yaml #wait until kubectl get po ``` -------------------------------- ### Bootstrap Project Dependencies Source: https://github.com/suitenumerique/meet/blob/main/src/summary/README.md Installs project dependencies and sets up the development environment. This command is essential before running any other development commands. It assumes you are in the root of the project directory. ```sh make bootstrap ``` -------------------------------- ### Install Visio SDK (npm/yarn) Source: https://github.com/suitenumerique/meet/blob/main/src/sdk/library/README.md These commands show how to install the Visio SDK package using either npm or yarn package managers. This is a prerequisite for using the SDK in your project. ```bash $ npm install --save @gouvfr-lasuite/visio-sdk $ yarn add @gouvfr-lasuite/visio-sdk ``` -------------------------------- ### Build Kubernetes Cluster using Kind Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Constructs a local Kubernetes cluster using Kind (Kubernetes in Docker). This is a prerequisite for developing with the Kubernetes stack, enabling a local production-like environment. ```shellscript $ make build-k8s-cluster ``` -------------------------------- ### Deploy LaSuite Meet using Helm Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This snippet shows how to deploy LaSuite Meet using the Helm package manager. It involves adding the Helm repository, updating it, and then installing the meet chart with a custom values file. Ensure you have Helm installed and configured correctly. ```bash $ helm repo add meet https://suitenumerique.github.io/meet/ $ helm repo update $ helm install meet meet/meet -f examples/meet.values.yaml ``` -------------------------------- ### Stop Docker Compose Application Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Shuts down all services running under the Docker Compose setup. This command is used to stop the Visio development environment when it's no longer needed. ```shellscript $ make stop ``` -------------------------------- ### Start Recording API Source: https://context7.com/suitenumerique/meet/llms.txt Starts a recording session for a specified room. Supports screen recording and transcript modes. ```APIDOC ## POST /rooms/{roomId}/start-recording/ ### Description Starts a recording session for a specified room. ### Method POST ### Endpoint /rooms/{roomId}/start-recording/ ### Parameters #### Path Parameters - **roomId** (string) - Required - The ID of the room to start recording in. #### Request Body - **mode** (string) - Required - The recording mode. Accepted values: 'screen_recording', 'transcript'. ### Request Example ```json { "mode": "screen_recording" } ``` ### Response #### Success Response (201) - **message** (string) - A confirmation message that the recording has started. #### Response Example ```json { "message": "Recording successfully started for room weekly-team-standup" } ``` #### Error Response (500) - **error** (string) - An error message if the recording failed to start. #### Response Example ```json { "error": "Recording failed to start for room weekly-team-standup" } ``` ``` -------------------------------- ### Example Changelog Update Source: https://github.com/suitenumerique/meet/blob/main/CONTRIBUTING.md Illustrates how to update the changelog for new additions. Entries should be concise, include relevant emojis and PR numbers, and adhere to a character limit for readability. ```markdown ## [Unreleased] ## Added - ✨(frontend) add AI to the project #321 ``` -------------------------------- ### Start Recording API Source: https://context7.com/suitenumerique/meet/llms.txt Initiates the recording process for a specified room, with options for screen recording or transcription. ```APIDOC ## POST /api/v1.0/rooms/{room_id}/start-recording/ ### Description Initiate recording for a room with specified mode (screen recording or transcript). ### Method POST ### Endpoint /api/v1.0/rooms/{room_id}/start-recording/ ### Parameters #### Path Parameters - **room_id** (string) - Required - The unique identifier of the room for which to start recording. #### Request Body - **mode** (string) - Required - The recording mode ('screen_recording' or 'transcript'). ### Request Example ```json { "mode": "screen_recording" } ``` ### Response (Details for success/error responses for this endpoint were not provided in the input text.) ``` -------------------------------- ### Restart Docker Compose Application Source: https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md Restarts all services managed by Docker Compose. This command is useful for applying changes or resuming the development environment after it has been stopped. ```shellscript $ make run ``` -------------------------------- ### Start Recording - Python (Requests Library) Source: https://context7.com/suitenumerique/meet/llms.txt Backend API endpoint to initiate recording for a specified room. This POST request sends the desired recording mode ('screen_recording' or 'transcript') in the JSON payload and requires authentication headers, including CSRF token. No response structure is provided in the example. ```python # Backend API: POST /api/v1.0/rooms/{room_id}/start-recording/ # File: src/backend/core/api/viewsets.py:291-334 import requests response = requests.post( 'https://api.example.com/api/v1.0/rooms/a1b2c3d4-e5f6-7890-abcd-ef1234567890/start-recording/', json={ 'mode': 'screen_recording' # or 'transcript' }, headers={ 'Authorization': 'Bearer ', 'X-CSRFToken': '' } ) ``` -------------------------------- ### Example Commit Message Format Source: https://github.com/suitenumerique/meet/blob/main/CONTRIBUTING.md Demonstrates the recommended format for commit messages, including gitmoji, type, title, and description. This helps in understanding the purpose and nature of each commit. ```git ✨(frontend) add user authentication logic Implemented login and signup features, and integrated OAuth2 for social login. ``` -------------------------------- ### Integrate ESLint React Plugin (JavaScript) Source: https://github.com/suitenumerique/meet/blob/main/src/sdk/consumer/README.md This JavaScript configuration demonstrates how to integrate the `eslint-plugin-react` into your ESLint setup for a React project. It sets the React version, adds the plugin, and enables recommended rules for both standard React and JSX runtime configurations. Make sure `eslint-plugin-react` is installed as a dependency. ```javascript // eslint.config.js import react from 'eslint-plugin-react' export default tseslint.config({ // Set the react version settings: { react: { version: '18.3' } }, plugins: { // Add the react plugin react, }, rules: { // other rules... // Enable its recommended rules ...react.configs.recommended.rules, ...react.configs['jsx-runtime'].rules, }, }) ``` -------------------------------- ### Retrieve Room - Python (Requests Library) Source: https://context7.com/suitenumerique/meet/llms.txt Backend API example to fetch details of a specific video conferencing room using its ID or slug. It demonstrates how to make a GET request, including optional query parameters like `username` and authentication headers. The response contains room information and LiveKit connection credentials. ```python # Backend API: GET /api/v1.0/rooms/{room_id_or_slug}/ # File: src/backend/core/api/viewsets.py:233-258 import requests # Retrieve by UUID response = requests.get( 'https://api.example.com/api/v1.0/rooms/a1b2c3d4-e5f6-7890-abcd-ef1234567890/', params={'username': 'Jane Smith'}, headers={'Authorization': 'Bearer '}, cookies={'csrftoken': ''} ) # Retrieve by slug response = requests.get( 'https://api.example.com/api/v1.0/rooms/weekly-team-standup/', params={'username': 'Jane Smith'} ) # Response includes LiveKit connection details room = response.json() # { # "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", # "name": "Weekly Team Standup", # "livekit": { # "url": "wss://livekit.example.com", # "room": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", # "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." # } # } ``` -------------------------------- ### Start Subtitle/Transcription Source: https://context7.com/suitenumerique/meet/llms.txt Initiates real-time transcription services for a given room using LiveKit agents. ```APIDOC ## POST /api/v1.0/rooms/{room_id}/start-subtitle/ ### Description Starts real-time transcription for the room using LiveKit agents. ### Method POST ### Endpoint `/api/v1.0/rooms/{room_id}/start-subtitle/` ### Parameters #### Path Parameters - **room_id** (string) - Required - The unique identifier of the room. ### Request Example (No request body required) ### Response #### Success Response (200) - **status** (string) - Indicates the success of the operation. #### Response Example ```json { "status": "success" } ``` ### Notes - Requires a valid LiveKit token in the `Authorization` header. - Anonymous users can start transcription if they have room access. ``` -------------------------------- ### Kubernetes: Create Namespace for LaSuite Meet Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This command creates a Kubernetes namespace named 'meet' if it doesn't already exist. This namespace will host the LaSuite Meet application and its dependencies. Ensure you have `kubectl` configured to interact with your Kubernetes cluster. ```bash kubectl create namespace meet ``` -------------------------------- ### Start Recording (TypeScript) Source: https://context7.com/suitenumerique/meet/llms.txt Initiates a screen recording for a specified room. This frontend API function uses React Query for state management and a generic fetchApi function for making the POST request. It requires a room ID and recording mode as input. ```typescript // Frontend API // File: src/frontend/src/features/recording/api/startRecording.ts import { useMutation } from '@tanstack/react-query' import { fetchApi } from '@/api/fetchApi' const startRecording = (roomId: string, mode: 'screen_recording' | 'transcript') => { return fetchApi(`rooms/${roomId}/start-recording/`, { method: 'POST', body: JSON.stringify({ mode }) }) } function RecordingButton({ roomId }: { roomId: string }) { const mutation = useMutation({ mutationFn: () => startRecording(roomId, 'screen_recording'), onSuccess: () => console.log('Recording started') }) return } ``` -------------------------------- ### PostgreSQL Database Connection Values Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md These parameters specify how LaSuite Meet should connect to its PostgreSQL database. They include the database host, name, username, password, and port. These details are crucial for the application to interact with the database for data storage and retrieval. ```ini DB_HOST: postgres-postgresql DB_NAME: meet DB_USER: dinum DB_PASSWORD: pass DB_PORT: 5432 ``` -------------------------------- ### Retrieve Ingress Information for LaSuite Meet Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md This snippet demonstrates how to retrieve ingress information after deploying LaSuite Meet. This is crucial for finding the hostnames and IP addresses needed to access your deployed instance. The output provides details on the ingress controller, hosts, and addresses for various services. ```bash $ kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE keycloak keycloak.127.0.0.1.nip.io localhost 80 58m livekit-livekit-server livekit.127.0.0.1.nip.io localhost 80, 443 106m meet meet.127.0.0.1.nip.io localhost 80, 443 52m meet-admin meet.127.0.0.1.nip.io localhost 80, 443 52m ``` -------------------------------- ### Start Room Subtitle/Transcription Source: https://context7.com/suitenumerique/meet/llms.txt Initiates real-time transcription for a room using LiveKit agents. Requires a LiveKit JWT token for authorization, or anonymous users with room access can initiate it. It sends a POST request to the start-subtitle endpoint. ```python import requests response = requests.post( 'https://api.example.com/api/v1.0/rooms/a1b2c3d4-e5f6-7890-abcd-ef1234567890/start-subtitle/', headers={ 'Authorization': 'LiveKit-Token ', 'X-CSRFToken': '' } ) # Success response { "status": "success" } # Note: Requires valid LiveKit token, anonymous users can start if they have room access ``` -------------------------------- ### Livekit Connection Values Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md These environment variables configure LaSuite Meet to connect to the Livekit server for streaming functionality. They include the API key, secret, and the base URL for the Livekit server, as well as connection details for Redis, which serves as both a broker and result backend for Celery tasks. ```ini LIVEKIT_API_SECRET: secret LIVEKIT_API_KEY: devkey LIVEKIT_API_URL: https://livekit.127.0.0.1.nip.io/ REDIS_URL: redis://default:pass@redis-master:6379/1 CELERY_BROKER_URL: redis://default:pass@redis-master:6379/1 CELERY_RESULT_BACKEND: redis://default:pass@redis-master:6379/1 ``` -------------------------------- ### OIDC Configuration Parameters for LaSuite Meet Source: https://github.com/suitenumerique/meet/blob/main/docs/installation/kubernetes.md These parameters are essential for configuring LaSuite Meet to use an OIDC provider (like Keycloak) for authentication. They include endpoints for JWKS, authorization, token exchange, user info, and logout, along with client ID, secret, signing algorithm, and scopes. These values are typically found in the OIDC provider's configuration or the `examples/keycloak.values.yaml` file. ```ini OIDC_OP_JWKS_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/certs OIDC_OP_AUTHORIZATION_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/auth OIDC_OP_TOKEN_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/token OIDC_OP_USER_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/userinfo OIDC_OP_LOGOUT_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/session/end OIDC_RP_CLIENT_ID: meet OIDC_RP_CLIENT_SECRET: ThisIsAnExampleKeyForDevPurposeOnly OIDC_RP_SIGN_ALGO: RS256 OIDC_RP_SCOPES: "openid email" ``` -------------------------------- ### List Recordings Source: https://context7.com/suitenumerique/meet/llms.txt Retrieves a list of all recordings accessible to the authenticated user. This operation uses a GET request to the recordings endpoint, with optional pagination parameters like 'page' and 'page_size'. An Authorization header with a bearer token is required. ```python import requests response = requests.get( 'https://api.example.com/api/v1.0/recordings/', params={ 'page': 1, 'page_size': 20 }, headers={'Authorization': 'Bearer '} ) ``` -------------------------------- ### Set Up MinIO Webhook Source: https://github.com/suitenumerique/meet/blob/main/src/summary/README.md Configures the MinIO webhook, which is necessary for certain functionalities within the stack. This step is crucial for enabling communication between MinIO and the application. It is recommended to integrate this into the `make bootstrap` process. ```sh make minio-webhook-setup ``` -------------------------------- ### Linting and Testing Commands Source: https://github.com/suitenumerique/meet/blob/main/CONTRIBUTING.md Provides the commands to run linting and tests for the project. These commands ensure code quality and the stability of the application before pushing changes. ```bash make lint && make frontend-lint ``` ```bash make test ``` -------------------------------- ### Run Django Migrations (Development) Source: https://github.com/suitenumerique/meet/blob/main/UPGRADE.md A shortcut command to run Django database migrations in a local development environment using the Makefile. This simplifies the upgrade process for developers. ```makefile make migrate ``` -------------------------------- ### GET /api/v1.0/recordings/{recording_id}/ Source: https://context7.com/suitenumerique/meet/llms.txt Retrieves details for a specific recording, including its ID, room information, status, and expiration details. ```APIDOC ## GET /api/v1.0/recordings/{recording_id}/ ### Description Get details of a specific recording. ### Method GET ### Endpoint `/api/v1.0/recordings/{recording_id}/` ### Parameters #### Path Parameters - **recording_id** (string) - Required - The unique identifier for the recording. ### Request Example ``` (No request body for GET requests) ``` ### Response #### Success Response (200) - **id** (string) - The unique identifier of the recording. - **room** (object) - Information about the room where the recording took place. - **id** (string) - The room's unique identifier. - **name** (string) - The name of the room. - **slug** (string) - The slugified name of the room. - **status** (string) - The current status of the recording (e.g., 'saved'). - **mode** (string) - The recording mode (e.g., 'screen_recording'). - **extension** (string) - The file extension of the recording (e.g., 'mp4'). - **key** (string) - The storage key for the recording file. - **created_at** (string) - The timestamp when the recording was created. - **expired_at** (string) - The timestamp when the recording will expire. - **is_expired** (boolean) - Indicates if the recording has expired. - **abilities** (object) - Permissions for actions on the recording. - **retrieve** (boolean) - Whether the recording can be retrieved. - **destroy** (boolean) - Whether the recording can be deleted. - **stop** (boolean) - Whether the recording can be stopped. - **update** (boolean) - Whether the recording can be updated. - **partial_update** (boolean) - Whether the recording can be partially updated. #### Response Example ```json { "id": "recording-uuid-1", "room": { "id": "room-uuid", "name": "Weekly Team Standup", "slug": "weekly-team-standup" }, "status": "saved", "mode": "screen_recording", "extension": "mp4", "key": "recordings/recording-uuid-1.mp4", "created_at": "2025-10-24T10:00:00Z", "expired_at": "2025-11-24T10:00:00Z", "is_expired": false, "abilities": { "retrieve": true, "destroy": true, "stop": false, "update": false, "partial_update": false } } ``` ``` -------------------------------- ### Django Database Models for Rooms and Recordings (Python) Source: https://context7.com/suitenumerique/meet/llms.txt Core Django models defining the structure for rooms, users, and recordings. Includes methods for creating rooms, assigning roles, checking permissions, creating recordings, and retrieving associated properties and abilities. Demonstrates programmatic object creation and property access. ```python # File: src/backend/core/models.py from django.db import models from core.models import Room, User, Recording, ResourceAccess, RoleChoices # Create a room programmatically room = Room.objects.create( name="Engineering Standup", access_level=RoomAccessLevel.TRUSTED, configuration={ "max_participants": 50, "enable_chat": True } ) # Assign owner role ResourceAccess.objects.create( resource=room, user=user, role=RoleChoices.OWNER ) # Check user permissions if room.is_administrator_or_owner(user): print("User has admin privileges") # Get user role role = room.get_role(user) # Returns: OWNER, ADMIN, MEMBER, or None # Create a recording recording = Recording.objects.create( room=room, mode=RecordingModeChoices.SCREEN_RECORDING, status=RecordingStatusChoices.INITIATED ) # Check recording abilities abilities = recording.get_abilities(user) # { # "retrieve": True, # "destroy": True, # "stop": True, # "update": False, # "partial_update": False # } # Room properties room.is_public # Boolean: access_level == PUBLIC room.slug # Auto-generated from name: "engineering-standup" room.pin_code # Unique PIN for telephony (if enabled) # Recording properties recording.extension # "mp4" or "ogg" based on mode recording.key # S3 object key: "recordings/{uuid}.mp4" recording.is_saved # Boolean: status is SAVED or NOTIFICATION_SUCCEEDED recording.expired_at # Datetime or None recording.is_expired # Boolean ``` -------------------------------- ### Customize Fonts with CSS Source: https://github.com/suitenumerique/meet/blob/main/docs/theming.md An example of a custom CSS file that overrides the default sans-serif font to 'Roboto' using CSS variables. This CSS can be loaded at runtime by setting the FRONTEND_CSS_URL environment variable. ```css @import url(https://fonts.bunny.net/css?family=Roboto:wght@400;700&display=swap); :root { --fonts-sans: 'Roboto', ui-sans-serif, system-ui, sans-serif; } ``` -------------------------------- ### Set Application Title at Build-Time Source: https://github.com/suitenumerique/meet/blob/main/docs/theming.md This example shows how to override the application title during the Docker image build process using the VITE_APP_TITLE build argument. This allows for persistent branding changes that require a rebuild. ```shell docker build \ --build-arg VITE_APP_TITLE="My Custom Meet" \ -t my-org/meet:latest . ``` -------------------------------- ### Develop Celery Workers with Hot Reloading Source: https://github.com/suitenumerique/meet/blob/main/src/summary/README.md Starts Celery workers for transcription and summarization with hot reloading enabled. This allows for immediate reflection of code changes without restarting the workers, speeding up the development cycle for Celery-based functionalities. ```sh docker compose watch celery-summary-transcribe celery-summary-summarize ``` -------------------------------- ### Create Room API Source: https://context7.com/suitenumerique/meet/llms.txt Allows for the creation of new video conferencing rooms with customizable configurations and access levels. ```APIDOC ## POST /api/v1.0/rooms/ ### Description Create a new video conferencing room with specified configuration and access controls. ### Method POST ### Endpoint /api/v1.0/rooms/ ### Parameters #### Request Body - **name** (string) - Required - The name of the room. - **access_level** (string) - Required - The access level for the room (public, trusted, or restricted). - **configuration** (object) - Required - Configuration for the room. - **max_participants** (integer) - Optional - Maximum number of participants allowed. - **enable_chat** (boolean) - Optional - Whether chat is enabled. - **enable_recording** (boolean) - Optional - Whether recording is enabled. - **callback_id** (string) - Optional - A unique identifier for SDK integration. ### Request Example ```json { "name": "Weekly Team Standup", "access_level": "restricted", "configuration": { "max_participants": 50, "enable_chat": true, "enable_recording": true }, "callback_id": "unique-callback-id" } ``` ### Response #### Success Response (200) - **id** (string) - The unique identifier for the room. - **name** (string) - The name of the room. - **slug** (string) - A URL-friendly identifier for the room. - **access_level** (string) - The access level of the room. - **configuration** (object) - The configuration settings for the room. - **livekit** (object) - LiveKit specific connection details. - **url** (string) - The LiveKit server URL. - **room** (string) - The LiveKit room name. - **token** (string) - The token for connecting to the LiveKit room. - **created_at** (string) - The timestamp when the room was created. #### Response Example ```json { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Weekly Team Standup", "slug": "weekly-team-standup", "access_level": "restricted", "configuration": {}, "livekit": { "url": "wss://livekit.example.com", "room": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }, "created_at": "2025-10-24T10:30:00Z" } ``` ``` -------------------------------- ### Override Assets at Runtime Source: https://github.com/suitenumerique/meet/blob/main/docs/theming.md Illustrates how to override default assets like images by mounting custom files into the /usr/share/nginx/html/assets directory within the container. Files with the same names and paths will replace the originals at runtime. ```shell /usr/share/nginx/html/ └── assets/intro-slider/ ├── 1.png ├── 2.png ├── 3.png └── 4.png ``` -------------------------------- ### Create Application and Scopes - Python Django Source: https://context7.com/suitenumerique/meet/llms.txt This snippet demonstrates how to create a new 'Application' object in Django, assigning it a name, client ID, client secret, and a list of allowed 'ApplicationScope' permissions. It also shows how to check if the created application can delegate email access. ```python from core.models import Application, ApplicationScope app = Application.objects.create( name="External Integration", client_id="auto-generated-id", client_secret="hashed-secret", scopes=[ ApplicationScope.ROOMS_CREATE, ApplicationScope.ROOMS_LIST, ApplicationScope.ROOMS_RETRIEVE ], active=True ) # Check if app can delegate email can_delegate = app.can_delegate_email("user@example.com") ``` -------------------------------- ### Configure ESLint Type Aware Lint Rules (JavaScript) Source: https://github.com/suitenumerique/meet/blob/main/src/sdk/consumer/README.md This JavaScript snippet shows how to configure ESLint for type-aware linting in a React + TypeScript project. It specifies project configuration files and the root directory for TypeScript parsing. Ensure `tsconfig.node.json` and `tsconfig.app.json` are correctly set up. ```javascript export default tseslint.config({ languageOptions: { // other options... parserOptions: { project: ['./tsconfig.node.json', './tsconfig.app.json'], tsconfigRootDir: import.meta.dirname, }, }, }) ``` -------------------------------- ### Create Room Callback API Request (Python) Source: https://context7.com/suitenumerique/meet/llms.txt Makes a POST request to create a room callback and retrieve room details. It sends a callback_id and expects room information including LiveKit credentials in the response. This is useful for cross-origin communication. ```python import requests # After creating room with callback_id, retrieve it from another context response = requests.post( 'https://api.example.com/api/v1.0/rooms/creation-callback/', json={ 'callback_id': 'unique-callback-id-from-creation' } ) # Response { "status": "success", "room": { "id": "room-uuid", "name": "Room Name", "slug": "room-name", "livekit": { "url": "wss://livekit.example.com", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } } ``` -------------------------------- ### Create Room - Python (Django REST Framework) Source: https://context7.com/suitenumerique/meet/llms.txt Backend API endpoint to create a new video conferencing room. It accepts room configuration details such as name, access level, participant limits, chat enablement, and recording preferences. The response includes LiveKit connection details and a token for client integration. ```python # Backend API: POST /api/v1.0/rooms/ # File: src/backend/core/api/viewsets.py:279-289 from rest_framework import status from core.models import Room, ResourceAccess, RoleChoices # Request body data = { "name": "Weekly Team Standup", "access_level": "restricted", # public, trusted, or restricted "configuration": { "max_participants": 50, "enable_chat": True, "enable_recording": True }, "callback_id": "unique-callback-id" # Optional for SDK integration } # Response { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Weekly Team Standup", "slug": "weekly-team-standup", "access_level": "restricted", "configuration": {...}, "livekit": { "url": "wss://livekit.example.com", "room": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }, "created_at": "2025-10-24T10:30:00Z" } ``` -------------------------------- ### Configure ESLint for Type-Aware Linting in TypeScript Source: https://github.com/suitenumerique/meet/blob/main/src/frontend/README.md This JavaScript configuration snippet demonstrates how to update ESLint's parserOptions to enable type-aware linting rules for TypeScript projects. It requires specifying the project's tsconfig files and the root directory. This is crucial for production applications to catch type-related errors during development. ```javascript export default { // other rules... parserOptions: { ecmaVersion: 'latest', sourceType: 'module', project: ['./tsconfig.json', './tsconfig.node.json'], tsconfigRootDir: __dirname, }, } ``` -------------------------------- ### External API - Create Room (Application Delegated) Source: https://context7.com/suitenumerique/meet/llms.txt Creates a new room using an application's delegated authority, authenticated via JWT. ```APIDOC ## POST /api/v1.0/external/rooms/ ### Description Creates a room using application delegation with JWT authentication. ### Method POST ### Endpoint `/api/v1.0/external/rooms/` ### Parameters #### Request Body - **name** (string) - Required - The name of the room to be created. - **access_level** (string) - Optional - The access level for the room (e.g., 'trusted'). ### Request Example ```python # First, get application token token_response = requests.post( 'https://api.example.com/api/v1.0/external/applications/token/', json={ 'client_id': 'app-client-id', 'client_secret': 'app-secret', 'scope': 'admin@example.com' } ) access_token = token_response.json()['access_token'] # Create room on behalf of user room_response = requests.post( 'https://api.example.com/api/v1.0/external/rooms/', json={ 'name': 'External Integration Room', 'access_level': 'trusted' }, headers={ 'Authorization': f'Bearer {access_token}', 'Content-Type': 'application/json' } ) # Response includes room details with user as owner # Logged: room_id, user_id, client_id for auditing ``` ### Response (Response includes room details. Specific fields not detailed in the provided text.) ### Notes - Requires a valid JWT `access_token` obtained from the `/api/v1.0/external/applications/token/` endpoint. ``` -------------------------------- ### Frontend API Client for Authenticated Requests (TypeScript) Source: https://context7.com/suitenumerique/meet/llms.txt A core API client for making authenticated requests from the frontend. It handles CSRF protection automatically, includes credentials, sets JSON content-type by default, supports generic type-safe responses, and allows custom headers. Includes examples for basic usage and error handling. ```typescript // File: src/frontend/src/api/fetchApi.ts import { fetchApi } from '@/api/fetchApi' import { ApiError } from '@/api/ApiError' // Basic usage const data = await fetchApi('rooms/', { method: 'POST', body: JSON.stringify({ name: 'My Room' }) }) // With error handling try { const room = await fetchApi('rooms/room-slug/') } catch (error) { if (error instanceof ApiError) { console.error('API Error:', error.status, error.cause) // error.status: HTTP status code // error.cause: Response body with error details } } // Features: // - Automatic CSRF token from cookies // - Credentials included for authentication // - JSON content-type by default // - Type-safe responses with generics // - Custom headers support ``` -------------------------------- ### Run Django Migrations (Docker) Source: https://github.com/suitenumerique/meet/blob/main/UPGRADE.md Executes Django database migrations within a Docker container. This is a standard step for most upgrades to update the database schema. ```shell python manage.py migrate ``` -------------------------------- ### Create Room - TypeScript (React Frontend) Source: https://context7.com/suitenumerique/meet/llms.txt Frontend hook for creating a new video conferencing room. It utilizes a `useCreateRoom` hook to manage the API call. The `onSuccess` callback handles the response, typically for navigation or further actions, and the `mutate` function triggers the room creation with provided details. ```typescript // Frontend API // File: src/frontend/src/features/rooms/api/createRoom.ts import { useCreateRoom } from '@/features/rooms/api/createRoom' function CreateRoomComponent() { const createRoom = useCreateRoom({ onSuccess: (room) => { console.log('Room created:', room.id) // Navigate to room or handle success } }) const handleCreate = () => { createRoom.mutate({ slug: 'weekly-team-standup', callbackId: 'unique-callback-id', username: 'John Doe' }) } return } ``` -------------------------------- ### Configure Storage Webhook in Python Source: https://github.com/suitenumerique/meet/blob/main/docs/features/recording.md Enables and authenticates storage events for recordings. Requires setting a token for authorization. Ensure that the S3 bucket is configured to send file creation events to the backend webhook. ```python RECORDING_STORAGE_EVENT_ENABLE = True RECORDING_ENABLE_STORAGE_EVENT_AUTH = True RECORDING_STORAGE_EVENT_TOKEN = ``` -------------------------------- ### Create Django Superuser with Database Check Source: https://github.com/suitenumerique/meet/blob/main/src/helm/meet/README.md This command creates a superuser for Django applications after verifying database readiness. It includes a loop to check database connectivity before attempting superuser creation, using environment variables for email and password. Assumes `manage.py` and necessary environment variables (`DJANGO_SUPERUSER_EMAIL`, `DJANGO_SUPERUSER_PASSWORD`) are set. ```shell /bin/sh -c "while ! python manage.py check --database default > /dev/null 2>&1\ndo\n echo \"Database not ready\"\n sleep 2\ndone\necho \"Database is ready\"\n\npython manage.py createsuperuser --email $DJANGO_SUPERUSER_EMAIL --password $DJANGO_SUPERUSER_PASSWORD\n" ``` -------------------------------- ### Dockerfile ARG for Application Title Source: https://github.com/suitenumerique/meet/blob/main/docs/theming.md A Dockerfile snippet demonstrating the use of ARG to define and set the VITE_APP_TITLE environment variable. This allows the application title to be customized during the build. ```dockerfile ARG VITE_APP_TITLE="La Suite Meet" ENV VITE_APP_TITLE=${VITE_APP_TITLE} ```