mongoose + tests
This commit is contained in:
107
server/routers/old/stc-21-03/controllers.js
Normal file
107
server/routers/old/stc-21-03/controllers.js
Normal file
@@ -0,0 +1,107 @@
|
||||
const { getDB } = require('../../../utils/mongo')
|
||||
|
||||
let db = null
|
||||
|
||||
const connect = async () => {
|
||||
db = await getDB('stc-21-03')
|
||||
}
|
||||
|
||||
const _idToId = (data) => {
|
||||
const { _id, ...rest } = data
|
||||
|
||||
return {
|
||||
id: _id, ...rest,
|
||||
}
|
||||
}
|
||||
|
||||
const FILM_TOMATOS_COLL = 'films-tomatos'
|
||||
const getFilmData = async (filmId) => {
|
||||
if (db === null) throw new Error('no db connection')
|
||||
|
||||
const filmsCollection = db.collection(FILM_TOMATOS_COLL)
|
||||
const data = await filmsCollection.find({
|
||||
filmId,
|
||||
}).toArray()
|
||||
|
||||
if (data.length === 0) {
|
||||
const newData = {
|
||||
filmId,
|
||||
views: 0,
|
||||
ratings: [],
|
||||
likes: 0,
|
||||
}
|
||||
|
||||
filmsCollection.insertMany([newData])
|
||||
|
||||
return _idToId(newData)
|
||||
}
|
||||
const filmData = data[0]
|
||||
filmsCollection.updateOne({
|
||||
filmId,
|
||||
}, [
|
||||
{
|
||||
$set: {
|
||||
views: ++filmData.views,
|
||||
},
|
||||
},
|
||||
])
|
||||
return _idToId(filmData)
|
||||
}
|
||||
|
||||
const setLike = async (filmId) => {
|
||||
if (db === null) throw new Error('no db connection')
|
||||
|
||||
const filmsCollection = db.collection(FILM_TOMATOS_COLL)
|
||||
const data = await filmsCollection.find({
|
||||
filmId,
|
||||
}).toArray()
|
||||
|
||||
if (data.length === 0) {
|
||||
throw new Error('no film data')
|
||||
}
|
||||
|
||||
const filmData = data[0]
|
||||
filmsCollection.updateOne({
|
||||
filmId,
|
||||
}, [
|
||||
{
|
||||
$set: {
|
||||
likes: ++filmData.likes,
|
||||
},
|
||||
},
|
||||
])
|
||||
return _idToId(filmData)
|
||||
}
|
||||
|
||||
const setRating = async ({ filmId, rating }) => {
|
||||
if (db === null) throw new Error('no db connection')
|
||||
|
||||
const filmsCollection = db.collection(FILM_TOMATOS_COLL)
|
||||
const data = await filmsCollection.find({
|
||||
filmId,
|
||||
}).toArray()
|
||||
|
||||
if (data.length === 0) {
|
||||
throw new Error('no film data')
|
||||
}
|
||||
|
||||
const filmData = data[0]
|
||||
filmData.ratings = [...filmData.ratings, rating]
|
||||
filmsCollection.updateOne({
|
||||
filmId,
|
||||
}, [
|
||||
{
|
||||
$set: {
|
||||
ratings: filmData.ratings,
|
||||
},
|
||||
},
|
||||
])
|
||||
return _idToId(filmData)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
connect,
|
||||
getFilmData,
|
||||
setLike,
|
||||
setRating,
|
||||
}
|
||||
94
server/routers/old/stc-21-03/index.js
Normal file
94
server/routers/old/stc-21-03/index.js
Normal file
@@ -0,0 +1,94 @@
|
||||
const router = require('express').Router()
|
||||
|
||||
const { connect, getFilmData, setLike, setRating } = require('./controllers')
|
||||
const { getAnswer } = require('../../../utils/common')
|
||||
|
||||
connect()
|
||||
|
||||
router.get('/film/:id', async (req, res) => {
|
||||
const data = await getFilmData(req.params.id)
|
||||
res.send(getAnswer(null, data))
|
||||
})
|
||||
|
||||
router.post('/film/:id/rating', async (req, res) => {
|
||||
const filmData = await setRating({
|
||||
filmId: req.params.id, rating: req.body.rating,
|
||||
})
|
||||
res.send(getAnswer(null, filmData))
|
||||
})
|
||||
|
||||
router.post('/film/:id/like', async (req, res) => {
|
||||
const filmData = await setLike(req.params.id)
|
||||
res.send(getAnswer(null, filmData))
|
||||
})
|
||||
|
||||
const first = router.all('/feedback', (req, res) => {
|
||||
setTimeout(() => {
|
||||
res.send({
|
||||
success: true,
|
||||
body: {
|
||||
...req.query, ...req.body,
|
||||
},
|
||||
})
|
||||
}, 1000)
|
||||
|
||||
/**
|
||||
* Этот эндпоинт будет доступен по адресу http://inno-ijl.ru/multystub/stc-21-03/feedback
|
||||
*/
|
||||
})
|
||||
|
||||
function idGen() {
|
||||
let i = 1
|
||||
return () => i++
|
||||
}
|
||||
|
||||
const getId = idGen()
|
||||
|
||||
let posts = [
|
||||
{
|
||||
id: getId(),
|
||||
link: 'https://www.unian.net/russianworld/v-rossii-na-bereg-zaliva-vybrosilo-tonny-ikry-mestnye-udobryayut-eyu-ogorody-video-novosti-rossii-11420710.html',
|
||||
header: 'В России на берег залива выбросило тонны икры: местные удобряют ею огороды (видео)',
|
||||
poster: 'images/1.jpeg',
|
||||
text: `На побережье залива Анива в Сахалинской области РФ штормом выбросило тонны икры тихоокеанской сельди сахалино-хоккайдского стада. Об этом на своей странице в Facebook рассказал глава общественной организации "Экологическая вахта Сахалина" Дмитрий Лисицын.
|
||||
По его словам, икру косяки сельди ранее отметали недалеко от берега, а теперь ее сплошная полоса шириной в несколько метров растянулась по побережью примерно на 3 км. Толщина слоя икры местами достигает 10-15 см.`,
|
||||
},
|
||||
{
|
||||
id: getId(),
|
||||
link: 'https://www.unian.net/curiosities/zhenshchina-postirala-vyigryshnyy-bilet-na-26-millionov-dollarov-poslednie-novosti-11420341.html',
|
||||
header: 'Женщина постирала выигрышный билет на 26 миллионов долларов',
|
||||
poster: 'images/2.webp',
|
||||
text: `Американка случайно постирала со штанами выигрышный лотерейный билет на 26 миллионов долларов.
|
||||
Женщина приобрела лотерею еще в ноябре в пригороде Лос-Анджелеса. Однако за выигрышем она пришла тогда, когда истекал крайний срок – через 180 дней. В магазине американка отметила, что не может показать билет, поскольку постирала его в кармане одежды.
|
||||
В то же время представитель калифорнийской лотереи Кэти Джонстон заявила, что отснятого материала (имея в виду кадры с камер видеонаблюдения, на которые попала покупатель) недостаточно, чтобы выдать призовые деньги женщине.`,
|
||||
},
|
||||
]
|
||||
|
||||
const getPosts = (req, res) => {
|
||||
setTimeout(() => {
|
||||
res.send({
|
||||
success: true, body: posts,
|
||||
})
|
||||
}, 1000)
|
||||
|
||||
/**
|
||||
* Этот эндпоинт будет доступен по адресу http://89.223.91.151:8080/multystub/stc-21-03/posts
|
||||
*/
|
||||
}
|
||||
|
||||
const addPost = (req, res) => {
|
||||
posts.push({
|
||||
id: getId(), ...req.body,
|
||||
})
|
||||
setTimeout(() => {
|
||||
res.send({
|
||||
success: true, body: posts,
|
||||
})
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
router.get('/posts', getPosts)
|
||||
router.post('/posts', addPost)
|
||||
router.use('/', first)
|
||||
|
||||
module.exports = router
|
||||
Reference in New Issue
Block a user