@startuml

' hide footbox
skinparam sequenceArrowThickness 1.5
skinparam fontsize 50
autonumber 1 "<b>[###]"
skinparam component {
skinparam defaultFontSize 16
'FontSize 13
'BackgroundColor<<Apache>> Red
'BorderColor<<Apache>> #FF6655
'FontName Courier
'BorderColor black
'BackgroundColor gold
'ArrowFontName Impact
ArrowFontSize 15
'ArrowColor #FF6655
'ArrowFontColor #777777
}
'skinparam backgroundColor #EEEBDC
Mainframe <b>Delete Single Booking</b>

actor "<b>User" as user <<(A,#ADD1B2)client>>#White
Box Online Job Fair Registration System #lightgrey
participant "server" as server <<(B,#FFFFFF)main>>#Orange
'participant "auth" as rauth <<(C,#FFFFFF)routes>>#Gold
participant "bookings" as rbookings <<(C,#FFFFFF)routes>>#Gold
'participant "companies" as rcompanies <<(C,#FFFFFF)routes>>#Gold
participant "auth" as middleware_auth <<(E,#FFFFFF)middleware>>#Pink
'participant "<b>auth" as controllers_auth <<(D,#FFFFFF)controllers>>#LightGreen
participant "<b>bookings" as controllers_bookings <<(D,#FFFFFF)controllers>>#LightGreen
'participant "<b>companies" as controllers_companies <<(F,#FFFFFF)controllers>>#LightGreen
' participant "<b>:Company" as models_Company <<(F,#FFFFFF)models>>#LightBlue
participant "<b>:Booking" as models_Booking <<(G,#FFFFFF)models>>#LightBlue
participant "<b>:User" as models_User <<(H,#FFFFFF)models>>#LightBlue
participant "MongoDB" as mongo <<(I,#FFFFFF)data base>>#d9d2e9
end box

|||
Activate user
user->server: req.delete('\n/bookings/:id')
Activate server
'Route'
server->rbookings: app.use('\n/bookings',\n bookings)
DeActivate server
Activate rbookings
'Middleware auth
rbookings->middleware_auth: protect
DeActivate rbookings
Activate middleware_auth
middleware_auth->middleware_auth: jwt.verify(token)
Alt#Gold #Beige no token or invalid token
middleware_auth-->user: response fail
Else #LightBlue else
middleware_auth->models_User: findById\n(decoded.id)
Activate models_User
models_User->mongo: UserSchema
Activate mongo
mongo-->models_User: user
DeActivate mongo
models_User-->middleware_auth: user
DeActivate models_User
middleware_auth->middleware_auth: authorize\n('admin', 'user')
Alt#Gold #Beige role != admin or user
middleware_auth-->user: response fail
Else #LightBlue else
middleware_auth->controllers_bookings: deleteBooking
DeActivate middleware_auth
Activate controllers_bookings
controllers_bookings->models_Booking: findById\n(req.params.id)
Activate models_Booking
models_Booking->mongo: BookingSchema
Activate mongo
mongo-->models_Booking: booking
DeActivate mongo
models_Booking-->controllers_bookings: booking
DeActivate models_Booking
Alt#Gold #Beige invalid booking id
controllers_bookings-->user: response fail
Else #LightBlue else
Alt#Gold #Beige not the user's own booking and role != admin
controllers_bookings-->user: response fail
Else #LightBlue else
controllers_bookings->models_Booking: remove()
Activate models_Booking
models_Booking->mongo: BookingSchema
Activate mongo
mongo-->models_Booking: Booking
DeActivate mongo
models_Booking-->controllers_bookings: Booking
DeActivate models_Booking
controllers_bookings-->user: response removal success
DeActivate controllers_bookings
End Alt
End Alt
End Alt
End Alt
DeActivate user






' rbookings->middleware_auth: delete(\nprotect)
' Activate middleware_auth
' middleware_auth->middleware_auth: verify(token,\nJWT_SECRET)
' middleware_auth->models_User: findById(decoded.id)
' Activate models_User
' models_User->mongo: UserSchema
' Activate mongo
' mongo-->models_User: user
' DeActivate mongo
' models_User-->middleware_auth: user
' DeActivate models_User
' middleware_auth->rbookings: next()
' rbookings->middleware_auth: delete(\nauthorize)
' middleware_auth->rbookings: next()
' DeActivate middleware_auth
' Alt#Gold #Pink Unauthorized
' |||
' rbookings-->server: unauth-\norized
' |||
' 'End middleware auth'
' 'Controller bookings'
' 'verify'
' Else #LightBlue Authorized
' rbookings->controllers_bookings: delete(\ndeleteBooking)
' DeActivate rbookings
' Activate controllers_bookings
' controllers_bookings->models_Booking: findById(req.params.id)
' Activate models_Booking
' models_Booking->mongo: BookingSchema
' Activate mongo
' mongo-->models_Booking: booking
' DeActivate mongo
' models_Booking-->controllers_bookings: booking
' DeActivate models_Booking
' controllers_bookings->controllers_bookings: verify(role,\nexistedBookings)
' 'End verify'
' 'Fail path'
' Alt#Gold #Pink Verification fail
' |||
' controllers_bookings-->server: delete fail
' |||
' 'Success path'
' Else #LightGreen Verification successful
' |||
' controllers_bookings->models_Booking: remove()
' Activate models_Booking
' models_Booking->mongo: BookingSchema
' Activate mongo
' mongo-->models_Booking: booking
' DeActivate mongo
' models_Booking-->controllers_bookings: booking
' DeActivate models_Booking
' controllers_bookings-->server: delete success
' DeActivate controllers_bookings
' |||
' End Alt
' End Alt
' server-->user: response
' DeActivate server
' DeActivate user
|||


skinparam sequence {
'Box ==============================
BoxBorderColor Black
BoxFontColor Blue
BoxFontSize 16
'LifeLine + Arrow ==============================
'ArrowColor DeepSkyBlue
LifeLineBorderColor Black
LifeLineBackgroundColor #FFFF99
'Participant ==============================
ParticipantBorderColor Black
'ParticipantBackgroundColor DodgerBlue
StereoTypeFontSize 14
ParticipantFontSize 16
ParticipantFontColor #0c0c0c
'ParticipantFontName Impact
'Actor ==============================
ActorBorderColor Black
ActorBackgroundColor White
ActorFontSize 16
ActorFontColor Black
'ActorFontName Aapex
' ===================================
}

@enduml