Last active
July 30, 2021 10:19
-
-
Save jcmpes/36ec46fa7b0f24f2b93a3a7111c86578 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var createError = require('http-errors'); | |
var express = require('express'); | |
var path = require('path'); | |
var cookieParser = require('cookie-parser'); | |
var logger = require('morgan'); | |
const cors = require('cors'); | |
var app = express(); | |
app.use(cors()); | |
app.use(logger('dev')); | |
app.use(express.json()); | |
app.use(express.urlencoded({ extended: false })); | |
app.use(cookieParser()); | |
app.use(express.static(path.join(__dirname, 'public'))); | |
// API courses | |
app.use('/api/v1/courses', require('./courses')); | |
// catch 404 and forward to error handler | |
app.use(function (req, res, next) { | |
next(createError(404)); | |
}); | |
// error handler | |
app.use(function (err, req, res, next) { | |
// set locals, only providing error in development | |
res.locals.message = err.message; | |
res.locals.error = req.app.get('env') === 'development' ? err : {}; | |
// render the error page | |
res.status(err.status || 500); | |
res.json({ error: err.message }); | |
return; | |
}); | |
module.exports = app; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const mongoose = require('mongoose'); | |
// Import the slug package | |
const slug = require('mongoose-slug-updater'); | |
// Initialize | |
mongoose.plugin(slug); | |
const courseSchema = mongoose.Schema( | |
{ | |
title: { type: String, unique: true, index: true }, | |
slug: { type: String, slug: 'title', unique: true }, | |
user: { | |
type: mongoose.Schema.Types.ObjectId, | |
ref: 'User', | |
}, | |
category: { | |
type: mongoose.Schema.Types.ObjectId, | |
ref: 'Category', | |
}, | |
price: { type: Number, required: true }, | |
video: String, | |
description: String, | |
content: String, | |
image: String, | |
lessons: [ | |
{ | |
type: mongoose.Schema.Types.ObjectId, | |
ref: 'Lesson', | |
}, | |
], | |
}, | |
{ timestamps: true }, | |
); | |
courseSchema.statics.list = async function (filter, skip, limit, sort) { | |
const query = Course.find(filter).populate('user').populate('category'); | |
query.sort(sort); | |
query.skip(skip); | |
query.limit(limit); | |
return await query.exec(); | |
}; | |
const Course = mongoose.model('Course', courseSchema); | |
module.exports = Course; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const express = require('express'); | |
const router = express.Router(); | |
const mongoose = require('mongoose'); | |
const Lesson = mongoose.model('./Lesson'); | |
const Course = mongoose.model('./Course'); | |
const multer = require('multer'); | |
const { uploadFile } = require('../../lib/s3'); | |
const path = require('path'); | |
const UPLOAD_FOLDER = process.env.UPLOAD_FOLDER || "public/images/"; | |
/** | |
* Configurar multer | |
*/ | |
const fileExtensionRemover = originalName => { | |
return originalName.split('.')[0]; | |
}; | |
const storage = multer.diskStorage({ | |
destination: function(req, file, cb) { | |
cb(null, UPLOAD_FOLDER); | |
}, | |
filename: function(req,file, cb) { | |
cb(null, fileExtensionRemover(file.originalname) + '-' + Date.now() + path.extname(file.originalname)) | |
} | |
}); | |
const upload = multer({ storage }); | |
/** | |
* POST /api/v1/courses | |
* Create a new course | |
*/ | |
router.post( | |
'/', | |
upload.single('image'), | |
async function (req, res, next) { | |
try { | |
// Server side validation | |
const formData = { ...req.body }; | |
const validation = formData.title && formData.category; | |
if (!validation) { | |
res | |
.status(400) | |
.json({ message: 'Title and category are both required' }); | |
return; | |
} | |
// Inject userId in new course before saving it | |
formData.user = req.apiAuthUserId; | |
const course = new Course(formData); | |
if (req.file) { | |
// Uplaod file to S3 and add image location to course object | |
const file = req.file; | |
const { Location } = await uploadFile(file); | |
course.image = Location; | |
} | |
// Save new lessons | |
if (formData.lessons) { | |
const lessonsToSave = JSON.parse(formData.lessons) | |
course.lessons = [] | |
for (const key in lessonsToSave) { | |
async function saveLesson() { | |
const oneLessonToSave = new Lesson(lessonsToSave[key]); | |
const saved = await oneLessonToSave.save() | |
return saved | |
} | |
saveLesson().then(async saved => { | |
console.log('LESSON salvada: ', saved) | |
course.lessons.push(saved._id) | |
console.log(course.lessons) | |
}) | |
} | |
} | |
// Save new course in database | |
const newCourse = await course.save(); | |
res.status(201).json(newCourse); | |
} catch (err) { | |
next(err); | |
} | |
}, | |
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const mongoose = require('mongoose'); | |
// Import the slug package | |
const slug = require('mongoose-slug-updater'); | |
// Initialize | |
mongoose.plugin(slug); | |
const lessonSchema = mongoose.Schema( | |
{ | |
title: { type: String }, | |
slug: { type: String, slug: 'title' }, | |
image: String, | |
video: String, | |
description: String, | |
content: String, | |
}, | |
{ timestamps: true }, | |
); | |
const Lesson = mongoose.model('Lesson', lessonSchema); | |
module.exports = Lesson; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "nodecourse", | |
"version": "0.0.0", | |
"private": true, | |
"scripts": { | |
"start": "node ./bin/www", | |
"dev": "nodemon ./bin/www", | |
"installDB": "node install_db.js", | |
"format": "prettier --write './**/*.{js,json,html,css}'" | |
}, | |
"dependencies": { | |
"aws-sdk": "^2.947.0", | |
"bcrypt": "^5.0.1", | |
"cookie-parser": "~1.4.4", | |
"cors": "^2.8.5", | |
"debug": "~2.6.9", | |
"dotenv": "^10.0.0", | |
"ejs": "~2.6.1", | |
"express": "~4.16.1", | |
"generate-api-key": "^1.0.0", | |
"http-errors": "~1.6.3", | |
"jsonwebtoken": "^8.5.1", | |
"mongoose": "^5.13.4", | |
"mongoose-slug-updater": "^3.3.0", | |
"morgan": "~1.9.1", | |
"multer": "^1.4.2", | |
"nodemailer": "^6.6.2" | |
}, | |
"devDependencies": { | |
"prettier": "^2.3.2" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment