From fc71f8942255c065508b6fa60b07d16337fabebd Mon Sep 17 00:00:00 2001 From: carlos-burelo Date: Tue, 6 Apr 2021 02:37:14 -0500 Subject: [PATCH] finalizando estructura del proyecto --- .gitignore | 3 +- public/index.html | 1 + src/controllers/controller.ts | 269 +++++++++++++++++++++++++++++++++- src/routes/api.routes.ts | 34 ++++- 4 files changed, 301 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index b512c09..76add87 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +dist \ No newline at end of file diff --git a/public/index.html b/public/index.html index 09a4e18..4e5abd7 100644 --- a/public/index.html +++ b/public/index.html @@ -5,6 +5,7 @@ + Document diff --git a/src/controllers/controller.ts b/src/controllers/controller.ts index cf3acfa..5d79edf 100644 --- a/src/controllers/controller.ts +++ b/src/controllers/controller.ts @@ -50,7 +50,7 @@ async function getLastest(req: any, res: any) { success: false }) } -} +}; async function getEmision(req: any, res: any) { try { let { page } = req.query; @@ -98,7 +98,7 @@ async function getEmision(req: any, res: any) { success: false }) } -} +}; async function getAnime(req: any, res: any) { try { let { id } = req.params; @@ -200,6 +200,58 @@ async function getAnime(req: any, res: any) { }); }; }; +async function getAnimes(req, res) { + try { + let {page} = req.params; + !page ? page = 1 : page = page + + + const bodyResponse = await axios.get(`${urls.main}/animes?page=${page}`); + const $ = cheerio.load(bodyResponse.data); + + const animes = []; + + $('.animes .container .row article').each((i, e) => { + let el = $(e); + + let id = el.find('a').attr('href'); + id = id.split('/')[4] + let title = el.find('.Title').text(); + let img = el.find('.Image img').attr('src'); + let category = el.find('.category').text(); + category = category.substring(1, category.length) + let year = parseInt(el.find('.fecha').text()); + + const anime = { + id, + title, + img, + category, + year + } + + animes.push(anime); + }) + + let totalPages:any = $('.pagination').children().length; + totalPages = $('.pagination').find('.page-item')[totalPages - 2]; + let pages = parseInt($(totalPages).text()); + let current = parseInt(page) + res.status(200) + .json({ + current, + pages, + animes + }) + + } catch (err) { + res.status(500) + .json({ + message: err.message, + success: false + }) + } +}; async function searchAnime(req: any, res: any) { try { let { id } = req.params; @@ -345,7 +397,7 @@ async function getCategories(req, res) { res.status(200) .json( categories, - ) + ) } catch (err) { res.status(500) .json({ @@ -390,6 +442,58 @@ async function getGenders(req, res) { }) } }; +async function getGender(req:any, res:any) { + try { + let { gender } = req.params; + let { page } = req.params; + !page ? page = 1 : page = page + const bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`); + const $ = cheerio.load(bodyResponse.data); + const animes = []; + + $('.animes .container .row article').each((i, e) => { + let el = $(e); + + let id = el.find('a').attr('href'); + id = id.split('/')[4] + let title = el.find('.Title').text(); + let img = el.find('.Image img').attr('src'); + let category = el.find('.category').text(); + category = category.substring(1, category.length) + let year = parseInt(el.find('.fecha').text()); + + const anime = { + id, + title, + img, + category, + year + } + + animes.push(anime); + }) + + let totalPages: any = $('.pagination').children().length; + totalPages = $('.pagination').find('.page-item')[totalPages - 2]; + let pages = parseInt($(totalPages).text()); + + let current = parseInt(page) + res.status(200) + .json({ + current, + pages, + animes + }) + + } catch (err) { + res.status(500) + .json({ + message: err.message, + success: false + }) + } + +} async function getYears(req, res) { try { const response = await axios.get(`${urls.main}/animes`); @@ -426,15 +530,174 @@ async function getYears(req, res) { }) } }; +async function getYear(req: any, res: any) { + try { + let { year } = req.params; + let { page } = req.params; + !page ? page = 1 : page = page + const bodyResponse = await axios.get(`${urls.main}/year/${year}?page=${page}`); + const $ = cheerio.load(bodyResponse.data); + const animes = []; + $('.animes .container .row article').each((i, e) => { + let el = $(e); + + let id = el.find('a').attr('href'); + id = id.split('/')[4] + let title = el.find('.Title').text(); + let img = el.find('.Image img').attr('src'); + let category = el.find('.category').text(); + category = category.substring(1, category.length) + let year = parseInt(el.find('.fecha').text()); + + const anime = { + id, + title, + img, + category, + year + } + + animes.push(anime); + }) + + let totalPages: any = $('.pagination').children().length; + totalPages = $('.pagination').find('.page-item')[totalPages - 2]; + let pages = parseInt($(totalPages).text()); + + let current = parseInt(page) + res.status(200) + .json({ + current, + pages, + animes + }) + + } catch (err) { + res.status(500) + .json({ + message: err.message, + success: false + }) + } + +}; +async function getLetters(req, res) { + try { + const bodyResponse = await axios.get(`${urls.main}/animes`); + const $ = cheerio.load(bodyResponse.data); + const letters = [] + let lettersContainer = $('.filter-container .clearfix .float-left')[3]; + $(lettersContainer).find('.dropdown-menu .dropdown-item') + .each((i, e) => { + let el = $(e) + let title = el.text(); + let id = el.attr('href'); + id = id.split('/')[2]; + let letter = { + title, + id + } + letters.push(letter) + }) + + res.status(200) + .json( + letters, + ) + + } catch (err) { + res.status(500) + .json({ + message: err.message, + success: false + }) + } +}; +async function getBy(req, res, multiple?) { + try { + let { + gender, + letter, + category + } = req.params; + + let { + page + } = req.query; + + if (!page) { + page = 1 + } + + let bodyResponse; + + if (multiple) { + bodyResponse = await axios.get(`${urls.main}/categoria/${category}/genero/${gender}?page=${page}`); + } else if (gender && !multiple) { + bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`); + } else if (letter && !multiple) { + bodyResponse = await axios.get(`${urls.main}/letra/${letter}?page=${page}`); + } else if (category && !multiple) { + bodyResponse = await axios.get(`${urls.main}/categoria/${category}?page=${page}`); + } + const $ = cheerio.load(bodyResponse.data); + + const animes = []; + + $('.animes .container .row article').each((i, e) => { + let el = $(e); + let id = el.find('.link-anime').attr('href'); + id = id.split('/')[4]; + let img = el.find('.link-anime .Image img').attr('src'); + let title = el.find('.link-anime .Title').text(); + let type = el.find('.link-anime .info .category').text(); + let year = el.find('.link-anime .info .fecha').text(); + + let anime = { + id, + img, + title, + type, + year + } + + animes.push(anime); + + }) + + let totalPages:any = $('.pagination').children().length; + totalPages = $('.pagination').find('.page-item')[totalPages - 2]; + let pages = parseInt($(totalPages).text()); + + res.status(200) + .json({ + animes, + pages, + success: true + }) + + } catch (err) { + res.status(500) + .json({ + message: err.message, + success: false + }) + } +} export { getLastest, getEmision, getAnime, + getAnimes, searchAnime, getEpisode, getCategories, getGenders, + getGender, getYears, + getYear, + getLetters, + getBy } \ No newline at end of file diff --git a/src/routes/api.routes.ts b/src/routes/api.routes.ts index e72f64b..6a7f514 100644 --- a/src/routes/api.routes.ts +++ b/src/routes/api.routes.ts @@ -4,23 +4,31 @@ import { getEmision, getLastest, getAnime, + getAnimes, searchAnime, getEpisode, getGenders, + getGender, getCategories, - getYears + getYears, + getYear, + getLetters, + getBy } from '../controllers/controller' routes.get('/lastest', (req, res) => { getLastest(req, res); -}) +}); routes.get('/emision', (req, res) => { getEmision(req, res); }); routes.get('/anime/:id', (req, res) => { getAnime(req, res); }); +routes.get('/animes/:page', (req, res) => { + getAnimes(req, res); +}); routes.get('/ver/:id', (req, res) => { getEpisode(req, res); }); @@ -30,11 +38,33 @@ routes.get('/search/:id', (req, res) => { routes.get('/genders', (req, res) => { getGenders(req, res); }); +routes.get('/gender/:gender/:page', (req, res) => { + getGender(req, res); +}); routes.get('/categories', (req, res) => { getCategories(req, res); }); routes.get('/years', (req, res) => { getYears(req, res); }); +routes.get('/year/:year/:page', (req, res) => { + getYear(req, res); +}); +routes.get('/letters', (req, res) => { + getLetters(req, res); +}); +routes.get('/category/:category/gender/:gender', (req, res) => { + getBy(req, res, true) +}) +routes.get('/gender/:gender', (req, res) => { + getBy(req, res); +}) +routes.get('/letter/:letter', (req, res) => { + getBy(req, res); +}) + +routes.get('/category/:category', (req, res) => { + getBy(req, res); +}) export default routes \ No newline at end of file