2014-04-12 13:51:02 -04:00
c = require ' ./../schemas '
2014-04-12 04:35:56 -04:00
emailSubscriptions = [ ' announcement ' , ' tester ' , ' level_creator ' , ' developer ' , ' article_editor ' , ' translator ' , ' support ' , ' notification ' ]
2014-07-09 14:23:05 -04:00
UserSchema = c . object
title: ' User '
2014-08-23 14:07:52 -04:00
default:
visa: ' Authorized to work in the US '
music: true
name: ' Anoner '
autocastDelay: 5000
emails: { }
permissions: [ ]
anonymous: true
points: 0
preferredLanguage: ' en-US '
aceConfig: { }
simulatedBy: 0
simulatedFor: 0
jobProfile: { }
2014-09-26 05:28:54 -04:00
earned: { heroes: [ ] , items: [ ] , levels: [ ] , gems: 0 }
purchased: { heroes: [ ] , items: [ ] , levels: [ ] , gems: 0 }
2014-07-09 14:23:05 -04:00
c . extendNamedProperties UserSchema # let's have the name be the first property
2014-07-21 12:44:40 -04:00
#Put the various filters in variables for reusability
phoneScreenFilter =
title: ' Phone screened '
type: ' boolean '
description: ' Whether the candidate has been phone screened. '
2014-08-26 14:34:33 -04:00
schoolFilter =
2014-07-21 12:44:40 -04:00
title: ' School '
type: ' string '
enum: [ ' Top School ' , ' Other ' ]
2014-08-26 14:34:33 -04:00
locationFilter =
2014-07-21 12:44:40 -04:00
title: ' Location '
type: ' string '
enum: [ ' Bay Area ' , ' New York ' , ' Other US ' , ' International ' ]
2014-08-26 14:34:33 -04:00
roleFilter =
2014-07-21 12:44:40 -04:00
title: ' Role '
type: ' string '
enum: [ ' Web Developer ' , ' Software Developer ' , ' Mobile Developer ' ]
2014-08-26 14:34:33 -04:00
seniorityFilter =
2014-07-21 12:44:40 -04:00
title: ' Seniority '
type: ' string '
enum: [ ' College Student ' , ' Recent Grad ' , ' Junior ' , ' Senior ' ]
visa = c . shortString
title: ' US Work Status '
description: ' Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.) '
enum: [ ' Authorized to work in the US ' , ' Need visa sponsorship ' ]
2014-09-20 18:18:21 -04:00
2014-07-09 14:23:05 -04:00
_ . extend UserSchema . properties ,
2014-04-12 04:35:56 -04:00
email: c . shortString ( { title: ' Email ' , format: ' email ' } )
2014-11-20 20:03:24 -05:00
iosIdentifierForVendor: c . shortString ( { format: ' hidden ' } )
2014-04-12 04:35:56 -04:00
firstName: c . shortString ( { title: ' First Name ' } )
lastName: c . shortString ( { title: ' Last Name ' } )
gender: { type: ' string ' , ' enum ' : [ ' male ' , ' female ' ] }
2014-06-30 22:16:26 -04:00
password: { type: ' string ' , maxLength: 256 , minLength: 2 , title: ' Password ' }
2014-04-12 04:35:56 -04:00
passwordReset: { type: ' string ' }
photoURL: { type: ' string ' , format: ' image-file ' , title: ' Profile Picture ' , description: ' Upload a 256x256px or larger image to serve as your profile picture. ' }
facebookID: c . shortString ( { title: ' Facebook ID ' } )
2014-08-26 14:34:33 -04:00
githubID: { type: ' integer ' , title: ' GitHub ID ' }
2014-04-12 04:35:56 -04:00
gplusID: c . shortString ( { title: ' G+ ID ' } )
wizardColor1: c . pct ( { title: ' Wizard Clothes Color ' } )
volume: c . pct ( { title: ' Volume ' } )
2014-08-23 14:07:52 -04:00
music: { type: ' boolean ' }
autocastDelay: { type: ' integer ' }
lastLevel: { type: ' string ' }
2014-09-20 18:18:21 -04:00
heroConfig: c . HeroConfigSchema
2014-04-12 04:35:56 -04:00
2014-04-21 19:15:23 -04:00
emailSubscriptions: c . array { uniqueItems: true } , { ' enum ' : emailSubscriptions }
2014-08-23 14:07:52 -04:00
emails: c . object { title: ' Email Settings ' , default: generalNews: { enabled: true } , anyNotes: { enabled: true } , recruitNotes: { enabled: true } } ,
2014-04-21 19:15:23 -04:00
# newsletters
2014-06-30 22:16:26 -04:00
generalNews: { $ref: ' # /definitions/emailSubscription ' }
adventurerNews: { $ref: ' # /definitions/emailSubscription ' }
ambassadorNews: { $ref: ' # /definitions/emailSubscription ' }
archmageNews: { $ref: ' # /definitions/emailSubscription ' }
artisanNews: { $ref: ' # /definitions/emailSubscription ' }
diplomatNews: { $ref: ' # /definitions/emailSubscription ' }
scribeNews: { $ref: ' # /definitions/emailSubscription ' }
2014-04-25 13:46:43 -04:00
2014-04-21 19:15:23 -04:00
# notifications
2014-06-30 22:16:26 -04:00
anyNotes: { $ref: ' # /definitions/emailSubscription ' } # overrides any other notifications settings
recruitNotes: { $ref: ' # /definitions/emailSubscription ' }
employerNotes: { $ref: ' # /definitions/emailSubscription ' }
2014-04-12 04:35:56 -04:00
2015-02-04 16:54:35 -05:00
oneTimes: c . array { title: ' One-time emails ' } ,
2015-02-06 12:47:06 -05:00
c . object { title: ' One-time email ' , required: [ ' type ' , ' email ' ] } ,
2015-02-04 16:54:35 -05:00
type: c . shortString ( ) # E.g 'subscribe modal parent'
2015-02-06 12:47:06 -05:00
email: c . shortString ( )
2015-02-04 16:54:35 -05:00
sent: c . date ( ) # Set when sent
2014-04-12 04:35:56 -04:00
# server controlled
2014-08-23 14:07:52 -04:00
permissions: c . array { } , c . shortString ( )
2014-04-12 04:35:56 -04:00
dateCreated: c . date ( { title: ' Date Joined ' } )
2014-08-23 14:07:52 -04:00
anonymous: { type: ' boolean ' }
2014-04-12 04:35:56 -04:00
testGroupNumber: { type: ' integer ' , minimum: 0 , maximum: 256 , exclusiveMaximum: true }
mailChimp: { type: ' object ' }
hourOfCode: { type: ' boolean ' }
hourOfCodeComplete: { type: ' boolean ' }
2014-09-23 20:13:41 -04:00
lastIP: { type: ' string ' }
2014-04-12 04:35:56 -04:00
emailLower: c . shortString ( )
nameLower: c . shortString ( )
passwordHash: { type: ' string ' , maxLength: 256 }
# client side
emailHash: { type: ' string ' }
#Internationalization stuff
2014-12-04 14:55:53 -05:00
preferredLanguage: { ' enum ' : [ null ] . concat ( c . getLanguageCodeArray ( ) ) }
2014-04-25 13:46:43 -04:00
2014-04-12 04:35:56 -04:00
signedCLA: c . date ( { title: ' Date Signed the CLA ' } )
wizard: c . object { } ,
colorConfig: c . object { additionalProperties: c . colorConfig ( ) }
2014-09-25 16:17:41 -04:00
aceConfig: c . object { default: { language: ' python ' , keyBindings: ' default ' , invisibles: false , indentGuides: false , behaviors: false , liveCompletion: true } } ,
language: { type: ' string ' , ' enum ' : [ ' python ' , ' javascript ' , ' coffeescript ' , ' clojure ' , ' lua ' , ' io ' ] }
2014-08-23 14:07:52 -04:00
keyBindings: { type: ' string ' , ' enum ' : [ ' default ' , ' vim ' , ' emacs ' ] }
invisibles: { type: ' boolean ' }
indentGuides: { type: ' boolean ' }
behaviors: { type: ' boolean ' }
liveCompletion: { type: ' boolean ' }
2014-04-12 04:35:56 -04:00
2014-08-23 14:07:52 -04:00
simulatedBy: { type: ' integer ' , minimum: 0 }
simulatedFor: { type: ' integer ' , minimum: 0 }
2014-09-20 18:18:21 -04:00
2014-08-23 14:07:52 -04:00
jobProfile: c . object { title: ' Job Profile ' , default: { active: false , lookingFor: ' Full-time ' , jobTitle: ' Software Developer ' , city: ' Defaultsville, CA ' , country: ' USA ' , skills: [ ' javascript ' ] , shortDescription: ' Programmer seeking to build great software. ' , longDescription: ' * I write great code. \n * You need great code? \n * Great! ' } } ,
lookingFor: { title: ' Looking For ' , type: ' string ' , enum: [ ' Full-time ' , ' Part-time ' , ' Remote ' , ' Contracting ' , ' Internship ' ] , description: ' What kind of developer position do you want? ' }
jobTitle: { type: ' string ' , maxLength: 50 , title: ' Desired Job Title ' , description: ' What role are you looking for? Ex.: " Full Stack Engineer " , " Front-End Developer " , " iOS Developer " ' }
2014-04-18 12:53:28 -04:00
active: { title: ' Open to Offers ' , type: ' boolean ' , description: ' Want interview offers right now? ' }
2014-04-15 12:28:19 -04:00
updated: c . date { title: ' Last Updated ' , description: ' How fresh your profile appears to employers. Profiles go inactive after 4 weeks. ' }
2014-04-12 04:35:56 -04:00
name: c . shortString { title: ' Name ' , description: ' Name you want employers to see, like " Nick Winter " . ' }
2014-08-23 14:07:52 -04:00
city: c . shortString { title: ' City ' , description: ' City you want to work in (or live in now), like " San Francisco " or " Lubbock, TX " . ' , format: ' city ' }
country: c . shortString { title: ' Country ' , description: ' Country you want to work in (or live in now), like " USA " or " France " . ' , format: ' country ' }
skills: c . array { title: ' Skills ' , description: ' Tag relevant developer skills in order of proficiency ' , maxItems: 30 , uniqueItems: true } ,
2014-06-07 14:45:49 -04:00
{ type: ' string ' , minLength: 1 , maxLength: 50 , description: ' Ex.: " objective-c " , " mongodb " , " rails " , " android " , " javascript " ' , format: ' skill ' }
2014-04-12 04:35:56 -04:00
experience: { type: ' integer ' , title: ' Years of Experience ' , minimum: 0 , description: ' How many years of professional experience (getting paid) developing software do you have? ' }
2014-08-23 14:07:52 -04:00
shortDescription: { type: ' string ' , maxLength: 140 , title: ' Short Description ' , description: ' Who are you, and what are you looking for? 140 characters max. ' }
longDescription: { type: ' string ' , maxLength: 600 , title: ' Description ' , description: ' Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max. ' , format: ' markdown ' }
2014-07-21 12:44:40 -04:00
visa: visa
2014-04-12 04:35:56 -04:00
work: c . array { title: ' Work Experience ' , description: ' List your relevant work experience, most recent first. ' } ,
c . object { title: ' Job ' , description: ' Some work experience you had. ' , required: [ ' employer ' , ' role ' , ' duration ' ] } ,
employer: c . shortString { title: ' Employer ' , description: ' Name of your employer. ' }
role: c . shortString { title: ' Job Title ' , description: ' What was your job title or role? ' }
duration: c . shortString { title: ' Duration ' , description: ' When did you hold this gig? Ex.: " Feb 2013 - present " . ' }
2014-04-18 12:53:28 -04:00
description: { type: ' string ' , title: ' Description ' , description: ' What did you do there? (140 chars; optional) ' , maxLength: 140 }
2014-04-12 04:35:56 -04:00
education: c . array { title: ' Education ' , description: ' List your academic ordeals. ' } ,
c . object { title: ' Ordeal ' , description: ' Some education that befell you. ' , required: [ ' school ' , ' degree ' , ' duration ' ] } ,
school: c . shortString { title: ' School ' , description: ' Name of your school. ' }
degree: c . shortString { title: ' Degree ' , description: ' What was your degree and field of study? Ex. Ph.D. Human-Computer Interaction (incomplete) ' }
duration: c . shortString { title: ' Dates ' , description: ' When? Ex.: " Aug 2004 - May 2008 " . ' }
2014-04-18 12:53:28 -04:00
description: { type: ' string ' , title: ' Description ' , description: ' Highlight anything about this educational experience. (140 chars; optional) ' , maxLength: 140 }
projects: c . array { title: ' Projects (Top 3) ' , description: ' Highlight your projects to amaze employers. ' , maxItems: 3 } ,
2014-04-12 04:35:56 -04:00
c . object { title: ' Project ' , description: ' A project you created. ' , required: [ ' name ' , ' description ' , ' picture ' ] , default: { name: ' My Project ' , description: ' A project I worked on. ' , link: ' http://example.com ' , picture: ' ' } } ,
2014-08-23 14:07:52 -04:00
name: c . shortString { title: ' Project Name ' , description: ' What was the project called? ' }
description: { type: ' string ' , title: ' Description ' , description: ' Briefly describe the project. ' , maxLength: 400 , format: ' markdown ' }
2014-04-12 04:35:56 -04:00
picture: { type: ' string ' , title: ' Picture ' , format: ' image-file ' , description: ' Upload a 230x115px or larger image showing off the project. ' }
2014-08-23 14:07:52 -04:00
link: c . url { title: ' Link ' , description: ' Link to the project. ' }
2014-04-12 04:35:56 -04:00
links: c . array { title: ' Personal and Social Links ' , description: ' Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog. ' } ,
2014-08-23 14:07:52 -04:00
c . object { title: ' Link ' , description: ' A link to another site you want to highlight, like your GitHub, your LinkedIn, or your blog. ' , required: [ ' name ' , ' link ' ] , default: { link: ' http://example.com ' } } ,
2014-06-01 01:09:41 -04:00
name: { type: ' string ' , maxLength: 30 , title: ' Link Name ' , description: ' What are you linking to? Ex: " Personal Website " , " GitHub " ' , format: ' link-name ' }
2014-08-23 14:07:52 -04:00
link: c . url { title: ' Link ' , description: ' The URL. ' }
2014-04-12 04:35:56 -04:00
photoURL: { type: ' string ' , format: ' image-file ' , title: ' Profile Picture ' , description: ' Upload a 256x256px or larger image if you want to show a different profile picture to employers than your normal avatar. ' }
2014-07-05 02:18:21 -04:00
curated: c . object { title: ' Curated ' , required: [ ' shortDescription ' , ' mainTag ' , ' location ' , ' education ' , ' workHistory ' , ' phoneScreenFilter ' , ' schoolFilter ' , ' locationFilter ' , ' roleFilter ' , ' seniorityFilter ' ] } ,
2014-07-03 13:02:42 -04:00
shortDescription:
title: ' Short description '
description: ' A sentence or two describing the candidate '
type: ' string '
2014-07-02 14:50:44 -04:00
mainTag:
title: ' Main tag '
description: ' A main tag to describe this candidate '
type: ' string '
location:
title: ' Location '
2014-07-05 02:18:21 -04:00
description: ' The CURRENT location of the candidate '
2014-07-02 14:50:44 -04:00
type: ' string '
education:
title: ' Education '
description: ' The main educational institution of the candidate '
type: ' string '
2014-07-05 02:18:21 -04:00
workHistory: c . array { title: ' Work history ' , description: ' One or two places the candidate has worked ' , type: ' array ' } ,
2014-07-02 14:50:44 -04:00
title: ' Workplace '
type: ' string '
2014-07-21 12:44:40 -04:00
phoneScreenFilter: phoneScreenFilter
schoolFilter: schoolFilter
locationFilter: locationFilter
roleFilter: roleFilter
seniorityFilter: seniorityFilter
2014-07-07 13:42:16 -04:00
featured:
title: ' Featured '
type: ' boolean '
description: ' Should this candidate be prominently featured on the site? '
2014-04-12 04:35:56 -04:00
jobProfileApproved: { title: ' Job Profile Approved ' , type: ' boolean ' , description: ' Whether your profile has been approved by CodeCombat. ' }
2014-07-16 13:51:44 -04:00
jobProfileApprovedDate: c . date { title: ' Approved date ' , description: ' The date that the candidate was approved ' }
2014-08-23 14:07:52 -04:00
jobProfileNotes: { type: ' string ' , maxLength: 1000 , title: ' Our Notes ' , description: ' CodeCombat \' s notes on the candidate. ' , format: ' markdown ' }
2014-06-30 22:16:26 -04:00
employerAt: c . shortString { description: ' If given employer permissions to view job candidates, for which employer? ' }
2014-04-24 20:36:07 -04:00
signedEmployerAgreement: c . object { } ,
2014-06-30 22:16:26 -04:00
linkedinID: c . shortString { title: ' LinkedInID ' , description: ' The user \' s LinkedIn ID when they signed the contract. ' }
date: c . date { title: ' Date signed employer agreement ' }
data: c . object { description: ' Cached LinkedIn data slurped from profile. ' , additionalProperties: true }
2014-07-21 12:44:40 -04:00
savedEmployerFilterAlerts: c . array {
title: ' Saved Employer Filter Alerts '
description: ' Employers can get emailed alerts whenever there are new candidates matching their filters '
} , c . object ( {
title: ' Saved filter set '
description: ' A saved filter set '
2014-07-21 19:10:02 -04:00
required: [ ' phoneScreenFilter ' , ' schoolFilter ' , ' locationFilter ' , ' roleFilter ' , ' seniorityFilter ' , ' visa ' ]
2014-07-21 12:44:40 -04:00
} , {
2014-07-21 13:01:49 -04:00
phoneScreenFilter:
title: ' Phone screen filter values '
type: ' array '
2014-08-26 14:34:33 -04:00
items:
2014-07-21 13:01:49 -04:00
type: ' boolean '
schoolFilter:
title: ' School filter values '
type: ' array '
items:
type: schoolFilter . type
enum: schoolFilter . enum
2014-08-26 14:34:33 -04:00
locationFilter:
2014-07-21 13:01:49 -04:00
title: ' Location filter values '
type: ' array '
items:
type: locationFilter . type
enum: locationFilter . enum
2014-08-26 14:34:33 -04:00
roleFilter:
2014-07-21 13:01:49 -04:00
title: ' Role filter values '
type: ' array '
items:
type: roleFilter . type
enum: roleFilter . enum
2014-08-26 14:34:33 -04:00
seniorityFilter:
2014-07-21 13:01:49 -04:00
title: ' Seniority filter values '
type: ' array '
items:
type: roleFilter . type
enum: seniorityFilter . enum
2014-08-26 14:34:33 -04:00
visa:
2014-07-21 13:01:49 -04:00
title: ' Visa filter values '
type: ' array '
items:
type: visa . type
enum: visa . enum
2014-07-21 12:44:40 -04:00
} )
2014-08-26 14:34:33 -04:00
2014-06-30 22:16:26 -04:00
points: { type: ' number ' }
2014-06-10 19:30:07 -04:00
activity: { type: ' object ' , description: ' Summary statistics about user activity ' , additionalProperties: c . activity }
2014-07-23 14:00:28 -04:00
stats: c . object { additionalProperties: false } ,
gamesCompleted: c . int ( )
articleEdits: c . int ( )
levelEdits: c . int ( )
levelSystemEdits: c . int ( )
levelComponentEdits: c . int ( )
thangTypeEdits: c . int ( )
2014-07-30 16:23:43 -04:00
patchesSubmitted: c . int
2014-07-23 14:00:28 -04:00
description: ' Amount of patches submitted, not necessarily accepted '
2014-07-30 16:23:43 -04:00
patchesContributed: c . int
2014-07-23 14:00:28 -04:00
description: ' Amount of patches submitted and accepted '
2014-07-30 16:23:43 -04:00
patchesAccepted: c . int
2014-07-23 14:00:28 -04:00
description: ' Amount of patches accepted by the user as owner '
# The below patches only apply to those that actually got accepted
2014-07-30 16:23:43 -04:00
totalTranslationPatches: c . int ( )
totalMiscPatches: c . int ( )
articleTranslationPatches: c . int ( )
articleMiscPatches: c . int ( )
levelTranslationPatches: c . int ( )
levelMiscPatches: c . int ( )
levelComponentTranslationPatches: c . int ( )
levelComponentMiscPatches: c . int ( )
levelSystemTranslationPatches: c . int ( )
levelSystemMiscPatches: c . int ( )
thangTypeTranslationPatches: c . int ( )
thangTypeMiscPatches: c . int ( )
2014-07-23 14:00:28 -04:00
2014-09-26 05:28:54 -04:00
earned: c . RewardSchema ' earned by achievements '
2014-11-01 17:15:57 -04:00
purchased: c . RewardSchema ' purchased with gems or money '
2015-02-24 11:54:30 -05:00
deleted: { type: ' boolean ' }
2014-11-01 17:15:57 -04:00
spent: { type: ' number ' }
2014-12-02 14:47:15 -05:00
stripeCustomerID: { type: ' string ' } # TODO: Migrate away from this property
2015-02-04 16:54:35 -05:00
2014-12-02 14:47:15 -05:00
stripe: c . object { } , {
customerID: { type: ' string ' }
2014-12-02 23:01:35 -05:00
planID: { enum: [ ' basic ' ] }
subscriptionID: { type: ' string ' }
token: { type: ' string ' }
2014-12-04 20:41:17 -05:00
couponID: { type: ' string ' }
discountID: { type: ' string ' }
free: { type: [ ' boolean ' , ' string ' ] , format: ' date-time ' }
2014-12-02 14:47:15 -05:00
}
2014-04-25 13:46:43 -04:00
2014-04-12 04:35:56 -04:00
c . extendBasicProperties UserSchema , ' user '
2014-08-23 14:07:52 -04:00
UserSchema.definitions =
emailSubscription: c . object { default: { enabled: true , count: 0 } } , {
2014-04-21 19:15:23 -04:00
enabled: { type: ' boolean ' }
lastSent: c . date ( )
count: { type: ' integer ' }
2014-08-23 14:07:52 -04:00
}
2014-04-21 19:15:23 -04:00
2014-04-12 04:35:56 -04:00
module.exports = UserSchema