mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-01 03:16:56 -05:00
116c7d0bf2
Adding level session ID where applicable. Slimming down fields for most common events.
39 lines
1.8 KiB
CoffeeScript
39 lines
1.8 KiB
CoffeeScript
AnalyticsString = require '../analytics/AnalyticsString'
|
|
mongoose = require 'mongoose'
|
|
|
|
module.exports =
|
|
isID: (id) -> _.isString(id) and id.length is 24 and id.match(/[a-f0-9]/gi)?.length is 24
|
|
objectIdFromTimestamp: (timestamp) ->
|
|
# mongoDB ObjectId contains creation date in first 4 bytes
|
|
# So, it can be used instead of a redundant created field
|
|
# http://docs.mongodb.org/manual/reference/object-id/
|
|
# http://stackoverflow.com/questions/8749971/can-i-query-mongodb-objectid-by-date
|
|
# Convert string date to Date object (otherwise assume timestamp is a date)
|
|
timestamp = new Date(timestamp) if typeof(timestamp) == 'string'
|
|
# Convert date object to hex seconds since Unix epoch
|
|
hexSeconds = Math.floor(timestamp/1000).toString(16)
|
|
# Create an ObjectId with that hex timestamp
|
|
mongoose.Types.ObjectId(hexSeconds + "0000000000000000")
|
|
getAnalyticsStringID: (str, callback) ->
|
|
return callback -1 unless str?
|
|
@analyticsStringCache ?= {}
|
|
return callback @analyticsStringCache[str] if @analyticsStringCache[str]
|
|
|
|
insertString = =>
|
|
# http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-optimistic-loop
|
|
AnalyticsString.find({}, {_id: 1}).sort({_id: -1}).limit(1).exec (err, documents) =>
|
|
if err? then return callback -1
|
|
seq = if documents.length > 0 then documents[0]._id + 1 else 1
|
|
doc = new AnalyticsString _id: seq, v: str
|
|
doc.save (err) =>
|
|
if err? then return callback -1
|
|
@analyticsStringCache[str] = seq
|
|
callback seq
|
|
|
|
# Find existing string
|
|
AnalyticsString.findOne(v: str).exec (err, document) =>
|
|
if err? then return callback -1
|
|
if document
|
|
@analyticsStringCache[str] = document._id
|
|
return callback @analyticsStringCache[str]
|
|
insertString()
|