# 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.