Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
fe0415d
feat: add picture upload and asso edition route
AlbanSdl Oct 16, 2025
cc8b02f
feat(asso): add media connection for asso descriptions
AlbanSdl Oct 16, 2025
942e6b3
tests: add tests for new routes
AlbanSdl Oct 16, 2025
13666b6
fix(media): add cache control on media and fix tests after rebase
AlbanSdl Oct 17, 2025
7b180e8
fix(media): remove application header requirement for getting public …
AlbanSdl Oct 17, 2025
af4187c
fix(asso): remove lexical requirement for descriptionShort
AlbanSdl Oct 19, 2025
4c41350
feat: add lexical rendering in api
AlbanSdl Oct 22, 2025
d32d3d5
fix: tests
AlbanSdl Oct 22, 2025
1a8bb58
fix(lexical): tables are now rendered in html exports
AlbanSdl Oct 22, 2025
f99ae4d
fix: remove trailing spaces, fix list style
AlbanSdl Oct 22, 2025
e426443
fix: handle checklists and table header alignment
AlbanSdl Oct 22, 2025
683b7d9
fix: fix image height, update tests lexical string
AlbanSdl Oct 22, 2025
a08ccde
fix(tests): i broke codecov report generation
AlbanSdl Oct 22, 2025
61d9564
tests: add unit tests lexical
AlbanSdl Oct 22, 2025
8c8bad5
fix(tests): skip generation tests, remove res.dto.ts from coverage
AlbanSdl Oct 23, 2025
bca64e2
docs: add some docs, add doc build ci
AlbanSdl Oct 23, 2025
34875dc
docs: pimp docs with new theme
AlbanSdl Oct 23, 2025
2cf66cf
docs: update some layout settings
AlbanSdl Oct 23, 2025
91db9aa
chore: update deps
AlbanSdl Oct 24, 2025
b32af3b
chore: moving from rust connector to prisma mariadb adapter
AlbanSdl Nov 6, 2025
8bf3618
fix: add forceExit in all test commands
AlbanSdl Nov 6, 2025
aa2efbe
chore: update deps (once more)
AlbanSdl Nov 6, 2025
77f68cf
chore: remove cz-emoji dep
AlbanSdl Nov 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .env.dist
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ LDAP_USER=
LDAP_PWD=

ANNAL_UPLOAD_DIR=uploads/exams/
MEDIA_UPLOAD_DIR=uploads/media
MEDIA_DETACHED_LIFESPAN=1

CAS_URL=https://cas.utt.fr/cas
CAS_SERVICE=http://localhost:8080

Expand Down
3 changes: 3 additions & 0 deletions .env.test.dist
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ PAGINATION_PAGE_SIZE=20
FAKER_SEED=42

ANNAL_UPLOAD_DIR=uploads/exams/
MEDIA_UPLOAD_DIR=uploads/media
MEDIA_DETACHED_LIFESPAN=1

CAS_URL=https://cas.utt.fr/cas
CAS_SERVICE=https://etu.utt.fr/login
LDAP_URL=ldap://localhost:3002
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,36 @@
- run: pnpm prisma generate
- run: pnpm build

docs:
runs-on: self-hosted
strategy:
matrix:
node-version: [22]
pnpm-version: [10]
steps:
- uses: actions/checkout@v5
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ matrix.pnpm-version }}
- name: Use Node.js
uses: actions/setup-node@v6
with:
package-manager-cache: false
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
- name: Use Python
uses: actions/setup-python@v6
with:
python-version: '3.14'
- run: pnpm build:docs:configure
- run: pnpm build:docs

test:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
runs-on: self-hosted
strategy:
matrix:
node-version: [22]

Check warning

Code scanning / CodeQL

Unpinned tag for a non-immutable Action in workflow Medium

Unpinned 3rd party Action 'CI' step
Uses Step
uses 'pnpm/action-setup' with ref 'v4', not a pinned commit hash
pnpm-version: [10]
env:
DATABASE_URL: mysql://dev:dev@localhost:3306/etuutt_test
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ yarn.lock
docs/_build/
docs/build/

# Prisma generated files
src/prisma/types/**/*.ts
!src/prisma/types/index.ts

# OLD DATABASE, DO NOT PUSH, IT CONTAINS SENSITIVE DATA
migration/etuutt_old/etuutt_old.sql
# UE Data
Expand Down
14 changes: 11 additions & 3 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
# -- Project information -----------------------------------------------------

project = 'EtuUTT'
copyright = '2024, UTT Net Group'
copyright = '2025, UTT Net Group'
author = 'UTT Net Group'


Expand Down Expand Up @@ -52,7 +52,14 @@
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
html_theme = 'shibuya'
html_theme_options = {
"accent_color": "blue",
"github_url": "https://github.com/ungdev/etu-utt-api",
"announcement": "<center>Le site étu est toujours en cours de développement : la documentation est en cours d'écriture et peux être incomplète/incorrecte.</center>",
}
html_favicon = "logo.svg"
html_logo = "logo.svg"

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
Expand All @@ -64,4 +71,5 @@
'.md': 'markdown',
}

myst_enable_extensions = ["attrs_inline"]
myst_enable_extensions = ["attrs_inline"]
myst_heading_anchors = 4
7 changes: 6 additions & 1 deletion docs/doc_developers/api/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Documentation développeurs - API
# API

Cette documentation s'adresse aux développeurs de l'API de EtuUTT. Elle traite des aspects techniques la concernant :
outils utilisés, outils développés, choix faits, ...
Expand All @@ -10,6 +10,11 @@ setup.md
nestjs.md
conventions.md
test.md
documentation.md
errors.md
permissions.md
lexical.md
ues.md
timetables.md
scripts.md
```
88 changes: 88 additions & 0 deletions docs/doc_developers/api/lexical.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Texte formatable

```{danger}
*Le texte formatable est un **sujet de travail actuel**. Son implémentation est susceptible de changer.* \
Par ailleurs, il est possible que cette fonctionnalité soit séparée dans un package nodejs indépendant.
```

A certains endroits du site étu, les utilisateurs pourront formatter du texte. Nous avons décidé de nous baser sur une bibliothèque, [lexical](https://lexical.dev) ([github](https://github.com/facebook/lexical)). Bien que l'utilisateur puisse envoyer du contenu formatté sur à peu près n'importe quel champ texte de l'api (à condition de respecter la limite de caractères), il n'y a que quelques champs qui supportent réellement le texte formatté.

```{warning}
Les champs qui ne supportent pas le texte formatté acceptent **pour le moment** des inputs formattés. Cependant, ces champs ne seront pas traités comme telles par les applications front-end (comme le front du site étu). Cela peut donner lieu à un affichage considéré comme buggé si la feature est mal utilisée par certaines implémentations front-end !
```

## Abbréviations dans ce document

Nous utiliserons dans ce documents les abbréviations/anglicismes suivantes :

- RTE: Rich Text Editor, l'éditeur de texte dans lequel l'utilisateur peut formater du texte
- Renderer: côté serveur, la fonction qui transforme du contenu lexical en html
- Document Object Model (DOM): la structure d'un document, généralement HTML. On l'utilisera ici pour parler de tout ce qui est relatif à l'affichage du texte formatable.

## Les bundles

Un bundle est la définition de l'ensemble des contenus supportés par une zone de texte formatable. Il contient des [nodes](#node) et, pour le front, des [plugins](#plugin) et des [composants de toolbar](#composant-de-toolbar).
La définition d'un bundle permet de configurer plusieurs RTE ou Renderers de manière identique.

Détaillons maintenant les différents éléments contenu dans un bundle :

### Node

Une node est une partie du texte ou un élément visuel que l'utilisateur peut ajouter à son texte. Il peut s'agir par exemple d'images, d'émojis customs, ou de texte avec un fond coloré.
Pour créer de nouvelles capacités/de nouveaux éléments dans le texte formatté, la première étape est de créer une `class` qui hérite de `ElementNode`, `TextNode` ou `DecoratorNode`. Pour voir les méthodes à implémenter, regarde [la doc de lexical](https://lexical.dev/docs/concepts/nodes#creating-custom-nodes). Comme indiqué plus bas dans la doc, tu peux utiliser [`$config` et ne pas implémenter les 3 fonctions statiques](https://lexical.dev/docs/concepts/nodes#extending-elementnode-with-config).

```{tip}
Seule les `DecoratorNode` pourront être rendues avec une ReactNode côté front (cf. `DecoratorNode#decorate`). Si tu n'as pas envie d'écrire des opérations DOM, cela peut être une bonne solution 😉
```

Lorsque tu appliques des classes à des éléments, fais bien attention à prendre celles du thème de l'éditeur, `editor.theme[className]`. Tu pourrais sinon oublier de les implémenter de l'autre côté (serveur/client) et le rendu serait alors différent !

Si tu souhaites remplacer une node déjà définie, tu peux enregistrer des [remplacements](https://lexical.dev/docs/concepts/node-replacement). Cela t'évitera de devoir copier-coller tout son code, et à chaque fois qu'une node remplacée sera créée, elle sera transformée en ta nouvelle node à l'aide de la fonction que tu auras définie !

### Plugin

Les plugins n'existent que côté front-end. Ce sont eux qui vont ajouter de la logique, tu vas pouvoir:

- écouter des [évènements](https://lexical.dev/docs/concepts/commands), à l'aide de `editor.registerCommand()`
- enregistrer des [transformers](https://lexical.dev/docs/concepts/transforms) avec `editor.registerNodeTransform()`
- en react, utiliser `useEffect`
- rendre un élément supplémentaire, un overlay par exemple

```{admonition} TLDR
:class: tip
Un transformer, c'est du code qui va te permettre de transformer du contenu dans le RTE au fur et à mesure qu'il est ajouté. Par exemple, tu peux transformer automatiquement `:joy:` en l'émoji correspondant, 😂.
```

### Composant de toolbar

Ce qui permettra à l'utilisateur d'intéragir avec tes nodes depuis une interface.

A l'heure actuelle, ces composants n'existent pas encore en tant que tel et font partie du composant `ToolbarPlugin`. Leur future séparation permettra d'ajouter facilement des composants (boutons, etc) custom dans cette toolbar.

## Côté serveur

Bien que le serveur n'ait pas à gérer l'édition en temps réel, il doit pouvoir effectuer quelques opérations sur le contenu généré par l'utilisateur. Cela inclut la validation du contenu lexical et l'export en HTML (pour pouvoir l'utiliser dans des emails par exemple).

```{admonition} Structure Lexical
La structure envoyée entre le client est le front est un JSON (créé avec `LexicalNode#exportJSON`). Il contient les nodes imbriquées les unes dans les autres.
```

### La validation

La validation vérifie que le contenu fourni utilisateur a bien une structure comprise par le serveur. Cela vérifie :

- que c'est bien du JSON
- que l'éditeur lexical le comprend
- qu'il n'y a pas de node absente du bundle
- qu'il n'y a pas de propriétés inconnues sur les nodes

```{attention}
Les propriétés des nodes doivent apparaitre dans le même sens lors de l'exportJSON côté front et côté serveur.
```

### Le rendu

Le rendu permet au serveur de transformer du contenu lexical en html. Il faut faire attention à deux points ici :

- les méthodes `DecoratorNode#decorate` doivent être enlevées et le contenu de la node doit être traduit en instructions DOM dans `DecoratorNode#createDOM`
- les styles appliqués sur le front doivent être réappliqués sur le DOM produit sur l'API. Cela peut nécessiter des modifications structurelles dans l'HTML généré. En cas de besoin, il est possible d'ajouter des conditions spécifiques dans `NodeStyleInjector.ts`
4 changes: 2 additions & 2 deletions docs/doc_developers/api/nestjs.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ export class DummyModule {}
```

```{tip}
L'API de EtuUTT utilise des guards personnalisés, ils sont listés [ici](#outils-specifiques-de-etuutt).
L'API de EtuUTT utilise des guards personnalisés, ils sont listés [ici](#outils-spécifiques-du-site-étu).
```

### Les interceptors [_(docs)_](https://docs.nestjs.com/interceptors)
Expand Down Expand Up @@ -292,7 +292,7 @@ Voici une illustration qui permet de récapituler les différentes étapes dans

### La gestion des erreurs

Nous avons implémenté des messages d'erreurs customisés, voir la page sur [la gestion des erreurs]().
Nous avons implémenté des messages d'erreurs customisés, voir la page sur [la gestion des erreurs](errors.md).

### L'authentification nécessaire par défaut

Expand Down
10 changes: 3 additions & 7 deletions docs/doc_developers/api/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,10 @@ Les tests sont tous lancés. Au bout de quelques secondes / minutes, tous les te

Pour cela, vous devez avoir Python3 installé.

Il faut commencer par installer les dépendances :

```bash
# Pour les commandes pip, il est possible d'utiliser python -m pip (ou python3 -m pip) à la place de pip.
cd docs
pip install --upgrade pip setuptools sphinx readthedocs-sphinx-ext
pip install -r docs/requirements.txt
python -m sphinx -T -b html -d _build/doctrees -D language=fr . build/html
# Pour la première commande, il faut la faire uniquement la première fois, elle va installer les dépendances python
pnpm build:docs:configure
pnpm build:docs
```

Le résultat du build se situe alors dans `docs/build/html`. Le fichier racine est `index.html`. Le résultat de la
Expand Down
2 changes: 1 addition & 1 deletion docs/doc_developers/front/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Documentation développeurs - Site web
# Site web

Cette documentation s'adresse aux développeurs du site web de EtuUTT. Elle traite des aspects techniques le concernant :
outils utilisés, outils développés, choix faits, ...
Expand Down
2 changes: 1 addition & 1 deletion docs/doc_developers/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Documentation développeurs
# Développeurs

Cette documentation s'adresse aux développeurs de EtuUTT. Elle traite des aspects techniques de l'API, de l'application
mobile et du site web : outils utilisés, outils développés, choix faits, ...
Expand Down
2 changes: 1 addition & 1 deletion docs/doc_developers/mobile_app/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Documentation EtuUTT - Application mobile
# Application mobile

Cette documentation s'adresse aux développeurs de l'appli MyUTT. Elle traite des aspects techniques la concernant :
outils utilisés, outils développés, choix faits, ...
Expand Down
5 changes: 5 additions & 0 deletions docs/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
myst-parser
sphinx
sphinx-rtd-theme
shibuya
5 changes: 3 additions & 2 deletions migration/etuutt_old/make-migration.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { PrismaClient as _PrismaClient } from '@prisma/client';
import { PrismaClient as _PrismaClient } from '../../src/prisma/types';
import { PrismaMariaDb } from '@prisma/adapter-mariadb';
import { createConnection } from 'mysql';
import { cleanDb } from '../../test/utils/test_utils';
import { findLegacyUeofName, migrateUEs } from './modules/ue';
Expand Down Expand Up @@ -34,7 +35,7 @@ export async function getOperationResults<T>(operations: MayBePromise<PrismaOper
}

let ueId = -1;
const _prisma = new _PrismaClient();
const _prisma = new _PrismaClient({ adapter: new PrismaMariaDb(process.env.DATABASE_URL) });
const prisma = _prisma.$extends({
model: {
semester: {
Expand Down
2 changes: 1 addition & 1 deletion migration/etuutt_old/modules/user.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PrismaClient, UserType } from '@prisma/client';
import { PrismaClient, UserType } from '../../../src/prisma/types';
import { QueryFunction } from '../make-migration';
import { RawSemester, RawUe, RawUser } from '../../../src/prisma/types';

Expand Down
Loading