215 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // import React from 'react';
 | |
| // import { renderToString } from 'react-dom/server';
 | |
| // // import { StaticRouter } from 'react-router-dom';
 | |
| // import { has } from 'lodash';
 | |
| import debug from 'debug';
 | |
| 
 | |
| // import NewsApp from '../../news/NewsApp';
 | |
| 
 | |
| const routerLog = debug('fcc:boot:news:router');
 | |
| const apiLog = debug('fcc:boot:news:api');
 | |
| 
 | |
| export default function newsBoot(app) {
 | |
|   // const router = app.loopback.Router();
 | |
|   // const api = app.loopback.Router();
 | |
| 
 | |
|   // router.get('/n', (req, res) => res.redirect('/news'));
 | |
|   // router.get('/n/:shortId', createShortLinkHandler(app));
 | |
| 
 | |
|   // router.get('/news', serveNewsApp);
 | |
|   // router.get('/news/*', serveNewsApp);
 | |
| 
 | |
|   // api.post('/p', createPopularityHandler(app));
 | |
| 
 | |
|   // app.use(api);
 | |
|   // app.use(router);
 | |
| }
 | |
| 
 | |
| // function serveNewsApp(req, res) {
 | |
| //   const context = {};
 | |
| //   const markup = renderToString(
 | |
| //     <StaticRouter basename='/news' context={context} location={req.url}>
 | |
| //       <NewsApp />
 | |
| //     </StaticRouter>
 | |
| //   );
 | |
| //   if (context.url) {
 | |
| //     routerLog('redirect found in `renderToString`');
 | |
| //     // 'client-side' routing hit on a redirect
 | |
| //     return res.redirect(context.url);
 | |
| //   }
 | |
| //   routerLog('news markup sending');
 | |
| //   return res.render('layout-news', { title: 'News | freeCodeCamp', markup });
 | |
| // }
 | |
| 
 | |
| // function createShortLinkHandler(app) {
 | |
| //   const { Article } = app.models;
 | |
| 
 | |
| //   const referralHandler = createRerralHandler(app);
 | |
| 
 | |
| //   return function shortLinkHandler(req, res, next) {
 | |
| //     const { query, user } = req;
 | |
| //     const { shortId } = req.params;
 | |
| 
 | |
| //     referralHandler(query, shortId, !!user);
 | |
| 
 | |
| //     routerLog(req.origin);
 | |
| //     routerLog(query.refsource);
 | |
| //     if (!shortId) {
 | |
| //       return res.redirect('/news');
 | |
| //     }
 | |
| //     routerLog('shortId', shortId);
 | |
| //     return Article.findOne(
 | |
| //       {
 | |
| //         where: {
 | |
| //           or: [{ shortId }, { slugPart: shortId }]
 | |
| //         }
 | |
| //       },
 | |
| //       (err, article) => {
 | |
| //         if (err) {
 | |
| //           next(err);
 | |
| //         }
 | |
| //         if (!article) {
 | |
| //           return res.redirect('/news');
 | |
| //         }
 | |
| //         const {
 | |
| //           slugPart,
 | |
| //           shortId,
 | |
| //           author: { username }
 | |
| //         } = article;
 | |
| //         const slug = `/news/${username}/${slugPart}--${shortId}`;
 | |
| //         return res.redirect(slug);
 | |
| //       }
 | |
| //     );
 | |
| //   };
 | |
| // }
 | |
| 
 | |
| // function createPopularityHandler(app) {
 | |
| //   const { Article, Popularity } = app.models;
 | |
| 
 | |
| //   return function handlePopularityStats(req, res, next) {
 | |
| //     const { body, user } = req;
 | |
| 
 | |
| //     if (
 | |
| //       !has(body, 'event') ||
 | |
| //       !has(body, 'timestamp') ||
 | |
| //       !has(body, 'shortId')
 | |
| //     ) {
 | |
| //       console.warn('Popularity event recieved from client is malformed');
 | |
| //       console.log(JSON.stringify(body, null, 2));
 | |
| //       // sending 200 because the client shouldn't care for this
 | |
| //       return res.sendStatus(200);
 | |
| //     }
 | |
| //     res.sendStatus(200);
 | |
| //     const { shortId } = body;
 | |
| //     apiLog('shortId', shortId);
 | |
| //     const populartiyUpdate = {
 | |
| //       ...body,
 | |
| //       byAuthenticatedUser: !!user
 | |
| //     };
 | |
| //     Popularity.findOne({ where: { articleId: shortId } }, (err, popularity) => {
 | |
| //       if (err) {
 | |
| //         apiLog(err);
 | |
| //         return next(err);
 | |
| //       }
 | |
| //       if (popularity) {
 | |
| //         return popularity.updateAttribute(
 | |
| //           'events',
 | |
| //           [populartiyUpdate, ...popularity.events],
 | |
| //           err => {
 | |
| //             if (err) {
 | |
| //               apiLog(err);
 | |
| //               return next(err);
 | |
| //             }
 | |
| //             return apiLog('poplarity updated');
 | |
| //           }
 | |
| //         );
 | |
| //       }
 | |
| //       return Popularity.create(
 | |
| //         {
 | |
| //           events: [populartiyUpdate],
 | |
| //           articleId: shortId
 | |
| //         },
 | |
| //         err => {
 | |
| //           if (err) {
 | |
| //             apiLog(err);
 | |
| //             return next(err);
 | |
| //           }
 | |
| //           return apiLog('poulartiy created');
 | |
| //         }
 | |
| //       );
 | |
| //     });
 | |
| //     return body.event === 'view'
 | |
| //       ? Article.findOne({ where: { shortId } }, (err, article) => {
 | |
| //           if (err) {
 | |
| //             apiLog(err);
 | |
| //             next(err);
 | |
| //           }
 | |
| //           return article.updateAttributes(
 | |
| //             { viewCount: article.viewCount + 1 },
 | |
| //             err => {
 | |
| //               if (err) {
 | |
| //                 apiLog(err);
 | |
| //                 return next(err);
 | |
| //               }
 | |
| //               return apiLog('article views updated');
 | |
| //             }
 | |
| //           );
 | |
| //         })
 | |
| //       : null;
 | |
| //   };
 | |
| // }
 | |
| 
 | |
| // function createRerralHandler(app) {
 | |
| //   const { Popularity } = app.models;
 | |
| 
 | |
| //   return function referralHandler(query, shortId, byAuthenticatedUser) {
 | |
| //     if (!query.refsource) {
 | |
| //       return null;
 | |
| //     }
 | |
| //     const eventUpdate = {
 | |
| //       event: `referral - ${query.refsource}`,
 | |
| //       timestamp: new Date(Date.now()),
 | |
| //       byAuthenticatedUser
 | |
| //     };
 | |
| //     return Popularity.findOne(
 | |
| //       { where: { articleId: shortId } },
 | |
| //       (err, popularity) => {
 | |
| //         if (err) {
 | |
| //           console.error(
 | |
| //             'Failed finding a `Popularity` in a referral handler',
 | |
| //             err
 | |
| //           );
 | |
| //           return null;
 | |
| //         }
 | |
| 
 | |
| //         if (popularity) {
 | |
| //           return popularity.updateAttribute(
 | |
| //             'events',
 | |
| //             [eventUpdate, ...popularity.events],
 | |
| //             err => {
 | |
| //               if (err) {
 | |
| //                 console.error(
 | |
| //                   'Failed in updating the `events` attribute of a `popularity`',
 | |
| //                   err
 | |
| //                 );
 | |
| //               }
 | |
| //             }
 | |
| //           );
 | |
| //         }
 | |
| //         return Popularity.create(
 | |
| //           {
 | |
| //             events: [eventUpdate],
 | |
| //             articleId: shortId
 | |
| //           },
 | |
| //           err => {
 | |
| //             if (err) {
 | |
| //               return console.error('Failed creating a new `Popularity`', err);
 | |
| //             }
 | |
| //             return apiLog('poulartiy created');
 | |
| //           }
 | |
| //         );
 | |
| //       }
 | |
| //     );
 | |
| //   };
 | |
| // }
 |