mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-26 12:50:31 -04:00
Implementing task log object
This commit is contained in:
parent
73b0d98538
commit
350384f5cb
3 changed files with 59 additions and 13 deletions
server
|
@ -37,3 +37,6 @@ module.exports.serverError = (res, message='Internal Server Error') ->
|
|||
module.exports.gatewayTimeoutError = (res, message="Gateway timeout") ->
|
||||
res.send 504, message
|
||||
res.end()
|
||||
|
||||
module.exports.clientTimeout = (res, message="The server did not recieve the client response in a timely manner") ->
|
||||
res.send 408
|
|
@ -8,6 +8,7 @@ db = require './../routes/db'
|
|||
mongoose = require 'mongoose'
|
||||
queues = require '../commons/queue'
|
||||
LevelSession = require '../levels/sessions/LevelSession'
|
||||
TaskLog = require './task/ScoringTask'
|
||||
|
||||
scoringTaskQueue = undefined
|
||||
scoringTaskTimeoutInSeconds = 20
|
||||
|
@ -28,17 +29,28 @@ module.exports.setup = (app) -> connectToScoringQueue()
|
|||
|
||||
|
||||
module.exports.dispatchTaskToConsumer = (req, res) ->
|
||||
scoringTaskQueue.receiveMessage (err, message) ->
|
||||
return errors.gatewayTimeoutError res, "No messages were receieved from the queue" if message.isEmpty()
|
||||
|
||||
userID = getUserIDFromRequest req
|
||||
return errors.forbidden res, "You need to be logged in to simulate games" unless userID?
|
||||
|
||||
scoringTaskQueue.receiveMessage (taskQueueReceiveError, message) ->
|
||||
if message.isEmpty() or taskQueueReceiveError?
|
||||
return errors.gatewayTimeoutError res, "No messages were receieved from the queue.#{taskQueueReceiveError}"
|
||||
|
||||
messageBody = parseTaskQueueMessage req, res, message
|
||||
return errors.serverError res, "There was an error parsing the queue message" unless messageBody?
|
||||
#Create task record here in database
|
||||
|
||||
constructTaskObject messageBody, (taskConstructionError, taskObject) ->
|
||||
return errors.serverError res, "There was an error constructing the scoring task" if taskConstructionError?
|
||||
message.changeMessageVisibilityTimeout scoringTaskTimeoutInSeconds
|
||||
sendResponseObject req, res, taskObject
|
||||
|
||||
message.changeMessageVisibilityTimeout scoringTaskTimeoutInSeconds + 10 #10 seconds processing time
|
||||
|
||||
constructTaskLogObject userID,message.getReceiptHandle(), (taskLogError, taskLogObject) ->
|
||||
return errors.serverError res, "There was an error creating the task log object." if taskLogError?
|
||||
|
||||
taskObject.taskLogID = taskLogObject._id
|
||||
|
||||
sendResponseObject req, res, taskObject
|
||||
|
||||
|
||||
parseTaskQueueMessage = (req, res, message) ->
|
||||
|
@ -46,8 +58,21 @@ parseTaskQueueMessage = (req, res, message) ->
|
|||
return messageBody = JSON.parse message.getBody()
|
||||
catch e
|
||||
sendResponseObject req, res, {"error":"There was an error parsing the task.Error: #{e}" }
|
||||
null
|
||||
return null
|
||||
|
||||
getUserIDFromRequest = (req) ->
|
||||
if req.user? and req.user._id?
|
||||
return req.user._id
|
||||
else
|
||||
return null
|
||||
|
||||
constructTaskLogObject = (calculatorUserID, messageIdentifierString, callback) ->
|
||||
taskLogObject = new TaskLog
|
||||
"calculator":calculatorUserID
|
||||
"sentDate": Date.now()
|
||||
"messageIdentifierString":messageIdentifierString
|
||||
|
||||
taskLogObject.save callback
|
||||
|
||||
constructTaskObject = (taskMessageBody, callback) ->
|
||||
async.map taskMessageBody.sessions, getSessionInformation, (err, sessions) ->
|
||||
|
@ -55,7 +80,7 @@ constructTaskObject = (taskMessageBody, callback) ->
|
|||
|
||||
taskObject =
|
||||
"messageGenerated": Date.now()
|
||||
"players": []
|
||||
"sessions": []
|
||||
|
||||
for session in sessions
|
||||
sessionInformation =
|
||||
|
@ -63,7 +88,7 @@ constructTaskObject = (taskMessageBody, callback) ->
|
|||
"sessionChangedTime": session.changed
|
||||
"team": session.team? "No team"
|
||||
"code": session.code
|
||||
taskObject.players.push sessionInformation
|
||||
taskObject.sessions.push sessionInformation
|
||||
callback err, taskObject
|
||||
|
||||
|
||||
|
@ -92,18 +117,21 @@ module.exports.processTaskResult = (req, res) ->
|
|||
clientResponseObject = parseClientResponseObject req, res
|
||||
|
||||
if clientResponseObject?
|
||||
return handleTimedOutTask clientResponseObject if hasTaskTimedOut clientResponseObject
|
||||
|
||||
return handleTimedOutTask req, res, clientResponseObject if hasTaskTimedOut clientResponseObject
|
||||
|
||||
logTaskComputation clientResponseObject
|
||||
updateScores clientResponseObject
|
||||
|
||||
|
||||
hasTaskTimedOut = (taskBody) ->
|
||||
return false
|
||||
|
||||
handleTimedOutTask = (taskBody) ->
|
||||
#probably mark the task log as incomplete
|
||||
return false
|
||||
taskBody.messageGenerated + scoringTaskTimeoutInSeconds < Date.now()
|
||||
|
||||
handleTimedOutTask = (req, res, taskBody) ->
|
||||
errors.clientError res, "The task results were not provided within a timely manner"
|
||||
|
||||
|
||||
|
||||
parseClientResponseObject = (req, res) ->
|
||||
try
|
||||
|
@ -119,6 +147,8 @@ updateScores = (taskObject) ->
|
|||
return
|
||||
|
||||
|
||||
|
||||
|
||||
###Sample Messages
|
||||
sampleQueueMessage =
|
||||
sessions: [
|
||||
|
@ -128,6 +158,7 @@ sampleQueueMessage =
|
|||
|
||||
sampleUndoneTaskObject =
|
||||
"taskID": "507f191e810c19729de860ea"
|
||||
"messageGenerated": 1391811773418
|
||||
"sessions" : [
|
||||
{
|
||||
"ID":"52dfeb17c8b5f435c7000025"
|
||||
|
|
12
server/queues/task/ScoringTask.coffee
Normal file
12
server/queues/task/ScoringTask.coffee
Normal file
|
@ -0,0 +1,12 @@
|
|||
mongoose = require('mongoose')
|
||||
|
||||
ScoringTaskSchema = new mongoose.Schema(
|
||||
calculator: {type:mongoose.Schema.Types.ObjectId}
|
||||
sentDate: {type: Date}
|
||||
messageIdentifierString: {type: String}
|
||||
calculationTimeMS: {type: Number, default: 0}
|
||||
sessions: {type: Array, default: []}
|
||||
)
|
||||
|
||||
ScoringTaskSchema.set 'capped', 104857600 #100MB capped collection
|
||||
module.exports = mongoose.model('scoringTask', ScoringTaskSchema)
|
Loading…
Add table
Reference in a new issue