@startuml

footer Page %page% of %lastpage%
title "Get Reservation for user, admin and company"


actor "User" as user
actor "Admin" as admin
actor "Company" as company
participant "server" as server
participant "<<router>>\nreservation" as routerReserv
participant "<<middleware>>\nauth" as middleAuth
participant "<<controllers>>\nreservation" as controllersReserv
participant "<<model>>\nUser" as modelUser
participant "<<model>>\nReservation" as modelReserv
participant "<<model>>\nCompany" as modelComp
database "MongoDB" as mongoDB

group Loop
    'get reservations for user
    group opt 
        activate user
        activate server
        activate routerReserv
        activate middleAuth
        activate controllersReserv
        activate modelUser
        activate modelReserv
        activate mongoDB
        activate admin
        activate company
        activate modelComp
        user->server :getReservations(token)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelUser : User.findBy(decodetoken)
        modelUser -> mongoDB : findById(decodetoken)

        modelUser <-- mongoDB : user
        middleAuth <-- modelUser : user
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/',getReservations)
        controllersReserv -> modelUser :  User.findById(req.user.id)\n.populate({path:'reservation\n,select:'timeslot',populate:{\npath:'timeslot',model:'TimeSlot'\n,select:'company date startTime\nendTime'}});
        modelUser -> mongoDB :  find(req.user.id)\n.populate({path:'reservation\n,select:'timeslot',populate:{\npath:'timeslot',model:'TimeSlot'\n,select:'company date startTime\nendTime'}});

        modelUser <-- mongoDB : user + reservation detail
        controllersReserv <-- modelUser : user + reservation detail
        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        user <-- server : return
    end

    'get reservations for admin
     group opt 
        admin->server :getReservations(token)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelUser : User.findBy(decodetoken)
        modelUser -> mongoDB : findById(decodetoken)

        modelUser <-- mongoDB : admin
        middleAuth <-- modelUser : admin
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/',getReservations)
        controllersReserv -> modelReserv :  Reservation.find().populate({\npath:'timeslot',select:'company \ndate startTime endTime'});
        modelReserv -> mongoDB :  find().populate({\npath:'timeslot',select:\n'company date\n startTime endTime'});

        modelReserv <-- mongoDB : all reservation
        controllersReserv <-- modelReserv : all reservation
        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        admin <-- server : return
    end

    'get reservations for compaany
    group opt 
        company->server :getReservations(token)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelComp : Company.findBy(decodetoken)
        modelComp -> mongoDB : findById(decodetoken)

        modelComp <-- mongoDB : company
        middleAuth <-- modelComp : company
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/',getReservations)
        controllersReserv -> modelReserv :  Reservation.find({company: req.params.companyId})\n.populate({path:'timeslot',select: 'company date\nstartTime endTime'});
        modelReserv -> mongoDB :  find({company: req.params.companyId})\n.populate({path:'timeslot',select:\n'company date startTime endTime'});

        modelReserv <-- mongoDB : reservation
        controllersReserv <-- modelReserv : reservation
        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        company <-- server : return
    end

    'get single reservation for user
    group opt 
        user->server :getReservation(token,id)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelUser : User.findBy(decodetoken)
        modelUser -> mongoDB : findById(decodetoken)

        modelUser <-- mongoDB : user
        middleAuth <-- modelUser : user
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/:id',getReservation)
        controllersReserv -> modelReserv : Reservation.findById(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});
        modelReserv -> mongoDB :  find(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});

        modelReserv <-- mongoDB : reservation
        controllersReserv <-- modelReserv : reservation

        controllersReserv -> controllersReserv : if(reservation.user.toString() !== req.user.id)

        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        user <-- server : return
    end

    'get single reservation for admin
    group opt 
        admin->server :getReservation(token,id)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelUser : User.findBy(decodetoken)
        modelUser -> mongoDB : findById(decodetoken)

        modelUser <-- mongoDB : admin
        middleAuth <-- modelUser : admin
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/:id',getReservation)
        controllersReserv -> modelReserv : Reservation.findById(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});
        modelReserv -> mongoDB :  find(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});

        modelReserv <-- mongoDB : reservation
        controllersReserv <-- modelReserv : reservation
        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        admin <-- server : return
    end

    'get single reservation for company
    group opt 
        company->server :getReservation(token,id)
        server->routerReserv :use('/api/reservation'\n,reservation)
        routerReserv -> middleAuth : protect(token)
        middleAuth -> middleAuth : decode(token)
        middleAuth -> modelComp : Company.findBy(decodetoken)
        modelComp -> mongoDB : findById(decodetoken)

        modelComp <-- mongoDB : company
        middleAuth <-- modelComp : company
        routerReserv <-- middleAuth : next()

        routerReserv -> controllersReserv : get('/:id',getReservation)
        controllersReserv -> modelReserv : Reservation.findById(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});
        modelReserv -> mongoDB :  find(req.params.id)\n.populate({path: 'timeslot',select:'company\ndate startTime endTime'});

        modelReserv <-- mongoDB : reservation
        controllersReserv <-- modelReserv : reservation

        controllersReserv -> controllersReserv : if(reservation.timeslot\n.company.toString() !== req.user.id)

        routerReserv <-- controllersReserv : return
        server <-- routerReserv : return
        company <-- server : return
    end

    

end

@enduml



