@startuml Get All Companies (GET)

header Get All Companies Sequence Diagram
title "Get All Companies (GET)"

participant "Client" as client
participant "<<javaScript>>\n:server" as server
participant "<<router>>\n:companies" as routerCompanies
participant "<<middleware>>\n:auth" as authMiddleware
participant "<<controllers>>\n:companies" as controllersCompanies
participant "<<model>>\n:User" as modelUser
participant "<<model>>\n:Company" as modelCompanies
database "<<MongoDB>>\n:users" as UsersDatabase
database "<<MongoDB>>\n:companies" as CompaniesDatabase

client -> server ++:req.get('/companies')
server -> routerCompanies ++:app.use("/companies", companies)
routerCompanies -> authMiddleware ++:protect(req, res, next)
alt !token 
    authMiddleware -> client :response
else token
    authMiddleware -> modelUser ++:findById(decoded.id)
    modelUser -> UsersDatabase ++: UserSchema
    UsersDatabase --> modelUser --: user
    modelUser -> authMiddleware --: user
    alt !user
        authMiddleware -> client :response
    else user
        authMiddleware -> controllersCompanies ++:getCompanies(req, res, next)
        controllersCompanies -> modelCompanies ++:find(req.query)
        modelCompanies -> CompaniesDatabase ++: CompanySchema
        CompaniesDatabase --> modelCompanies --: companies
        controllersCompanies <-- modelCompanies --: companies
        controllersCompanies -> modelCompanies ++:countDocuments(req.query)
        modelCompanies -> CompaniesDatabase ++: CompanySchema
        CompaniesDatabase --> modelCompanies --: total
        controllersCompanies <-- modelCompanies --: total
        controllersCompanies -> client --: response
    end
end

@enduml