2015-04-01 14:56:48 -04:00
|
|
|
async = require 'async'
|
|
|
|
mongoose = require 'mongoose'
|
|
|
|
Handler = require '../commons/Handler'
|
|
|
|
Clan = require './Clan'
|
2015-04-03 14:05:37 -04:00
|
|
|
EarnedAchievement = require '../achievements/EarnedAchievement'
|
2015-04-02 20:00:28 -04:00
|
|
|
User = require '../users/User'
|
|
|
|
UserHandler = require '../users/user_handler'
|
2015-04-01 14:56:48 -04:00
|
|
|
|
|
|
|
ClanHandler = class ClanHandler extends Handler
|
|
|
|
modelClass: Clan
|
|
|
|
jsonSchema: require '../../app/schemas/models/Clan.schema'
|
|
|
|
allowedMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
|
|
|
|
|
|
|
|
hasAccess: (req) ->
|
|
|
|
return true if req.method in ['GET']
|
|
|
|
return true if req.user? and not req.user.isAnonymous()
|
|
|
|
false
|
|
|
|
|
|
|
|
hasAccessToDocument: (req, document, method=null) ->
|
|
|
|
method = (method or req.method).toLowerCase()
|
|
|
|
return true if req.user?.isAdmin()
|
|
|
|
return true if method is 'get'
|
2015-04-02 14:44:18 -04:00
|
|
|
return true if document.get('ownerID')?.equals req.user._id
|
2015-04-01 14:56:48 -04:00
|
|
|
false
|
|
|
|
|
|
|
|
makeNewInstance: (req) ->
|
2015-04-01 18:24:45 -04:00
|
|
|
userName = req.user.get('name') ? 'Anoner'
|
2015-04-01 14:56:48 -04:00
|
|
|
instance = super(req)
|
|
|
|
instance.set 'ownerID', req.user._id
|
2015-04-02 20:00:28 -04:00
|
|
|
instance.set 'members', [req.user._id]
|
2015-04-01 14:56:48 -04:00
|
|
|
instance
|
|
|
|
|
2015-04-02 14:44:18 -04:00
|
|
|
delete: (req, res, clanID) ->
|
|
|
|
@getDocumentForIdOrSlug clanID, (err, clan) =>
|
|
|
|
return @sendDatabaseError res, err if err
|
|
|
|
return @sendNotFoundError res unless clan
|
|
|
|
return @sendForbiddenError res unless @hasAccessToDocument(req, clan)
|
2015-04-02 20:00:28 -04:00
|
|
|
memberIDs = clan.get('members')
|
2015-04-02 14:44:18 -04:00
|
|
|
Clan.remove {_id: clan.get('_id')}, (err) =>
|
|
|
|
return @sendDatabaseError res, err if err
|
2015-04-02 20:00:28 -04:00
|
|
|
User.update {_id: {$in: memberIDs}}, {$pull: {clans: clan.get('_id')}}, {multi: true}, (err) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
@sendNoContent(res)
|
2015-04-02 14:44:18 -04:00
|
|
|
|
2015-04-01 18:24:45 -04:00
|
|
|
getByRelationship: (req, res, args...) ->
|
|
|
|
return @joinClan(req, res, args[0]) if args[1] is 'join'
|
2015-04-01 19:00:39 -04:00
|
|
|
return @leaveClan(req, res, args[0]) if args[1] is 'leave'
|
2015-04-03 14:05:37 -04:00
|
|
|
return @getMemberAchievements(req, res, args[0]) if args[1] is 'member_achievements'
|
2015-04-02 20:00:28 -04:00
|
|
|
return @getMembers(req, res, args[0]) if args[1] is 'members'
|
2015-04-03 15:22:44 -04:00
|
|
|
return @getPublicClans(req, res) if args[1] is 'public'
|
2015-04-02 14:01:37 -04:00
|
|
|
return @removeMember(req, res, args[0], args[2]) if args.length is 3 and args[1] is 'remove'
|
2015-04-01 18:24:45 -04:00
|
|
|
super(arguments...)
|
|
|
|
|
|
|
|
joinClan: (req, res, clanID) ->
|
|
|
|
return @sendForbiddenError(res) unless req.user? and not req.user.isAnonymous()
|
2015-04-02 20:00:28 -04:00
|
|
|
try
|
|
|
|
clanID = mongoose.Types.ObjectId(clanID)
|
|
|
|
catch err
|
|
|
|
return @sendNotFoundError(res, err)
|
2015-04-01 18:24:45 -04:00
|
|
|
Clan.findById clanID, (err, clan) =>
|
2015-04-02 20:00:28 -04:00
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
Clan.update {_id: clanID}, {$addToSet: {members: req.user._id}}, (err) =>
|
2015-04-01 18:24:45 -04:00
|
|
|
return @sendDatabaseError(res, err) if err
|
2015-04-02 20:00:28 -04:00
|
|
|
User.update {_id: req.user._id}, {$addToSet: {clans: clanID}}, (err) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
@sendSuccess(res)
|
2015-04-01 18:24:45 -04:00
|
|
|
|
2015-04-01 19:00:39 -04:00
|
|
|
leaveClan: (req, res, clanID) ->
|
|
|
|
return @sendForbiddenError(res) unless req.user? and not req.user.isAnonymous()
|
2015-04-02 20:00:28 -04:00
|
|
|
try
|
|
|
|
clanID = mongoose.Types.ObjectId(clanID)
|
|
|
|
catch err
|
|
|
|
return @sendNotFoundError(res, err)
|
2015-04-01 19:00:39 -04:00
|
|
|
Clan.findById clanID, (err, clan) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
return @sendForbiddenError(res) if clan.get('ownerID')?.equals req.user._id
|
2015-04-02 20:00:28 -04:00
|
|
|
Clan.update {_id: clanID}, {$pull: {members: req.user._id}}, (err) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
User.update {_id: req.user._id}, {$pull: {clans: clanID}}, (err) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
@sendSuccess(res)
|
|
|
|
|
2015-04-03 14:05:37 -04:00
|
|
|
getMemberAchievements: (req, res, clanID) ->
|
|
|
|
# TODO: add tests
|
|
|
|
Clan.findById clanID, (err, clans) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
memberIDs = _.map clans.get('members') ? [], (memberID) -> memberID.toHexString()
|
|
|
|
EarnedAchievement.find {user: {$in: memberIDs}}, (err, documents) =>
|
|
|
|
return @sendDatabaseError(res, err) if err?
|
|
|
|
cleandocs = (@formatEntity(req, doc) for doc in documents)
|
|
|
|
@sendSuccess(res, cleandocs)
|
|
|
|
|
2015-04-02 20:00:28 -04:00
|
|
|
getMembers: (req, res, clanID) ->
|
2015-04-03 14:05:37 -04:00
|
|
|
# TODO: add tests
|
|
|
|
return @sendForbiddenError(res) unless req.user? and not req.user.isAnonymous()
|
2015-04-02 20:00:28 -04:00
|
|
|
clanIDs = req.user.get('clans') ? []
|
|
|
|
Clan.findById clanID, (err, clans) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
memberIDs = clans.get('members') ? []
|
|
|
|
User.find {_id: {$in: memberIDs}}, (err, users) =>
|
2015-04-01 19:00:39 -04:00
|
|
|
return @sendDatabaseError(res, err) if err
|
2015-04-02 20:00:28 -04:00
|
|
|
cleandocs = (UserHandler.formatEntity(req, doc) for doc in users)
|
|
|
|
@sendSuccess(res, cleandocs)
|
2015-04-01 19:00:39 -04:00
|
|
|
|
2015-04-03 15:22:44 -04:00
|
|
|
getPublicClans: (req, res) ->
|
|
|
|
# Return 100 public clans, sorted by member count, created date
|
|
|
|
query = [{ $match : {type : 'public'} }]
|
|
|
|
query.push {$project : {_id: 1, name: 1, slug: 1, type: 1, members: 1, memberCount: {$size: "$members"}, ownerID: 1}}
|
|
|
|
query.push {$sort: { memberCount: -1, _id: -1 }}
|
|
|
|
query.push {$limit: 100}
|
|
|
|
Clan.aggregate(query).exec (err, documents) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
@sendSuccess(res, documents)
|
|
|
|
|
2015-04-02 14:01:37 -04:00
|
|
|
removeMember: (req, res, clanID, memberID) ->
|
|
|
|
return @sendForbiddenError(res) unless req.user? and not req.user.isAnonymous()
|
|
|
|
try
|
|
|
|
clanID = mongoose.Types.ObjectId(clanID)
|
|
|
|
memberID = mongoose.Types.ObjectId(memberID)
|
|
|
|
catch err
|
2015-04-02 14:44:18 -04:00
|
|
|
return @sendNotFoundError(res, err)
|
2015-04-02 14:01:37 -04:00
|
|
|
Clan.findById clanID, (err, clan) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
2015-04-02 14:44:18 -04:00
|
|
|
return @sendForbiddenError res unless @hasAccessToDocument(req, clan)
|
2015-04-02 14:01:37 -04:00
|
|
|
return @sendForbiddenError(res) if clan.get('ownerID').equals memberID
|
2015-04-02 20:00:28 -04:00
|
|
|
Clan.update {_id: clanID}, {$pull: {members: memberID}}, (err) =>
|
2015-04-02 14:01:37 -04:00
|
|
|
return @sendDatabaseError(res, err) if err
|
2015-04-02 20:00:28 -04:00
|
|
|
User.update {_id: memberID}, {$pull: {clans: clanID}}, (err) =>
|
|
|
|
return @sendDatabaseError(res, err) if err
|
|
|
|
@sendSuccess(res)
|
2015-04-02 14:01:37 -04:00
|
|
|
|
2015-04-01 14:56:48 -04:00
|
|
|
module.exports = new ClanHandler()
|