X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=app.js;h=ebe2d0c1c84dd436a418251ea9a10970b5348726;hb=a0b2a9a1dfe38969b3336d497f5c5667bb0c8a29;hp=721d3978a5d54bf92c1c5b1df7c6c4227ca62854;hpb=53c78df1bec07d5da9d21b70c7a24cc43a1e5367;p=oweals%2Ffinalsclub.git diff --git a/app.js b/app.js index 721d397..ebe2d0c 100644 --- a/app.js +++ b/app.js @@ -1,5 +1,5 @@ // FinalsClub Server -// +// // This file consists of the main webserver for FinalsClub.org // and is split between a standard CRUD style webserver and // a websocket based realtime webserver. @@ -24,6 +24,7 @@ var Session = connect.middleware.session.Session; var parseCookie = connect.utils.parseCookie; var Backchannel = require('./bc/backchannel'); + // Depracated // Used for initial testing var log3 = function() {} @@ -33,11 +34,11 @@ var app = module.exports = express.createServer(); // Load Mongoose Schemas // The actual schemas are located in models.j -var User = mongoose.model( 'User' ); -var School = mongoose.model( 'School' ); -var Course = mongoose.model( 'Course' ); -var Lecture = mongoose.model( 'Lecture' ); -var Note = mongoose.model( 'Note' ); +var User = mongoose.model( 'User' ); +var School = mongoose.model( 'School' ); +var Course = mongoose.model( 'Course' ); +var Lecture = mongoose.model( 'Lecture' ); +var Note = mongoose.model( 'Note' ); // More schemas used for legacy data var ArchivedCourse = mongoose.model( 'ArchivedCourse' ); @@ -45,7 +46,7 @@ var ArchivedNote = mongoose.model( 'ArchivedNote' ); var ArchivedSubject = mongoose.model( 'ArchivedSubject' ); // XXX Not sure if necessary -var ObjectId = mongoose.SchemaTypes.ObjectId; +var ObjectId = mongoose.SchemaTypes.ObjectId; // Configuration // Use the environment variable DEV_EMAIL for testing @@ -89,7 +90,7 @@ app.configure( 'development', function() { // If a port wasn't set earlier, set to 3000 if ( !serverPort ) { serverPort = 3000; - } + } }); // Production configuration settings @@ -116,15 +117,18 @@ app.configure( 'production', function() { // Set to port 80 if not set through environment variables if ( !serverPort ) { serverPort = 80; - } + } }); // General Express configuration settings app.configure(function(){ + // Views are rendered from public/index.html and main.js except for the pad that surrounds EPL and BC + // FIXME: make all views exist inside of public/index.html // Views are housed in the views folder app.set( 'views', __dirname + '/views' ); // All templates use jade for rendering app.set( 'view engine', 'jade' ); + // Bodyparser is required to handle form submissions // without manually parsing them. app.use( express.bodyParser() ); @@ -158,6 +162,7 @@ app.configure(function(){ app.use( express.methodOverride() ); // Static files are loaded when no dynamic views match. app.use( express.static( __dirname + '/public' ) ); + // Sets the routers middleware to load after everything set // before it, but before static files. app.use( app.router ); @@ -287,6 +292,8 @@ function loadUser( req, res, next ) { res.redirect( '/' ); } + } else if('a'==='b'){ + console.log('never. in. behrlin.'); } else { // If no user record was found, then we store the requested // path they intended to view and redirect them after they @@ -308,9 +315,11 @@ function loadUser( req, res, next ) { // loadSchool is used to load a school by it's id function loadSchool( req, res, next ) { var user = req.user; - var schoolId = req.params.id; + var schoolName = req.params.name; + console.log( 'loading a school by id' ); - School.findById( schoolId, function( err, school ) { + School.findOne({'name': schoolName}).run( function( err, school ) { + //sys.puts(school); if( school ) { req.school = school; @@ -318,9 +327,36 @@ function loadSchool( req, res, next ) { // authorized to see or interact with anything related to that // school. school.authorize( user, function( authorized ){ - req.school.authorized = authorized; - next(); + req.school.authorized = authorized; }); + next(); + } else { + // If no school is found, display an appropriate error. + sendJson(res, {status: 'not_found', message: 'Invalid school specified!'} ); + } + }); +} + +function loadSchoolSlug( req, res, next ) { + var user = req.user; + var schoolSlug = req.params.slug; + + console.log("loading a school by slug"); + //console.log(schoolSlug); + + School.findOne({ 'slug': schoolSlug }, function( err, school ) { + console.log( school ); + if( school ) { + req.school = school; + + // If a school is found, the user is checked to see if they are + // authorized to see or interact with anything related to that + // school. + next() + //school.authorize( user, function( authorized ){ + //req.school.authorized = authorized; + //next(); + //}); } else { // If no school is found, display an appropriate error. sendJson(res, {status: 'not_found', message: 'Invalid school specified!'} ); @@ -479,6 +515,8 @@ app.get( '/', loadUser, function( req, res ) { // in those schools. // Public with some private information app.get( '/schools', checkAjax, loadUser, function( req, res ) { + sys.puts('loading schools'); + console.log(req.user); var user = req.user; var schoolList = []; @@ -488,9 +526,27 @@ app.get( '/schools', checkAjax, loadUser, function( req, res ) { if( schools ) { // If schools are found, loop through them gathering any courses that are // associated with them and then render the page with that information. - sendJson(res, { 'user': user.sanitized, 'schools' : schools.map(function(school) { - return school.sanitized; - })}) + var schools_todo = schools.length; + schools.map(function (school) { + Course.find( { 'school': school.id } ).run(function (err, courses) { + school.courses_length = courses.length + schools_todo -= 1; + if (schools_todo <= 0) { + sendJson(res, { 'user': user.sanitized, 'schools': schools.map( function(s) { + var school = { + _id: s._id, + name: s.name, + description: s.description, + url: s.url, + slug: s.slug, + courses: s.courses_length + }; + return school; + }) + }); + } + }); + }); } else { // If no schools have been found, display none //res.render( 'schools', { 'schools' : [] } ); @@ -499,9 +555,54 @@ app.get( '/schools', checkAjax, loadUser, function( req, res ) { }); }); -app.get( '/school/:id', checkAjax, loadUser, loadSchool, function( req, res ) { +app.get( '/school/:name', checkAjax, loadUser, loadSchool, function( req, res ) { var school = req.school; var user = req.user; + var courses; + console.log( 'loading a school by school/:id now name' ); + + //school.authorize( user, function( authorized ) { + // This is used to display interface elements for those users + // that are are allowed to see th)m, for instance a 'New Course' button. + //var sanitizedSchool = school.sanitized; + var sanitizedSchool = { + _id: school.id, + name: school.name, + description: school.description, + url: school.url + }; + //sanitizedSchool.authorized = authorized; + // Find all courses for school by it's id and sort by name + Course.find( { 'school' : school._id } ).sort( 'name', '1' ).run( function( err, courses ) { + // If any courses are found, set them to the appropriate school, otherwise + // leave empty. + sys.puts(courses); + if( courses.length > 0 ) { + courses = courses.filter(function(course) { + if (!course.deleted) return course; + }).map(function(course) { + return course.sanitized; + }); + } else { + school.courses = []; + } + sanitizedSchool.courses = courses; + sys.puts(courses); + + // This tells async (the module) that each iteration of forEach is + // done and will continue to call the rest until they have all been + // completed, at which time the last function below will be called. + sendJson(res, { 'school': sanitizedSchool, 'user': user.sanitized }) + }); + //}); +}); + +// FIXME: version of the same using school slugs instead of ids +// TODO: merge this with the :id funciton or depricate it +app.get( '/schoolslug/:slug', checkAjax, loadUser, loadSchoolSlug, function( req, res ) { + var school = req.school; + var user = req.user; + console.log( 'loading a schoolslug/:slug' ); school.authorize( user, function( authorized ) { // This is used to display interface elements for those users @@ -1048,8 +1149,8 @@ app.post( '/login', checkAjax, function( req, res ) { // Find user from email User.findOne( { 'email' : email.toLowerCase() }, function( err, user ) { - log3(err) - log3(user) + log3(err) + log3(user) // If user exists, check if activated, if not notify them and send them to // the login form @@ -1171,7 +1272,7 @@ app.post( '/resetpw/:id', checkAjax, function( req, res ) { if (valid) { user.save( function( err ) { sendJson(res, {status: 'ok', message: 'Your password has been reset. You can now login with your the new password you just created.'}) - }); + }); } } // If there was a problem, notify user @@ -1204,9 +1305,8 @@ app.post( '/register', checkAjax, function( req, res ) { user.email = req.body.email.toLowerCase(); user.password = req.body.password; user.session = sid; - // If school is set to other, then fill in school as what the - // user entered - user.school = req.body.school === 'Other' ? req.body.otherSchool : req.body.school; + // If school is set to other, then fill in school as what the user entered + user.school = req.body.school === 'Other' ? req.body.otherSchool : req.body.school; user.name = req.body.name; user.affil = req.body.affil; user.activated = false; @@ -1225,7 +1325,7 @@ app.post( '/register', checkAjax, function( req, res ) { var hostname = user.email.split( '@' ).pop(); // Check if email is from one of the special domains - if( /^(finalsclub.org|sleepless.com)$/.test( hostname ) ) { + if( /^(finalsclub.org)$/.test( hostname ) ) { user.admin = true; } @@ -1370,6 +1470,7 @@ app.get( '/activate/:code', checkAjax, function( req, res ) { // Logut user app.get( '/logout', checkAjax, function( req, res ) { + sys.puts("logging out"); var sid = req.sessionID; // Find user by session id @@ -1423,8 +1524,8 @@ app.post( '/profile', checkAjax, loadUser, loggedIn, function( req, res ) { } } - user.major = fields.major; - user.bio = fields.bio; + user.major = fields.major; + user.bio = fields.bio; user.showName = ( fields.showName ? true : false ); @@ -1695,6 +1796,7 @@ io.set('authorization', function ( handshake, next ) { }); var backchannel = new Backchannel(app, io.of('/backchannel'), { + // TODO: if lecture belongs to course (find pinker's courseId) pass a 'no-answers' true/false subscribe: function(lecture, send) { Post.find({'lecture': lecture}, function(err, posts) { send(posts); @@ -1835,3 +1937,5 @@ function isValidEmail(email) { var re = /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; return email.match(re); } + +// Facebook connect