diff --git a/functions/hits.js b/functions/hits.js index 917b0c52..9f259f26 100644 --- a/functions/hits.js +++ b/functions/hits.js @@ -17,7 +17,7 @@ exports.handler = async (event) => { return { statusCode: 400, body: JSON.stringify({ - message: "Page slug required.", + message: "Parameter `slug` is required.", }), }; } @@ -40,7 +40,6 @@ exports.handler = async (event) => { Pragma: "no-cache", "Access-Control-Allow-Methods": "GET", "Access-Control-Allow-Origin": "*", - "x-fauna-ts": result.ts.toString().slice(0, -3), }, body: JSON.stringify({ slug: result.data.slug, diff --git a/functions/popular.js b/functions/popular.js new file mode 100644 index 00000000..fffb9385 --- /dev/null +++ b/functions/popular.js @@ -0,0 +1,51 @@ +"use strict"; + +const faunadb = require("faunadb"), + q = faunadb.query; +const numeral = require("numeral"); +const pluralize = require("pluralize"); +require("dotenv").config(); + +exports.handler = async () => { + try { + const client = new faunadb.Client({ + secret: process.env.FAUNADB_SERVER_SECRET, + }); + + const result = await client.query( + q.Map( + q.Paginate(q.Documents(q.Collection("hits"))), + q.Lambda((x) => q.Select("data", q.Get(x))) + ) + ); + + const posts = result.data.sort((a, b) => { + return a.hits > b.hits ? -1 : 1; + }); + + posts.forEach((p) => { + p.pretty_hits = numeral(p.hits).format("0,0"); + p.pretty_unit = pluralize("hit", p.hits); + p.url = "https://jarv.is/" + p.slug + "/"; + }); + + return { + statusCode: 200, + headers: { + "Content-Type": "application/json; charset=utf-8", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Origin": "*", + }, + body: JSON.stringify(posts), + }; + } catch (error) { + console.error(error); + + return { + statusCode: 400, + body: JSON.stringify({ + message: error.message, + }), + }; + } +}; diff --git a/package.json b/package.json index 6e3b91f0..17a4af52 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "imagemin-cli": "^6.0.0", "lint-staged": "^11.0.0", "markdownlint-cli": "~0.27.1", - "netlify-lambda": "^2.0.7", + "netlify-lambda": "^2.0.8", "npm-run-all": "^4.1.5", "postcss": "^8.3.0", "postcss-clean": "jakejarvis/postcss-clean#master", diff --git a/yarn.lock b/yarn.lock index c0daf05c..8cbdf84a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1952,9 +1952,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001166, caniuse-lite@^1.0.30001179, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001230: - version "1.0.30001230" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" - integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== + version "1.0.30001231" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001231.tgz#6c1f9b49fc27cc368b894e64b9b28b39ef80603b" + integrity sha512-WAFFv31GgU4DiwNAy77qMo3nNyycEhH3ikcCVHvkQpPe/fO8Tb2aRYzss8kgyLQBm8mJ7OryW4X6Y4vsBCIqag== caw@^2.0.0, caw@^2.0.1: version "2.0.1" @@ -5584,11 +5584,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.47.0, mime-db@^1.28.0: +mime-db@1.47.0: version "1.47.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@^1.28.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + mime-types@~2.1.24: version "2.1.30" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" @@ -5777,10 +5782,10 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -netlify-lambda@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/netlify-lambda/-/netlify-lambda-2.0.7.tgz#09475e6ec658a7501934697d27addc4d45b5c353" - integrity sha512-vHgEIUhUq+StzLPzh4JXf2jTjD/N8RYaGWUnsSykSd/KvTbGoVL95XPN9modVi0Bm5MCFNAUuEAiLdxZeQvR7Q== +netlify-lambda@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/netlify-lambda/-/netlify-lambda-2.0.8.tgz#d8e3abcc052c436ea768d317a3c2a8dac6320e53" + integrity sha512-y7bR8DXUYWsCPvxoq7fFAuRrRIKJ80NJKHJhck8B7Y37fTaePl5PyvgE07EliBwKyO0udfbRqOadh/aMBVEGrw== dependencies: "@babel/core" "^7.10.4" "@babel/plugin-proposal-class-properties" "^7.10.4"