From fd50405f4571ae940bd0463f45f1ffaaad061869 Mon Sep 17 00:00:00 2001 From: svenanderson Date: Sun, 26 Jul 2020 17:01:43 -0700 Subject: [PATCH 01/14] lambda store example application --- examples/with-lambda-store/.gitignore | 34 ++++ examples/with-lambda-store/README.md | 59 ++++++ examples/with-lambda-store/package.json | 18 ++ examples/with-lambda-store/pages/_app.js | 8 + .../with-lambda-store/pages/api/addemail.js | 36 ++++ .../with-lambda-store/pages/api/create.js | 34 ++++ examples/with-lambda-store/pages/api/list.js | 33 ++++ examples/with-lambda-store/pages/api/vote.js | 33 ++++ examples/with-lambda-store/pages/index.css | 156 ++++++++++++++++ examples/with-lambda-store/pages/index.js | 171 ++++++++++++++++++ examples/with-lambda-store/public/favicon.ico | Bin 0 -> 15086 bytes examples/with-lambda-store/public/logo.png | Bin 0 -> 19132 bytes examples/with-lambda-store/public/lstr.png | Bin 0 -> 54206 bytes examples/with-lambda-store/public/vercel.svg | 4 + 14 files changed, 586 insertions(+) create mode 100644 examples/with-lambda-store/.gitignore create mode 100644 examples/with-lambda-store/README.md create mode 100644 examples/with-lambda-store/package.json create mode 100644 examples/with-lambda-store/pages/_app.js create mode 100644 examples/with-lambda-store/pages/api/addemail.js create mode 100644 examples/with-lambda-store/pages/api/create.js create mode 100644 examples/with-lambda-store/pages/api/list.js create mode 100644 examples/with-lambda-store/pages/api/vote.js create mode 100644 examples/with-lambda-store/pages/index.css create mode 100644 examples/with-lambda-store/pages/index.js create mode 100644 examples/with-lambda-store/public/favicon.ico create mode 100644 examples/with-lambda-store/public/logo.png create mode 100644 examples/with-lambda-store/public/lstr.png create mode 100644 examples/with-lambda-store/public/vercel.svg diff --git a/examples/with-lambda-store/.gitignore b/examples/with-lambda-store/.gitignore new file mode 100644 index 0000000000000..1437c53f70bc2 --- /dev/null +++ b/examples/with-lambda-store/.gitignore @@ -0,0 +1,34 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel diff --git a/examples/with-lambda-store/README.md b/examples/with-lambda-store/README.md new file mode 100644 index 0000000000000..35e0732445ffe --- /dev/null +++ b/examples/with-lambda-store/README.md @@ -0,0 +1,59 @@ +## Roadmap Voting Application - Example app using Lambda Store + +[Lambda Store](https://lambda.store/) is a Serverless Redis cloud service. Redis enables you keep state with low latency and a simple API. With Lambda Store, you can use Redis with just paying what you use thanks to serverless pricing. + +Roadmap Voting application is an example of how you can develop dynamic applications using Lambda Store integrating with Vercel platform. + + +## Step-1: Deploy the application + +You can deploy the example application to your [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) account using: + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/import/git?c=1&s=https://github.com/svenanderson/next.js/tree/canary/examples/with-lambda-store) + +## Step-2 Integrate Lambda Store +You have a running application but its backend is not configured. Now we will integrate Lambda Store as backend. + +#### Add Integration to Your Vercel Account + +Visit Vercel [Lambda Store Integration](https://vercel.com/integrations/lambdastore) page and click the `Add` button. + +#### Configure Integration + +Integration requires [Developer API Key](howto/developerapi.md) which can be created from the [Lambda Store console](https://console.lambda.store). + +Enter the API key and your registered email address in the integration setup page as below: + + + + +#### Integration Dashboard + +In next screen, your databases will be automatically listed. + +New database can be created from the Vercel Integration page as well as the Lambda Store Console. + + + +#### Create Database + +After clicking `New Database` button then create a database as below: + + + + +#### Connect Database to Your Project + +Select your project from the dropdown menu then click `Link To Project` for any database. + +`REDIS_URL` will be automatically set as environment variable for your application. + + + + + +You need to re-deploy your application for the environment variable to be effective. We will do this in the next step. + +## Step-3 Customize The Application + +You can clone the application code from your own github repository that is created in step-1. Then you can modify the code, for example you can replace `public/logo.png` with your project's own logo. Now run `vercel` in the project folder to re-deploy your application. \ No newline at end of file diff --git a/examples/with-lambda-store/package.json b/examples/with-lambda-store/package.json new file mode 100644 index 0000000000000..c787496a1689b --- /dev/null +++ b/examples/with-lambda-store/package.json @@ -0,0 +1,18 @@ +{ + "name": "roadmap-voting", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "9.4.4", + "react": "16.13.1", + "react-dom": "16.13.1", + "react-toastify": "^6.0.8", + "redis": "^3.0.2", + "uuid": "^8.2.0" + } +} diff --git a/examples/with-lambda-store/pages/_app.js b/examples/with-lambda-store/pages/_app.js new file mode 100644 index 0000000000000..36954e25340c1 --- /dev/null +++ b/examples/with-lambda-store/pages/_app.js @@ -0,0 +1,8 @@ +import './index.css' +import 'react-toastify/dist/ReactToastify.css'; + + +// This default export is required in a new `pages/_app.js` file. +export default function MyApp({ Component, pageProps }) { + return +} \ No newline at end of file diff --git a/examples/with-lambda-store/pages/api/addemail.js b/examples/with-lambda-store/pages/api/addemail.js new file mode 100644 index 0000000000000..ac45a927ffdd0 --- /dev/null +++ b/examples/with-lambda-store/pages/api/addemail.js @@ -0,0 +1,36 @@ +const redis = require("redis"); +const {promisify} = require('util'); +const { v4: uuidv4 } = require('uuid'); + + +module.exports = async(req, res) => { + const client = redis.createClient ({ + url : process.env.REDIS_URL + }); + const saddAsync = promisify(client.sadd).bind(client); + + const body = req.body; + const email = body["email"]; + + client.on("error", function(err) { + throw err; + }); + + if (email && validateEmail(email) ) { + await saddAsync("emails", email ); + client.quit() + res.json({ + body: "success" + }) + } else { + client.quit() + res.json({ + error: "Invalid email" + }) + } +} + +function validateEmail(email) { + const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email).toLowerCase()); +} \ No newline at end of file diff --git a/examples/with-lambda-store/pages/api/create.js b/examples/with-lambda-store/pages/api/create.js new file mode 100644 index 0000000000000..8292e5cf0507b --- /dev/null +++ b/examples/with-lambda-store/pages/api/create.js @@ -0,0 +1,34 @@ +const redis = require("redis"); +const {promisify} = require('util'); +const { v4: uuidv4 } = require('uuid'); + + +module.exports = async(req, res) => { + const client = redis.createClient ({ + url : process.env.REDIS_URL + }); + const hsetAsync = promisify(client.hset).bind(client); + const zaddAsync = promisify(client.zadd).bind(client); + + const body = req.body; + const title = body["title"]; + const id = uuidv4(); + + client.on("error", function(err) { + throw err; + }); + + if (title) { + await zaddAsync("roadmap", 0, id ); + await hsetAsync(id, "title", title); + client.quit() + res.json({ + body: "success" + }) + } else { + client.quit() + res.json({ + error: "Feature can not be empty" + }) + } +} diff --git a/examples/with-lambda-store/pages/api/list.js b/examples/with-lambda-store/pages/api/list.js new file mode 100644 index 0000000000000..160e3137c8b72 --- /dev/null +++ b/examples/with-lambda-store/pages/api/list.js @@ -0,0 +1,33 @@ +const redis = require("redis"); +const {promisify} = require('util'); + +module.exports = async(req, res) => { + const client = redis.createClient ({ + url : process.env.REDIS_URL + }); + const hgetallAsync = promisify(client.hgetall).bind(client); + const zrevrangeAsync = promisify(client.zrevrange).bind(client); + + let n = await zrevrangeAsync("roadmap", 0, 50, "WITHSCORES"); + let result = [] + const promises = [] + for (let i = 0; i < n.length-1; i += 2) { + let id = n[i] + let p = hgetallAsync(id).then( item => { + if(item) { + item["id"] = id + item["score"] = n[i+1] + result.push(item) + } + }) + promises.push(p); + } + + await Promise.all(promises).then( () => { + client.quit(); + }); + + res.json({ + body: result + }) +} diff --git a/examples/with-lambda-store/pages/api/vote.js b/examples/with-lambda-store/pages/api/vote.js new file mode 100644 index 0000000000000..5cfd79ea49a0e --- /dev/null +++ b/examples/with-lambda-store/pages/api/vote.js @@ -0,0 +1,33 @@ +const redis = require("redis"); +const {promisify} = require('util'); + + + +module.exports = async(req, res) => { + const client = redis.createClient ({ + url : process.env.REDIS_URL + }); + client.on("error", function (err) { + throw err; + }); + + const body = req.body + const id = body["id"]; + let ip = req.headers["x-forwarded-for"]; + const saddAsync = promisify(client.sadd).bind(client); + let c = await saddAsync("s:" + id, ip); + if(c === 0) { + client.quit(); + res.json({ + error: "You can not vote an item multiple times" + }) + } else { + const zincrbyAsync = promisify(client.zincrby).bind(client); + let v = await zincrbyAsync("roadmap", 1, id); + client.quit(); + res.json({ + body: v + }) + } +} + diff --git a/examples/with-lambda-store/pages/index.css b/examples/with-lambda-store/pages/index.css new file mode 100644 index 0000000000000..cc049c186cde2 --- /dev/null +++ b/examples/with-lambda-store/pages/index.css @@ -0,0 +1,156 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, + Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, + sans-serif; +} + +* { + box-sizing: border-box; +} + +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +main { + padding: 3rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +footer img { + margin-left: 0.5rem; + margin-right: 0.5rem; + height: 1em; +} + +footer a { + display: flex; + justify-content: center; + align-items: center; +} + +a { + color: inherit; + text-decoration: none; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, + DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 1rem; +} + +.card { + margin: 0.2rem; + flex-basis: 85%; + padding: 1.1rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + font-size: 1.25rem; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.logo { + width: 5.0em; +} + +.upvotediv{ + color: #0070f3; + float: right; + font-size: 1.9rem; +} + +.blue { + color: #0070f3; +} + +.upvotediv:hover, +.upvotediv:focus, +.upvotediv:active { + color: #E40D34; +} + +.noborder { + border: none; + background: transparent; + font-size: 1.25rem; + width: 80%; + padding: 5px; +} + +.button { + background: transparent; + font-size: 1.25rem; + float: right; + cursor: pointer; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} \ No newline at end of file diff --git a/examples/with-lambda-store/pages/index.js b/examples/with-lambda-store/pages/index.js new file mode 100644 index 0000000000000..ab0189ac95768 --- /dev/null +++ b/examples/with-lambda-store/pages/index.js @@ -0,0 +1,171 @@ +import Head from 'next/head' +import { ToastContainer, toast } from 'react-toastify'; + + +class Home extends React.Component { + + constructor(props) { + super(props); + this.handleNewFeature = this.handleNewFeature.bind(this); + this.handleNewEmail = this.handleNewEmail.bind(this); + this.inputNewFeature = React.createRef(); + this.inputEmail = React.createRef(); + this.props = props + this.state = { + error: null, + isLoaded: false, + items: [] + }; + } + + refreshData() { + fetch("api/list") + .then(res => res.json()) + .then( + (result) => { + this.setState({ + isLoaded: true, + items: result.body + }); + this.inputNewFeature.current.value = ""; + }, + (error) => { + this.setState({ + isLoaded: true, + error + }); + } + ) + } + + vote(event, id) { + const requestOptions = { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({"id": id}) + }; + console.log(requestOptions); + fetch('api/vote', requestOptions) + .then(response => response.json()).then(data => { + console.log(data) + if(data.error) { + toast.error(data.error, {hideProgressBar: true, autoClose: 3000}); + } else { + this.refreshData() + } + }) + } + + handleNewFeature(event) { + const requestOptions = { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({"title": this.inputNewFeature.current.value}) + }; + fetch('api/create', requestOptions) + .then(response => response.json()).then(data => { + if(data.error) { + toast.error(data.error, {hideProgressBar: true, autoClose: 3000}); + } else { + toast.info("Your feature has been added to the list.", {hideProgressBar: true, autoClose: 3000}); + this.refreshData() + } + }); + event.preventDefault(); + } + + handleNewEmail(event) { + const requestOptions = { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({"email": this.inputEmail.current.value}) + }; + console.log(requestOptions); + fetch('api/addemail', requestOptions) + .then(response => response.json()).then(data => { + if(data.error) { + toast.error(data.error, {hideProgressBar: true, autoClose: 3000}); + } else { + toast.info("Your email has been added to the list.", {hideProgressBar: true, autoClose: 3000}); + this.refreshData() + } + }); + event.preventDefault(); + } + + componentDidMount() { + this.refreshData(); + } + + render() { + const {items} = this.state; + + return ( +
+ + Roadmap Voting + + + +
+

+ Your Project Logo +

+ +

+ Help us by voting our roadmap.
+ + Vote up the features you want to see in the next release. +

+ +
+ + {items.map((item, ind) => ( + + ))} + +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + + +
+ ) + } +} + +export default Home; diff --git a/examples/with-lambda-store/public/favicon.ico b/examples/with-lambda-store/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a GIT binary patch literal 15086 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 ktgDYrIu8?&O7k0wRG_IsgCw literal 0 HcmV?d00001 diff --git a/examples/with-lambda-store/public/lstr.png b/examples/with-lambda-store/public/lstr.png new file mode 100644 index 0000000000000000000000000000000000000000..e25ccf5d51583f35272e07a6608d4e30f109989a GIT binary patch literal 54206 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 m5BX9%mGsF4r##%NCy$DdO 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 literal 0 HcmV?d00001 diff --git a/examples/with-lambda-store/public/vercel.svg b/examples/with-lambda-store/public/vercel.svg new file mode 100644 index 0000000000000..fbf0e25a651c2 --- /dev/null +++ b/examples/with-lambda-store/public/vercel.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file From 4fc37f077cbddbd6ac34cef85d6e5664a100de25 Mon Sep 17 00:00:00 2001 From: svenanderson Date: Sun, 26 Jul 2020 17:05:25 -0700 Subject: [PATCH 02/14] fix image urls --- examples/with-lambda-store/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/with-lambda-store/README.md b/examples/with-lambda-store/README.md index 35e0732445ffe..8cc9733633931 100644 --- a/examples/with-lambda-store/README.md +++ b/examples/with-lambda-store/README.md @@ -24,7 +24,7 @@ Integration requires [Developer API Key](howto/developerapi.md) which can be cre Enter the API key and your registered email address in the integration setup page as below: - + #### Integration Dashboard @@ -33,13 +33,13 @@ In next screen, your databases will be automatically listed. New database can be created from the Vercel Integration page as well as the Lambda Store Console. - + #### Create Database After clicking `New Database` button then create a database as below: - + #### Connect Database to Your Project @@ -48,9 +48,9 @@ Select your project from the dropdown menu then click `Link To Project` for any `REDIS_URL` will be automatically set as environment variable for your application. - + - + You need to re-deploy your application for the environment variable to be effective. We will do this in the next step. From 2ea80d98c03b9831c5bc85e2b0f4ebc03662f22d Mon Sep 17 00:00:00 2001 From: svenanderson Date: Sun, 26 Jul 2020 23:42:01 -0700 Subject: [PATCH 03/14] fix readme --- examples/with-lambda-store/README.md | 16 +++++++++++++--- examples/with-lambda-store/pages/index.js | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/with-lambda-store/README.md b/examples/with-lambda-store/README.md index 8cc9733633931..aa88f53268271 100644 --- a/examples/with-lambda-store/README.md +++ b/examples/with-lambda-store/README.md @@ -2,7 +2,7 @@ [Lambda Store](https://lambda.store/) is a Serverless Redis cloud service. Redis enables you keep state with low latency and a simple API. With Lambda Store, you can use Redis with just paying what you use thanks to serverless pricing. -Roadmap Voting application is an example of how you can develop dynamic applications using Lambda Store integrating with Vercel platform. +Roadmap Voting application is an example of how you can develop dynamic applications using Lambda Store integrating with Vercel platform. In this application, the frontend, which is implemented with Next.js, fetches the data from Redis (Lambda Store) via Vercel functions. Following the below steps, you can build your own roadmap voting app like we did for Lambda Store [here](https://roadmap.lambda.store/) ## Step-1: Deploy the application @@ -12,7 +12,7 @@ You can deploy the example application to your [Vercel](https://vercel.com?utm_s [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/import/git?c=1&s=https://github.com/svenanderson/next.js/tree/canary/examples/with-lambda-store) ## Step-2 Integrate Lambda Store -You have a running application but its backend is not configured. Now we will integrate Lambda Store as backend. +Your application is running but its backend is not configured. Now we will integrate Lambda Store. #### Add Integration to Your Vercel Account @@ -56,4 +56,14 @@ You need to re-deploy your application for the environment variable to be effect ## Step-3 Customize The Application -You can clone the application code from your own github repository that is created in step-1. Then you can modify the code, for example you can replace `public/logo.png` with your project's own logo. Now run `vercel` in the project folder to re-deploy your application. \ No newline at end of file +To customize the application, clone the code from your github repository that is created in step-1. Then you can modify the code, for example replace `public/logo.png` with your project's own logo. Once you commit and push your changes, Vercel will deploy your application automatically. Now you can test your application, you should be able to add new features. + +This application has three functionality: +- Users can add new features. If you want to remove or edit any item, use lambda store console to connect your Redis database via Redis-cli. To find id of any feature item, click the vote button, you will see its id on the url. Using this id you edit the item via `hset title "new title"` + +- Users can upvote feature items. The backend records the ip-addresses of the voters, so it does not allow multiple votes on the same item from the same IP address. + +- Users can enter their email addresses to be notified about the released items. You can get the email addresses using lambda store console to connect your Redis database via Redis-cli. Run `smembers emails` will give you the emails. + + + diff --git a/examples/with-lambda-store/pages/index.js b/examples/with-lambda-store/pages/index.js index ab0189ac95768..33c178be923c6 100644 --- a/examples/with-lambda-store/pages/index.js +++ b/examples/with-lambda-store/pages/index.js @@ -153,7 +153,7 @@ class Home extends React.Component {