WUT_Computer_Science/Programming/ERSMS-project/docs/final_documentation/main.tex
Krzysztof kuhy Rudnicki a8d873b4fd
Some checks are pending
md-naming / markdown naming convention (push) Waiting to run
pre-commit / pre-commit (push) Waiting to run
runnability / runnability (push) Waiting to run
Run all 33 safe courses; fix what that broke
Running one directory (EADS) had already produced four bugs, so all of them
were run. 11 failed. Every one was real -- either in the coursework or in the
harness I had just written -- and the split was roughly even.

Coursework bugs:
  - 15 .tex files use Polish ogonek characters with no fontenc, so pdflatex
    dies with "Command \k unavailable in encoding OT1". Fixed where it was
    actually needed, not blanket-applied.
  - BSS had \documentclass{article}[12pt] -- options after the class name,
    where they are not options at all.
  - SDM's beamer deck had a stray } on an \item, which took out the frame.
  - EOOP/Various/currency included "currency2.hpp"; the file is currency.hpp.
  - ECRYPT_PROJECT had the SAME stdlib-shadowing bug as ECOTE: a package named
    code/. Renamed to sieve/, and its 99 tests now run. With ECOTE's 26 that
    is 125 tests that could not execute at all before today.

Harness bugs, which the run is what exposed:
  - COURSE_ENTRY pointed at directories for PORR and ECRYPT_PROJECT, so python
    looked for __main__.py and reported the wrong problem.
  - main.py was auto-picked via find's first result. EARIN has six labs and
    six main.py files, so that ran an arbitrary lab and called it the course.
    Now only auto-picked when exactly one exists.
  - Only the first requirements.txt was installed, which is why EARIN still
    died on gymnasium after a venv was created for it. All of them now.
  - The notebook probe accepted jupyter being on PATH. This machine's jupyter
    is a pipx shim whose interpreter is gone, so "runnable" was a lie; it now
    invokes jupyter --version and PBAD/twm_4 report blocked, honestly.
  - Nothing ran a course's tests. Where a suite exists it is now the check,
    which matters most for ECRYPT_PROJECT, whose program prompts on stdin and
    cannot be run headlessly at all.
  - Which directory pytest runs from is course-specific and unguessable, so
    stubs pass --test-dir: ECOTE needs program/ for imports, ECRYPT_PROJECT
    needs sieve/ because its fixtures open a CSV by relative path.

gates/known-incomplete.txt records the one file that genuinely cannot build:
EOOP/Various/set/set.cpp includes set.hpp, which `git log --all` shows has
never existed here. The course supplied it and only the .cpp was submitted.
That is a factual record with a stated check, not a lint allowlist -- and
fabricating the header would be inventing coursework.

Status is now 36 runnable / 5 no-code / 3 blocked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0172dj34FDpao6wsix8ZuCzE
2026-08-28 18:52:31 +02:00

83 lines
3.8 KiB
TeX

\documentclass{article}
\usepackage[utf8]{inputenc}
% T1 is required for Polish ogonek characters; without it pdflatex
% fails with "Command \k unavailable in encoding OT1".
\usepackage[T1]{fontenc}[11pt]
\usepackage{graphicx}
\usepackage{float}
\title{ERSMS, Group F, Project Documentation}
\author{Hubert Dwornik, Michał Łezka, Jakub Mazur \\ Michał Sar, Krzysztof Rudnicki}
\begin{document}
\maketitle
\section{System Architecture}
We have designed and implemented 4 microservices,
all of microservices are written in Python using Flask framework
\paragraph{AI recommendations}
Based on a list of movies ids, calculates and returns list of ids recommended for user who likes given movies
\paragraph{Analytics}
Holds information about number of
ratings, number of users,
average movie ratings, ratings of
given user which are later used in
webinterface to show data for admins
concerning website usage
\paragraph{Notifications}
Notifies user whenever there is a new movie recommend by AI recommender for them
\paragraph{Backend}
Updates database and mantains all ongoing and incoming communication between all microservices, both between microservies and from microservices to the webinterface
\paragraph{Caching}
We implemented two caches
\begin{enumerate}
\item Backend is cached inside Analytics Service \\
Analytics service holds tata about users and movies,
in order to not pull all the data from backend every time we update analytics
(for example every day), we keep the cache of backend date in our analytics
service
\item AI recommendations are cached inside Notification Service \\
AI recommendations can change whenever new movie appears, notification
service keeps the cache of ai recommendation service in order to not
pull all the data from the ai recommendation every time it wants to notify
the users about new movies to recommend
\end{enumerate}
\paragraph{Database}
We use postgresql database to contain data about users, movies and user ratings
\begin{figure}[H]
\caption{System architecture representation, webinterface although not part of microservices included to show relation with backend}
\centering
\includegraphics[width=\textwidth]{images/systemArchitecture.drawio.pdf}
\end{figure}
\section{Automated Infrastructure Management solution}
We use \textbf{Dockerfiles}
for each microservice, webinterface and database which
later get combined in docker compose file, after each commit on
\textbf{GitHub} main repository docker compose gets automatically run
on \textbf{Google Cloud} platform and deployed
\section{Federated authorization and authentication management in the project}
We use industry standard \textbf{OAuth} protocol in our webinterface,
user creates their account and logs in, we use user token to
authorize their access on backend to their ratings and
recommendations. We use \textbf{firebase} services to manage OAuth protocol.
\section{Threat model with mitigations}
Our single most important asset are user likes for specific movies \\
We expect either bots or human agents trying to access those likes for a specific users or to modify user ratings to improve or decrease certain movies ratings \\
To mitigate that we use:
\begin{enumerate}
\item Certificates on our frontend, which encrypt data transmitted between website and user
\item OAuth which is used to authenticate user and lower amount of bots accessing our Infrastructure
\item TLS encryption between our microservices so that even our inside communication is encrypted
\item Google cloud default security policies allowing us to monitor odd and potentially harmfull behaviours
\end{enumerate}
\begin{figure}[H]
\caption{Threat model}
\centering
\includegraphics[width=\textwidth]{images/threat_model.png}
\end{figure}
\end{document}