Reputation: 43501
Specifically, bluebird
compatible promises
pseudo code is shown below
if authentication
db.findUser(authentication.userId).then (dbUser) ->
sessionLogin dbUser
# Done!
else
if isSession req.user
db.findUser(req.user.id).then (dbUser) ->
db.addUserAuth(req.user.id, authentication).then (dbAuth) ->
return
else
db.createUser(userDetails).then (dbUser) ->
db.addUserAuth(dbUser.id, authentication).then (dbAuth) ->
return
# Once all of that is done, do the following
if cookieSet
db.findInvite(cookie.invitation).then (dbInvitation) ->
if dbInvitation.Team
db.createTeamMember(dbInvitation.Team, dbUser.id).then ->
db.updateInvitation(marked: true).then ->
done
else
done
else
done
I am not looking necessarily for exact code, pseudo code or an idea will do fine. This is written in CoffeeScript, by the way, although that shouldn't matter.
Upvotes: 1
Views: 62
Reputation: 276306
Well, promises chain but they don't magically abstract branching logic like if/else - you'd still use conditionals for that. Your code is very callbacky though - you can utilize the fact promises are proxies for values and greatly simplify it:
if authentication
user = db.findUser(authentication.userId)
user_login = user.then (dbUser) -> sessionLogin dbUser
auth_user = user.return(user_login).return(user) # wait but keep value
else
user = db.findUser(req.user.id) if isSession req.user else db.createUser(userDetails)
auth_user = user.then(user->db.addUserAuth(req.user.id, authentication)).return(user)
auth_user.then (user) ->
if cookieSet
db.findInvite(cookie.invitation)
.then (invite) ->
if invite and invite.Team
db.createTeamMember(dbInvitation.Team, dbUser.id)
.then val ->
db.updateInvitation(marked: true) if val
Upvotes: 3
Reputation: 664538
It wouldn't look much different actually, just put the promises together:
(if authentication
db.findUser(authentication.userId).then (dbUser) ->
sessionLogin dbUser
.return dbUser
else
(if isSession req.user
db.findUser(req.user.id)
else
db.createUser(userDetails)
).then (dbUser) ->
db.addUserAuth(dbUser.id, authentication)
.return dbUser
).then (dbUser) ->
if cookieSet
db.findInvite(cookie.invitation).then (dbInvitation) ->
if dbInvitation.Team
db.createTeamMember(dbInvitation.Team, dbUser.id).then ->
db.updateInvitation(marked: true)
.then ->
done
Upvotes: 1