You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mvapi/README.md

85 lines
2.2 KiB

# API for Mieux Voter
This API allows you to create elections, vote and obtain results with [majority judgment](https://en.wikipedia.org/wiki/Majority_judgment).
You can use our server at [api.mieuxvoter.fr/](api.mieuxvoter.fr/).
Since our API relies on OpenAPI, documentation is automatically generated and it is available at [api.mieuxvoter.fr/redoc](api.mieuxvoter.fr/redoc) or [api.mieuxvoter.fr/docs](api.mieuxvoter.fr/docs).
## Installation with Docker
Copy the `.env` into `.env.local` with your own settings.
Then launch the dockers with:
`docker compose --profile all --env-file .env.local up -d`
Note that you can use the `profile` called `dashboard` if you only need Metabase, `image` if you only need to store images, or `backup` for restic.
You certainly want to apply databases migrations with:
`docker/migrate.sh`
## Run the tests
`docker/test.sh`
## Local development
1. Install [postgresql](https://www.postgresql.org/download/).
2. Install python 3.11.
3. Create a new virtual environment and activate it:
```bash
venv .venv
source .venv/bin/activate
```
4. Install dependencies:
```bash
pip install -r requirements.txt
pip install -r requirements-dev.txt
```
5. Copy `.env` into `.env.local` and edit environment variables
6. Start the server:
```
uvicorn app.main:app --reload --env-file .env.local
```
7. Visit the generated documentation:
```
http://127.0.0.1:8000/redoc
```
If you need to alter the database, you can create new migrations using [alembic](https://alembic.sqlalchemy.org/en/latest/index.html).
## TODO
POST elections: creation election
--> return a JWT token for administration
--> and the election link
--> and eventually a series of JWT tokens for voting
PUT elections/[election-id] get all data about a specific election. Might need a JWT token
--> might return new invites
GET grades/[election-id]: only get the grades related to an election. Might need a JWT token
GET candidates/[election-id]: only get the candidates related to an election. Might need a JWT token
GET votes/[election-id]: only get the votes. Might need a JWT token
POST elections/[election-id]/votes: to vote. Might need a JWT token
GET /metrics a few metrics, among them the number of elections, number of voters and number of votes.