Aikaleima API-palvelu

API-palvelu hoitaa kaikki aikaleima-tietokantaan liittyvä palvelut. Rajapinta koostuu kolmesta osasta: pyynnöistä (request), vastauksista (response) ja palveluista (services). Repositoryn `Services`-luokka toteuttaa kaikki palvelut, ja sen metodeja kutsutaan muualta koodista. Palvelut ovat funktioita, jotka suorittavat tietyn toiminnon. `Request`-parametrilla kerrotaan toiminnolle tarvittavat tiedot, ja `Response` palauttaa toiminnon tuloksen.

graph LR subgraph "State luokka" Caller[Kutsuva koodi] end subgraph Repository Services[Services-luokka] Request[Request-objekti] Response[Response-objekti] DB[(Tietokanta)] end Caller -- Request --> Services Services -- suorittaa operaation --> DB DB -- tulokset --> Services Services -- Response --> Caller

Repositoryn sisäinen rakenne

Repository-moduuli hyödyntää C#:n partial-luokkia, joiden avulla sekä palvelulogiikka (Services) että tietokantakonteksti (AppDbContext) on jaettu selkeämpiin, osa-aluekohtaisiin tiedostoihin. Tämä parantaa koodin luettavuutta ja ylläpidettävyyttä. Alla oleva kaavio kuvaa tätä rakennetta.

classDiagram class Services { :+IDbContextFactory~AppDbContext~ factory +Services(IDbContextFactory~AppDbContext~factory) }
classDiagram class users ["(UserServices.cs) partial Services"] { +UserLoginAsync(KeyRequest request) Task~UserResponse~ +UsernamesAsync(Request request) Task~IdValueListResponse~ +UserAsync(IdRequest request) Task~UserResponse~ +SaveUserAsync(UserSaveRequest request) Task~UserResponse~ } class devices ["(deviceServices.cs) partial Services"] { +DeviceNamesByUserAsync(Request request) Task~IdValueListResponse~ +DeviceByKeyAsync(KeyRequest request) Task~DeviceResponse~ +DeviceByIdAsyncAsync(IdRequest request) Task~DeviceResponse~ -DeviceByIdAsync(int id) Task~DeviceResponse~ -DeviceToResponse(Device device) DeviceResponse +SaveDeviceAsync(DeviceSaveRequest request) Task~DeviceResponse~ }
classDiagram class stampcategories ["(StampcategoryServices.cs) partial Services"]{ +StampcategoryNamesAsync(Request request) Task~IdKeyValueListResponse~ +StampcategoryAsync(IdRequest request) Task~StampcategoryResponse~ +SaveStampcategoryAsync(StampcategorySaveRequest request) Task~StampcategoryResponse~ } class Stampers ["(StamperServices.cs) partial Services"]{ +StamperNamesByUserAsync(Request request) Task~StamperNamesResponse~ +StamperAsync(IdRequest request) Task~StamperResponse~ +SaveStamperAsync(StamperSaveRequest request) Task~StamperResponse~ }
classDiagram class Stamps ["(StampServices.cs) partial Services"]{ +SaveStampCacheAsync() Task~Response~ +StamperAsync(IdRequest request) Task~StamperResponse~ +StampsAsync(Request request) Task~StampsResponse~ +MarkTransferedAsync(KeyListRequest request, bool test = false) Task~Response~ +RestoreTransferedAsync(KeyListRequest request, bool test=false) Task~Response~ +DeleteTransferedAsync(KeyListRequest request,bool test=false) Task~Response~ } class settings ["(settingServices.cs) partial Services"]{ +GetSettingsAsync() Task~SettingsResponse~ +SaveSettingsAsync(SettingsResponse request) Task~Response~ }

AppDbContext-luokan rakenne

Vastaavasti kuin Services-luokka, myös AppDbContext on jaettu osiin partial-avainsanalla. Jokainen sovelluksen pääentiteetti (kuten User, Stamp, Device) saa oman DbSet-määrittelynsä omassa tiedostossaan. Tämä selkeyttää projektin rakennetta, kun kuhunkin toiminnallisuuteen liittyvä tietokantataulun määrittely löytyy omasta kansiostaan.

classDiagram class AppDbContext { +Devices: DbSet~Device~ +Settings: DbSet~Setting~ +Stampcategories: DbSet~Stampcategory~ +Stampers: DbSet~Stamper~ +Stamps: DbSet~Stamp~ +Users: DbSet~User~ AppDbContext(DbContextOptions~AppDbContext~options) : base(options) } class Device{ +Id:int +StamperKey:string +Name:string +Key:string +GPS:bool } Device "1" --o "n" AppDbContext class User{ +Id:int +Name:string +LoginKey:string +DeviceId:int } User "1" --o "n" AppDbContext class Setting{ +Key:string +Value:string } Setting "1" --o "n" AppDbContext class Stampcategory{ +Id:int +Name:string +ExternalKey:string } Stampcategory "1" --o "n" AppDbContext class Stamper{ +Id:int +Name:string +ExternalKey:string } Stamper "1" --o "n" AppDbContext Stampcategory "1" --o "n" AppDbContext class Stamp{ +Id:int +DeviceKey:string +StampcategoryKey:string +Timestamp:string +State:string +Latitude:string +Longitude:string } Stamp "1" --o "n" AppDbContext

Sovellus

Soveluksessa ei ole oikestaan mitään normaalista poikeavaa.Ellei sellaiseksi lasketa hostprosesseja muuten normaalit DI-viritykset


        

Reitit

routes-kansio Reititysmääritykset, jotka alustetaan sovelluksen käynnistyessä. Nämä reitit palvelevat kaikkia API-asiakkaita. Järjestelmässä käytetään post-metodeja myös dataa haettaessa, koska halutaan pitää hakuparametrit contentissa eikä urlissa. Mikäli hakuparameterja ei ole niin silloin käy ihan hyvin get-metodi.
Käyttäjä sequence-kaavio Laite sequence-kaavio Asetukset sequence-kaavio Leimauslajit sequence-kaavio Leimaajat sequence-kaavio Leimat sequence-kaavio


    

BackgroundServices

BackgroundServices Tällä hetkellä sovelluksessa on yksi taustatoiminto joka tallentaa laimaustapahtumat tietokantaan. Lyhyesti selostettuna. Leimauksen tallennus apikutsu vie tapahtuman cacheen. Taustaprosessi tallentaa cachen 30 sekunnin välein. Miksi tämä ratkaisu. Testiohjelmalla (joka löytyy asiaskasjärjestelmä koodeista). Tehtyjen testien perusteella esim 100 asiakas-clientilla 100 leimausta sekuntin välein eli 100 leimausta sekunnissa. Aiheutti satunnaisia lukitus vireitä kantatiedostoon.