# Databáza

Server používa na ukladanie dát dokumentovú databázu MongoDB. Aj keď je do MongoDB možné vkladať dáta s rôznymi atribútmi, používame modely jednotlivých dátových entít, ktoré špecifikujú štruktúru objektu a definujú typy jeho atribútov. Pracujeme s nasledujúcimi kolekciami:

  • votes
  • parties
  • candidates
  • polling_places
  • key_pairs

Štruktúra uloženého hlasu:

class Vote(BaseModel):
    token: str
    party_id: Optional[int] = None
    election_id: str
    candidate_ids: List[int] = []

Ďalej sa počas spracovania hlasov dynamicky pridajú dva atribúty a to:

polling_place_id: int
synchronized: bool

Atribút polling_place_id slúži na spojenie hlasu s miestnosťou, v ktorej bol zvolený atribút synchronized, ktorý indikuje, či bol daný hlas už zandexovaný do ElasticSearch-u.

Štruktúra politickej strany:

class Party(BaseModel):
    id: int = Field(..., alias="_id")
    party_number: int
    name: str
    official_abbr: str
    abbr: str
    image: str
    image_bytes: str
    color: str
    candidates: List[Candidate] = []

Dátová štruktúra politickej strany obsahuje základné údaje ako názov, skratka, číslo a doplnkové údaje ako farba a logo, ktoré sa používajú v štatistickej aplikácii. Ďalej strana obsahuje zoznam kadidátov, ktorí sú reprezentovaný vlastným modelom.

Štruktúra volebnej miestnosti:

class PollingPlace(BaseModel):
    id: int = Field(..., alias="_id")
    region_code: int
    region_name: str
    administrative_area_code: int
    administrative_area_name: str
    county_code: int
    county_name: str
    municipality_code: int
    municipality_name: str
    polling_place_number: int
    registered_voters_count: int

Dátová štruktúra volebnej miestnosti obsahuje informácie o územných celkoch, v ktorých sa daná miestnosť nachádza. Tieto údaje budú následne použité na prepočítavanie výslekov pre rôzne lokality (obce, okresy a kraje).

Štruktúra kandidáta:

class Candidate(BaseModel):
    id: int = Field(..., alias="_id")
    party_number: int
    order: int
    first_name: str
    last_name: str
    degrees_before: str
    age: int
    occupation: str
    residence: str

Dátová štruktúra kandidáta obsahuje základné údaje o kandidátovi, ktoré sú použité na zobrazovanie výsledkov a obsahuje taktiež prepojenie na politickú stranu, ktorej je súčasťou.

Štruktúra kľúčového páru:

class KeyPair(BaseModel):
    id: int = Field(..., alias="_id")
    polling_place_id: int
    private_key_pem: str
    public_key_pem: str
    g_private_key_pem: str
    g_public_key_pem: str

Kľúčový pár je špecifický pre každú volebnú miestnosť a jeho privátnym kľúčom je dešifrovaná iba kominikácia, ktorá prichádza z tejto volebnej miestnosti. Tento krok zvyšuje bezpečnosť komunikácie.

# Popis API

# schema_database_schema_get

Code samples

import requests
headers = {
  'Accept': 'application/json'
}

r = requests.get('/database/schema', headers = headers)

print(r.json())

GET /database/schema

Schema

Get all collections from database

Example responses

200 Response

{
  "collections": []
}

Responses

Status Meaning Description Schema
200 OK Successful Response Collections

# import_data_database_import_data_post

Code samples

import requests
headers = {
  'Accept': 'application/json'
}

r = requests.post('/database/import-data', headers = headers)

print(r.json())

POST /database/import-data

Import Data

Example responses

200 Response

{
  "status": "string",
  "message": "string"
}

Responses

Status Meaning Description Schema
200 OK Successful Response Message

# seed_data_database_seed_data_post

Code samples

import requests
headers = {
  'Accept': 'application/json'
}

r = requests.post('/database/seed-data', params={
  'number_of_votes': '0'
}, headers = headers)

print(r.json())

POST /database/seed-data

Seed Data

Parameters

Name In Type Required Description
number_of_votes query integer true none

Example responses

200 Response

{
  "status": "string",
  "message": "string"
}

Responses

Status Meaning Description Schema
200 OK Successful Response Message
422 Unprocessable Entity Validation Error HTTPValidationError

# seed_votes_database_seed_votes_post

Code samples

import requests
headers = {
  'Accept': 'application/json'
}

r = requests.post('/database/seed-votes', params={
  'number_of_votes': '0'
}, headers = headers)

print(r.json())

POST /database/seed-votes

Seed Votes

Parameters

Name In Type Required Description
number_of_votes query integer true none

Example responses

200 Response

{
  "status": "string",
  "message": "string"
}

Responses

Status Meaning Description Schema
200 OK Successful Response Message
422 Unprocessable Entity Validation Error HTTPValidationError