├── .gitignore
├── .vscode
└── launch.json
├── LICENSE
├── README.md
├── backend
├── .gitignore
├── package-lock.json
├── package.json
└── server.js
├── frontend
├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── assets
│ └── movie.data.js
│ ├── components
│ ├── book-date
│ │ ├── book-date.component.jsx
│ │ └── book-date.styles.scss
│ ├── book-movie-title
│ │ ├── book-movie-title.component.jsx
│ │ └── book-movie-title.styles.scss
│ ├── book-show
│ │ ├── book-show.component.jsx
│ │ └── book-show.styles.scss
│ ├── collection-details-movie
│ │ ├── collection-details-movie.component.jsx
│ │ └── collection-details-movie.styles.scss
│ ├── collection-item
│ │ ├── collection-item.component.jsx
│ │ └── collection-item.styles.scss
│ ├── collection-preview
│ │ ├── collection-preview.component.jsx
│ │ └── collection-preview.styles.scss
│ ├── header
│ │ ├── header.component.jsx
│ │ └── header.styles.scss
│ ├── sign-in
│ │ ├── sign-in.component.jsx
│ │ └── sign-in.styles.scss
│ └── sign-up
│ │ ├── sign-up.component.jsx
│ │ └── sign-up.styles.scss
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── pages
│ ├── book-date-page
│ │ ├── book-date-page.component.jsx
│ │ └── book-date-page.styles.scss
│ ├── book-movie-title-page
│ │ ├── book-movie-title-page.component.jsx
│ │ └── book-movie-title-page.styles.scss
│ ├── book-show-page
│ │ ├── book-show-page.component.jsx
│ │ └── book-show-page.styles.scss
│ ├── collection-details-page
│ │ ├── collection-details-page.component.jsx
│ │ └── collection-details-page.styles.scss
│ ├── homepage
│ │ ├── homepage.component.jsx
│ │ └── homepage.styles.scss
│ ├── now-showing
│ │ ├── now-showing.component.jsx
│ │ └── now-showing.styles.scss
│ ├── pay-page
│ │ ├── pay-page.component.jsx
│ │ └── pay-page.styles.scss
│ ├── popular
│ │ ├── popular.component.jsx
│ │ └── popular.styles.scss
│ ├── sign-in-and-sign-up
│ │ ├── sign-in-and-sign-up.component.jsx
│ │ └── sign-in-and-sign-up.styles.scss
│ └── upcoming
│ │ ├── upcoming.component.jsx
│ │ └── upcoming.styles.scss
│ └── serviceWorker.js
├── package-lock.json
├── package.json
└── snapshots
├── screenshot-1.png
└── screenshot-2.png
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "type": "node",
9 | "request": "launch",
10 | "name": "Launch Program",
11 | "program": "${workspaceFolder}\\index.js"
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Ahmed Gulab Khan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MovieGo
2 | ## About
3 | A Website implemented using MERN (MongoDB, ExpressJS, ReactJS and NodeJS) stack, which allows users to sign-in/register and book movie tickets online.
4 |
5 | ## Snapshots of the website
6 |
7 | 1. Snapshot - 1
8 |
9 | 
10 |
11 | 2. Snapshot - 2
12 |
13 | 
14 |
15 | ## Things to Download before you proceed
16 | I used the MERN (MongoDB, ExpressJS, ReactJS and NodeJS) stack for this project.
17 |
18 | 
19 |
20 | - [NodeJS](https://nodejs.org/en/)
21 | - [MongoDB](https://www.mongodb.com/download-center)
22 |
23 | The package.json files in the root, frontend and the backend folders contain all the required dependencies. First go ahead and make sure to download the latest stable version of [NodeJS](https://nodejs.org/en/) and also the latest version of [MongoDB](https://www.mongodb.com/download-center). Clone the repository and run the command `npm install` while in the root, frontend and backend folders to install all the dependencies. All the required steps to set up the project are mentioned below. Just follow through.
24 |
25 | ## Configuration Steps
26 | 1. Cloning the repository:
27 |
28 | ```
29 | $ git clone https://github.com/ahmedgulabkhan/MovieGo.git
30 | ```
31 |
32 | 2. Installing the dependencies (using terminal):
33 |
34 | ```
35 | $ cd MovieGo
36 | $ npm install
37 |
38 | $ cd backend
39 | $ npm install
40 |
41 | $ cd..
42 |
43 | $ cd fronted
44 | $ npm install
45 | ```
46 | This installs all the required dependencies like React, React-router-dom, Concurrently, Express, Mongoose, Passport, etc.
47 |
48 | 3. dotenv file:
49 |
50 | Create a .env file in the backend folder, and write the following code
51 |
52 | `SECRET=Anythingyouwant`
53 |
54 | and save it. The `SECRET` variable can literally have any value.
55 |
56 | 4. Configuring MongoDB:
57 |
58 | Open your terminal, and go to the directory where you have MongoDB installed and from thereon cd to the directory which has the 'mongod.exe' file inside it. After you reach that directory through your terminal, type `mongod` and press enter, and the MongoDB server starts running locally on your machine on port 27017.
59 |
60 | 5. Checking if everything works fine:
61 |
62 | Now open another terminal and cd to the MovieGo directory. Run the following code:
63 |
64 | `$ npm start`
65 |
66 | and you shall see that the website is loaded on your localhost port 3000.
67 |
68 | ## Currently Working On
69 | - Using Bootstrap to make the website responsive.
70 |
71 | - Different categories of seats with different prices like 'Gold - Rs. 150', 'Silver - Rs. 100' and 'Regular - Rs. 50'.
72 |
73 | - ReactJS Pagination.
74 |
75 | - Users can book multiple seats at the same time.
76 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "accepts": {
8 | "version": "1.3.7",
9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
11 | "requires": {
12 | "mime-types": "~2.1.24",
13 | "negotiator": "0.6.2"
14 | }
15 | },
16 | "array-flatten": {
17 | "version": "1.1.1",
18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
20 | },
21 | "bluebird": {
22 | "version": "3.5.1",
23 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
24 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
25 | },
26 | "body-parser": {
27 | "version": "1.19.0",
28 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
29 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
30 | "requires": {
31 | "bytes": "3.1.0",
32 | "content-type": "~1.0.4",
33 | "debug": "2.6.9",
34 | "depd": "~1.1.2",
35 | "http-errors": "1.7.2",
36 | "iconv-lite": "0.4.24",
37 | "on-finished": "~2.3.0",
38 | "qs": "6.7.0",
39 | "raw-body": "2.4.0",
40 | "type-is": "~1.6.17"
41 | }
42 | },
43 | "bson": {
44 | "version": "1.1.6",
45 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz",
46 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg=="
47 | },
48 | "bytes": {
49 | "version": "3.1.0",
50 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
51 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
52 | },
53 | "content-disposition": {
54 | "version": "0.5.3",
55 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
56 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
57 | "requires": {
58 | "safe-buffer": "5.1.2"
59 | }
60 | },
61 | "content-type": {
62 | "version": "1.0.4",
63 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
64 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
65 | },
66 | "cookie": {
67 | "version": "0.4.0",
68 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
69 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
70 | },
71 | "cookie-signature": {
72 | "version": "1.0.6",
73 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
74 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
75 | },
76 | "cors": {
77 | "version": "2.8.5",
78 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
79 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
80 | "requires": {
81 | "object-assign": "^4",
82 | "vary": "^1"
83 | }
84 | },
85 | "debug": {
86 | "version": "2.6.9",
87 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
88 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
89 | "requires": {
90 | "ms": "2.0.0"
91 | }
92 | },
93 | "depd": {
94 | "version": "1.1.2",
95 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
97 | },
98 | "destroy": {
99 | "version": "1.0.4",
100 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
102 | },
103 | "dotenv": {
104 | "version": "8.2.0",
105 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
106 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
107 | },
108 | "ee-first": {
109 | "version": "1.1.1",
110 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
111 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
112 | },
113 | "ejs": {
114 | "version": "2.7.1",
115 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz",
116 | "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ=="
117 | },
118 | "encodeurl": {
119 | "version": "1.0.2",
120 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
121 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
122 | },
123 | "escape-html": {
124 | "version": "1.0.3",
125 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
126 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
127 | },
128 | "etag": {
129 | "version": "1.8.1",
130 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
131 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
132 | },
133 | "express": {
134 | "version": "4.17.1",
135 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
136 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
137 | "requires": {
138 | "accepts": "~1.3.7",
139 | "array-flatten": "1.1.1",
140 | "body-parser": "1.19.0",
141 | "content-disposition": "0.5.3",
142 | "content-type": "~1.0.4",
143 | "cookie": "0.4.0",
144 | "cookie-signature": "1.0.6",
145 | "debug": "2.6.9",
146 | "depd": "~1.1.2",
147 | "encodeurl": "~1.0.2",
148 | "escape-html": "~1.0.3",
149 | "etag": "~1.8.1",
150 | "finalhandler": "~1.1.2",
151 | "fresh": "0.5.2",
152 | "merge-descriptors": "1.0.1",
153 | "methods": "~1.1.2",
154 | "on-finished": "~2.3.0",
155 | "parseurl": "~1.3.3",
156 | "path-to-regexp": "0.1.7",
157 | "proxy-addr": "~2.0.5",
158 | "qs": "6.7.0",
159 | "range-parser": "~1.2.1",
160 | "safe-buffer": "5.1.2",
161 | "send": "0.17.1",
162 | "serve-static": "1.14.1",
163 | "setprototypeof": "1.1.1",
164 | "statuses": "~1.5.0",
165 | "type-is": "~1.6.18",
166 | "utils-merge": "1.0.1",
167 | "vary": "~1.1.2"
168 | }
169 | },
170 | "express-session": {
171 | "version": "1.17.0",
172 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz",
173 | "integrity": "sha512-t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==",
174 | "requires": {
175 | "cookie": "0.4.0",
176 | "cookie-signature": "1.0.6",
177 | "debug": "2.6.9",
178 | "depd": "~2.0.0",
179 | "on-headers": "~1.0.2",
180 | "parseurl": "~1.3.3",
181 | "safe-buffer": "5.2.0",
182 | "uid-safe": "~2.1.5"
183 | },
184 | "dependencies": {
185 | "depd": {
186 | "version": "2.0.0",
187 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
188 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
189 | },
190 | "safe-buffer": {
191 | "version": "5.2.0",
192 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
193 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
194 | }
195 | }
196 | },
197 | "finalhandler": {
198 | "version": "1.1.2",
199 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
200 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
201 | "requires": {
202 | "debug": "2.6.9",
203 | "encodeurl": "~1.0.2",
204 | "escape-html": "~1.0.3",
205 | "on-finished": "~2.3.0",
206 | "parseurl": "~1.3.3",
207 | "statuses": "~1.5.0",
208 | "unpipe": "~1.0.0"
209 | }
210 | },
211 | "forwarded": {
212 | "version": "0.1.2",
213 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
214 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
215 | },
216 | "fresh": {
217 | "version": "0.5.2",
218 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
219 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
220 | },
221 | "generaterr": {
222 | "version": "1.5.0",
223 | "resolved": "https://registry.npmjs.org/generaterr/-/generaterr-1.5.0.tgz",
224 | "integrity": "sha1-sM62zFFk3yoGEzjMNAqGFTlcUvw="
225 | },
226 | "http-errors": {
227 | "version": "1.7.2",
228 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
229 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
230 | "requires": {
231 | "depd": "~1.1.2",
232 | "inherits": "2.0.3",
233 | "setprototypeof": "1.1.1",
234 | "statuses": ">= 1.5.0 < 2",
235 | "toidentifier": "1.0.0"
236 | }
237 | },
238 | "iconv-lite": {
239 | "version": "0.4.24",
240 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
241 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
242 | "requires": {
243 | "safer-buffer": ">= 2.1.2 < 3"
244 | }
245 | },
246 | "inherits": {
247 | "version": "2.0.3",
248 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
249 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
250 | },
251 | "ipaddr.js": {
252 | "version": "1.9.0",
253 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
254 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
255 | },
256 | "kareem": {
257 | "version": "2.3.1",
258 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
259 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
260 | },
261 | "media-typer": {
262 | "version": "0.3.0",
263 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
264 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
265 | },
266 | "memory-pager": {
267 | "version": "1.5.0",
268 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
269 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
270 | "optional": true
271 | },
272 | "merge-descriptors": {
273 | "version": "1.0.1",
274 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
275 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
276 | },
277 | "methods": {
278 | "version": "1.1.2",
279 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
280 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
281 | },
282 | "mime": {
283 | "version": "1.6.0",
284 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
285 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
286 | },
287 | "mime-db": {
288 | "version": "1.40.0",
289 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
290 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
291 | },
292 | "mime-types": {
293 | "version": "2.1.24",
294 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
295 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
296 | "requires": {
297 | "mime-db": "1.40.0"
298 | }
299 | },
300 | "mongodb": {
301 | "version": "3.3.3",
302 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz",
303 | "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==",
304 | "requires": {
305 | "bson": "^1.1.1",
306 | "require_optional": "^1.0.1",
307 | "safe-buffer": "^5.1.2",
308 | "saslprep": "^1.0.0"
309 | }
310 | },
311 | "mongoose": {
312 | "version": "5.7.7",
313 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.7.tgz",
314 | "integrity": "sha512-FU59waB4LKBa9KOnqBUcCcMIVRc09TFo1F8nMxrzSiIWATaJpjxxSSH5FBVUDxQfNdJLfg9uFHxaTxhhwjsZOQ==",
315 | "requires": {
316 | "bson": "~1.1.1",
317 | "kareem": "2.3.1",
318 | "mongodb": "3.3.3",
319 | "mongoose-legacy-pluralize": "1.0.2",
320 | "mpath": "0.6.0",
321 | "mquery": "3.2.2",
322 | "ms": "2.1.2",
323 | "regexp-clone": "1.0.0",
324 | "safe-buffer": "5.1.2",
325 | "sift": "7.0.1",
326 | "sliced": "1.0.1"
327 | },
328 | "dependencies": {
329 | "ms": {
330 | "version": "2.1.2",
331 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
332 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
333 | }
334 | }
335 | },
336 | "mongoose-legacy-pluralize": {
337 | "version": "1.0.2",
338 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
339 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
340 | },
341 | "mpath": {
342 | "version": "0.6.0",
343 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
344 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
345 | },
346 | "mquery": {
347 | "version": "3.2.2",
348 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz",
349 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==",
350 | "requires": {
351 | "bluebird": "3.5.1",
352 | "debug": "3.1.0",
353 | "regexp-clone": "^1.0.0",
354 | "safe-buffer": "5.1.2",
355 | "sliced": "1.0.1"
356 | },
357 | "dependencies": {
358 | "debug": {
359 | "version": "3.1.0",
360 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
361 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
362 | "requires": {
363 | "ms": "2.0.0"
364 | }
365 | }
366 | }
367 | },
368 | "ms": {
369 | "version": "2.0.0",
370 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
371 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
372 | },
373 | "negotiator": {
374 | "version": "0.6.2",
375 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
376 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
377 | },
378 | "object-assign": {
379 | "version": "4.1.1",
380 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
381 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
382 | },
383 | "on-finished": {
384 | "version": "2.3.0",
385 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
386 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
387 | "requires": {
388 | "ee-first": "1.1.1"
389 | }
390 | },
391 | "on-headers": {
392 | "version": "1.0.2",
393 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
394 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
395 | },
396 | "parseurl": {
397 | "version": "1.3.3",
398 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
399 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
400 | },
401 | "passport": {
402 | "version": "0.4.0",
403 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz",
404 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=",
405 | "requires": {
406 | "passport-strategy": "1.x.x",
407 | "pause": "0.0.1"
408 | }
409 | },
410 | "passport-local": {
411 | "version": "1.0.0",
412 | "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
413 | "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=",
414 | "requires": {
415 | "passport-strategy": "1.x.x"
416 | }
417 | },
418 | "passport-local-mongoose": {
419 | "version": "5.0.1",
420 | "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-5.0.1.tgz",
421 | "integrity": "sha512-VUY5DgBdpjt1tjunJJ1EXV5b2nhMDkXJuhTjyiK660IgIp7kONMyWEe9tGHf8I9tZudXuTF+47JNQLIzU+Hjbw==",
422 | "requires": {
423 | "debug": "^3.1.0",
424 | "generaterr": "^1.5.0",
425 | "passport-local": "^1.0.0",
426 | "scmp": "^2.0.0",
427 | "semver": "^5.5.0"
428 | },
429 | "dependencies": {
430 | "debug": {
431 | "version": "3.2.6",
432 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
433 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
434 | "requires": {
435 | "ms": "^2.1.1"
436 | }
437 | },
438 | "ms": {
439 | "version": "2.1.2",
440 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
441 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
442 | }
443 | }
444 | },
445 | "passport-strategy": {
446 | "version": "1.0.0",
447 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
448 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
449 | },
450 | "path-to-regexp": {
451 | "version": "0.1.7",
452 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
453 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
454 | },
455 | "pause": {
456 | "version": "0.0.1",
457 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
458 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
459 | },
460 | "proxy-addr": {
461 | "version": "2.0.5",
462 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
463 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
464 | "requires": {
465 | "forwarded": "~0.1.2",
466 | "ipaddr.js": "1.9.0"
467 | }
468 | },
469 | "qs": {
470 | "version": "6.7.0",
471 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
472 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
473 | },
474 | "random-bytes": {
475 | "version": "1.0.0",
476 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
477 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
478 | },
479 | "range-parser": {
480 | "version": "1.2.1",
481 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
482 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
483 | },
484 | "raw-body": {
485 | "version": "2.4.0",
486 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
487 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
488 | "requires": {
489 | "bytes": "3.1.0",
490 | "http-errors": "1.7.2",
491 | "iconv-lite": "0.4.24",
492 | "unpipe": "1.0.0"
493 | }
494 | },
495 | "regexp-clone": {
496 | "version": "1.0.0",
497 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
498 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
499 | },
500 | "require_optional": {
501 | "version": "1.0.1",
502 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
503 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
504 | "requires": {
505 | "resolve-from": "^2.0.0",
506 | "semver": "^5.1.0"
507 | }
508 | },
509 | "resolve-from": {
510 | "version": "2.0.0",
511 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
512 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
513 | },
514 | "safe-buffer": {
515 | "version": "5.1.2",
516 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
517 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
518 | },
519 | "safer-buffer": {
520 | "version": "2.1.2",
521 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
522 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
523 | },
524 | "saslprep": {
525 | "version": "1.0.3",
526 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
527 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
528 | "optional": true,
529 | "requires": {
530 | "sparse-bitfield": "^3.0.3"
531 | }
532 | },
533 | "scmp": {
534 | "version": "2.0.0",
535 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.0.0.tgz",
536 | "integrity": "sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo="
537 | },
538 | "semver": {
539 | "version": "5.7.1",
540 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
541 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
542 | },
543 | "send": {
544 | "version": "0.17.1",
545 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
546 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
547 | "requires": {
548 | "debug": "2.6.9",
549 | "depd": "~1.1.2",
550 | "destroy": "~1.0.4",
551 | "encodeurl": "~1.0.2",
552 | "escape-html": "~1.0.3",
553 | "etag": "~1.8.1",
554 | "fresh": "0.5.2",
555 | "http-errors": "~1.7.2",
556 | "mime": "1.6.0",
557 | "ms": "2.1.1",
558 | "on-finished": "~2.3.0",
559 | "range-parser": "~1.2.1",
560 | "statuses": "~1.5.0"
561 | },
562 | "dependencies": {
563 | "ms": {
564 | "version": "2.1.1",
565 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
566 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
567 | }
568 | }
569 | },
570 | "serve-static": {
571 | "version": "1.14.1",
572 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
573 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
574 | "requires": {
575 | "encodeurl": "~1.0.2",
576 | "escape-html": "~1.0.3",
577 | "parseurl": "~1.3.3",
578 | "send": "0.17.1"
579 | }
580 | },
581 | "setprototypeof": {
582 | "version": "1.1.1",
583 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
584 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
585 | },
586 | "sift": {
587 | "version": "7.0.1",
588 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
589 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
590 | },
591 | "sliced": {
592 | "version": "1.0.1",
593 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
594 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
595 | },
596 | "sparse-bitfield": {
597 | "version": "3.0.3",
598 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
599 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
600 | "optional": true,
601 | "requires": {
602 | "memory-pager": "^1.0.2"
603 | }
604 | },
605 | "statuses": {
606 | "version": "1.5.0",
607 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
608 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
609 | },
610 | "toidentifier": {
611 | "version": "1.0.0",
612 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
613 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
614 | },
615 | "type-is": {
616 | "version": "1.6.18",
617 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
618 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
619 | "requires": {
620 | "media-typer": "0.3.0",
621 | "mime-types": "~2.1.24"
622 | }
623 | },
624 | "uid-safe": {
625 | "version": "2.1.5",
626 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
627 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
628 | "requires": {
629 | "random-bytes": "~1.0.0"
630 | }
631 | },
632 | "unpipe": {
633 | "version": "1.0.0",
634 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
635 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
636 | },
637 | "utils-merge": {
638 | "version": "1.0.1",
639 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
640 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
641 | },
642 | "vary": {
643 | "version": "1.1.2",
644 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
645 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
646 | }
647 | }
648 | }
649 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node server.js"
9 | },
10 | "author": "Ahmed Gulab Khan",
11 | "license": "ISC",
12 | "dependencies": {
13 | "body-parser": "^1.19.0",
14 | "cors": "^2.8.5",
15 | "dotenv": "^8.2.0",
16 | "ejs": "^2.7.1",
17 | "express": "^4.17.1",
18 | "express-session": "^1.17.0",
19 | "mongoose": "^5.7.7",
20 | "passport": "^0.4.0",
21 | "passport-local": "^1.0.0",
22 | "passport-local-mongoose": "^5.0.1"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/backend/server.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config();
2 | var express = require("express");
3 | var mongoose = require('mongoose');
4 | var bodyParser = require('body-parser');
5 | var cors = require("cors");
6 | var router = express.Router();
7 | var session = require('express-session');
8 | var passport = require("passport");
9 | var passportLocalMongoose = require("passport-local-mongoose");
10 |
11 | var app = express();
12 |
13 | //app.set('view engine', 'ejs');
14 | app.use(cors({
15 | origin: "http://localhost:3000", // restrict calls to those this address
16 | credentials: true,
17 | }));
18 | app.use(bodyParser.urlencoded({ extended: false }));
19 | app.use(bodyParser.json());
20 |
21 | app.use(session({
22 | secret: process.env.SECRET,
23 | resave: false,
24 | saveUninitialized: false
25 | }));
26 |
27 | app.use(passport.initialize());
28 | app.use(passport.session());
29 |
30 |
31 | //Connecting to MongoDB using mongoose
32 | mongoose.connect('mongodb://localhost:27017/MovieGoDB', {useNewUrlParser: true});
33 | mongoose.set("useCreateIndex", true);
34 |
35 | //Defining Schemas
36 | var userSchema = new mongoose.Schema({
37 | fullName: String,
38 | username: String,
39 | contactNumber: String,
40 | password: String
41 | });
42 | var bookingSchema = new mongoose.Schema({
43 | booking: String
44 | });
45 |
46 | //Using passport-local-mongoose plugin on userSchema
47 | userSchema.plugin(passportLocalMongoose);
48 |
49 | //Defining Models
50 | var User = new mongoose.model('User', userSchema);
51 | var Booking = new mongoose.model('Booking', bookingSchema);
52 |
53 | passport.use(User.createStrategy());
54 |
55 | passport.serializeUser(function(user, done) {
56 | done(null, user.id);
57 | });
58 |
59 | passport.deserializeUser(function(id, done) {
60 | User.findById(id, function(err, user) {
61 | done(err, user);
62 | });
63 | });
64 |
65 | //All our requests go in here
66 | router.get('/signedin', function(req, res){
67 | res.json(req.isAuthenticated());
68 | });
69 |
70 | router.post('/signin', function(req, res){
71 | const user = new User({
72 | username: req.body.username,
73 | password: req.body.password
74 | });
75 |
76 | req.login(user, function(err){
77 | if (err) {
78 | console.log(err);
79 | }
80 | else {
81 | passport.authenticate("local")(req, res, function(){
82 | res.send(user);
83 | });
84 | }
85 | });
86 | });
87 |
88 | router.post('/register', function(req, res){
89 | User.register({fullName: req.body.fullName,
90 | username: req.body.username,
91 | contactNumber: req.body.contactNumber}, req.body.password, function(err, user){
92 | passport.authenticate("local")(req, res, function(){
93 | res.json(user);
94 | });
95 | });
96 | });
97 |
98 | router.post('/pay', function(req, res){
99 | var newBooking = Booking({booking: req.body.bookingDetails}).save(function(err, data){
100 | if(err){
101 | console.log(err);
102 | }
103 | else{
104 | res.json(data);
105 | }
106 | });
107 | });
108 |
109 | router.post('/seats', function(req, res){
110 |
111 | var regex1 = '^' + req.body.bookingDetails;
112 | var regex2 = regex1.replace(/\//g, "\\/");
113 | var re = new RegExp(regex2,"g");
114 |
115 | Booking.find({booking: re}, function(err, data){
116 | if(err){
117 | console.log(err);
118 | }
119 | else{
120 | res.json(data);
121 | }
122 | });
123 |
124 | /*Booking.find({booking: /^tt1596343\/01-11-2019\/07:45/g}, function(err, data){
125 | if(err){
126 | console.log(err);
127 | }
128 | else{
129 | console.log(data);
130 | }
131 | });*/
132 | });
133 |
134 | router.get('/logout', function(req, res){
135 | req.logout();
136 | res.json(req.isAuthenticated());
137 | });
138 |
139 | app.use('/api', router);
140 |
141 | app.listen(3001);
142 | console.log("Listening to port 3001\n");
143 |
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/frontend/README.md:
--------------------------------------------------------------------------------
1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
2 |
3 | ## Available Scripts
4 |
5 | In the project directory, you can run:
6 |
7 | ### `npm start`
8 |
9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
11 |
12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console.
14 |
15 | ### `npm test`
16 |
17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
19 |
20 | ### `npm run build`
21 |
22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance.
24 |
25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed!
27 |
28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
29 |
30 | ### `npm run eject`
31 |
32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
33 |
34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
35 |
36 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
37 |
38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
39 |
40 | ## Learn More
41 |
42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
43 |
44 | To learn React, check out the [React documentation](https://reactjs.org/).
45 |
46 | ### Code Splitting
47 |
48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
49 |
50 | ### Analyzing the Bundle Size
51 |
52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
53 |
54 | ### Making a Progressive Web App
55 |
56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
57 |
58 | ### Advanced Configuration
59 |
60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
61 |
62 | ### Deployment
63 |
64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
65 |
66 | ### `npm run build` fails to minify
67 |
68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
69 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "node-sass": "^7.0.0",
7 | "react": "^16.11.0",
8 | "react-dom": "^16.11.0",
9 | "react-router-dom": "^5.1.2",
10 | "react-scripts": "3.2.0"
11 | },
12 | "scripts": {
13 | "start": "react-scripts start",
14 | "build": "react-scripts build",
15 | "test": "react-scripts test",
16 | "eject": "react-scripts eject"
17 | },
18 | "eslintConfig": {
19 | "extends": "react-app"
20 | },
21 | "browserslist": {
22 | "production": [
23 | ">0.2%",
24 | "not dead",
25 | "not op_mini all"
26 | ],
27 | "development": [
28 | "last 1 chrome version",
29 | "last 1 firefox version",
30 | "last 1 safari version"
31 | ]
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
19 |
20 |
29 | React App
30 |
31 |
32 | You need to enable JavaScript to run this app.
33 |
34 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/logo192.png
--------------------------------------------------------------------------------
/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/logo512.png
--------------------------------------------------------------------------------
/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 |
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: 'Open Sans Condensed';
3 | background-color: rgb(30, 30, 30);
4 | color: white;
5 | }
6 |
7 | a {
8 | text-decoration: none;
9 | }
10 |
11 | * {
12 | box-sizing: border-box;
13 | }
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './App.css';
3 |
4 | import { Route, Switch } from 'react-router-dom';
5 |
6 | import HomePage from './pages/homepage/homepage.component';
7 | import NowShowing from './pages/now-showing/now-showing.component';
8 | import Upcoming from './pages/upcoming/upcoming.component';
9 | import Popular from './pages/popular/popular.component';
10 | import SignInAndSignUp from './pages/sign-in-and-sign-up/sign-in-and-sign-up.component';
11 | import Header from './components/header/header.component';
12 | import CollectionDetailsPage from './pages/collection-details-page/collection-details-page.component';
13 |
14 | class App extends React.Component {
15 |
16 | constructor(props) {
17 | super(props);
18 |
19 | this.state = {
20 | isLoggedIn: 'false'
21 | }
22 | }
23 |
24 | onChange = (newState) => {
25 | this.setState({
26 | isLoggedIn: newState
27 | });
28 | }
29 |
30 | componentDidMount(){
31 | fetch('http://localhost:3001/api/signedin', {
32 | method: 'GET',
33 | headers: {
34 | 'Accept': 'application/json',
35 | 'Content-Type': 'application/json'
36 | },
37 | credentials: 'include'
38 | })
39 | .then(res => res.json())
40 | .then(json => {
41 | if(json===true){
42 | this.setState({isLoggedIn: 'true'});
43 | }
44 | else{
45 | this.setState({isLoggedIn: 'false'});
46 | }
47 | })
48 | .catch(err => console.log(err))
49 |
50 | }
51 |
52 | render() {
53 | return (
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | } />
62 |
63 |
64 |
65 | );
66 | }
67 | }
68 |
69 | export default App;
70 |
--------------------------------------------------------------------------------
/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | ReactDOM.unmountComponentAtNode(div);
9 | });
10 |
--------------------------------------------------------------------------------
/frontend/src/components/book-date/book-date.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 |
4 | import './book-date.styles.scss';
5 |
6 | const BookDate = ({ match }) => {
7 | return(
8 |
9 |
These are all the available shows
10 |
11 | 07:45
12 | 11:30
13 | 15:30
14 | 18:00
15 | 21:55
16 |
17 |
18 | );
19 | }
20 |
21 | export default BookDate;
--------------------------------------------------------------------------------
/frontend/src/components/book-date/book-date.styles.scss:
--------------------------------------------------------------------------------
1 | .show-list-container{
2 | text-align: center;
3 |
4 | h1{
5 | font-size: 50px;
6 | }
7 |
8 | .show-list{
9 | padding-top: 30px;
10 |
11 | span{
12 | text-decoration: none;
13 | color: rgb(0, 195, 255);
14 | outline: 1px solid rgb(0, 195, 255);
15 | padding: 10px;
16 | margin: 25px;
17 | font-size: 25px;
18 |
19 | &:hover{
20 | color: white;
21 | background-color: rgb(0, 195, 255);
22 | }
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/frontend/src/components/book-movie-title/book-movie-title.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 |
4 | import './book-movie-title.styles.scss';
5 |
6 | const BookMovieTitle = ({ match }) => {
7 | return(
8 |
9 |
Select the Date from the below mentioned:
10 |
11 | 01-11-2019
12 | 03-11-2019
13 | 07-11-2019
14 | 10-11-2019
15 | 16-11-2019
16 | 21-11-2019
17 |
18 |
19 | );
20 | }
21 |
22 | export default BookMovieTitle;
--------------------------------------------------------------------------------
/frontend/src/components/book-movie-title/book-movie-title.styles.scss:
--------------------------------------------------------------------------------
1 | .date-list-container{
2 | text-align: center;
3 |
4 | h1{
5 | font-size: 50px;
6 | }
7 |
8 | .date-list{
9 | padding-top: 30px;
10 |
11 | span{
12 | text-decoration: none;
13 | color: rgb(0, 195, 255);
14 | outline: 1px solid rgb(0, 195, 255);
15 | padding: 10px;
16 | margin: 25px;
17 | font-size: 25px;
18 |
19 | &:hover{
20 | color: white;
21 | background-color: rgb(0, 195, 255);
22 | }
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/frontend/src/components/book-show/book-show.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 |
4 | import './book-show.styles.scss';
5 |
6 | const BookShow = ({ match }) => {
7 | fetch('http://localhost:3001/api/seats',{
8 | method: 'POST',
9 | headers: {
10 | 'Accept': 'application/json',
11 | 'Content-Type': 'application/json'
12 | },
13 | credentials: 'include',
14 | body: JSON.stringify({bookingDetails: match.params.imdbID + '/' + match.params.date + '/' + match.params.show + '/'})
15 | })
16 | .then(res => res.json())
17 | .then(json => {
18 | var reservedSeats = new Array();
19 | for(var obj in json){
20 | var len = json[obj].booking.length;
21 | //console.log(json[obj].booking[len-2] + json[obj].booking[len-1]);
22 | reservedSeats.push(json[obj].booking[len-2] + json[obj].booking[len-1]);
23 | }
24 | for(var seat=0;seat console.log(err));
32 |
33 | return(
34 |
35 |
These are all the available seats
36 |
37 | 01
38 | 02
39 | 03
40 | 04
41 | 05
42 | 06
43 | 07
44 | 08
45 | 09
46 | 10
47 |
48 |
49 |
50 | 11
51 | 12
52 | 13
53 | 14
54 | 15
55 | 16
56 | 17
57 | 18
58 | 19
59 | 20
60 |
61 |
62 |
63 | 21
64 | 22
65 | 23
66 | 24
67 | 25
68 | 26
69 | 27
70 | 28
71 | 29
72 | 30
73 |
74 |
75 | );
76 | }
77 |
78 | export default BookShow;
--------------------------------------------------------------------------------
/frontend/src/components/book-show/book-show.styles.scss:
--------------------------------------------------------------------------------
1 | .seat-list-container{
2 | text-align: center;
3 |
4 | h1{
5 | font-size: 50px;
6 | }
7 |
8 | .seat-list{
9 | padding-top: 30px;
10 |
11 | .reserved{
12 | text-decoration: none;
13 | color: rgba(125, 125, 125, 0.5);
14 | cursor: default;
15 | border: 1px solid rgba(125, 125, 125, 0.5);
16 | padding: 10px;
17 | margin: 10px;
18 | font-size: 25px;
19 | pointer-events: none;
20 | border-radius: 10px;
21 | }
22 |
23 | .link{
24 | text-decoration: none;
25 | color: rgb(0, 195, 255);
26 | border: 1px solid rgb(0, 195, 255);
27 | padding: 10px;
28 | margin: 10px;
29 | font-size: 25px;
30 | border-radius: 10px;
31 |
32 | &:hover{
33 | color: white;
34 | background-color: rgb(0, 195, 255);
35 | }
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/frontend/src/components/collection-details-movie/collection-details-movie.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import './collection-details-movie.styles.scss';
4 |
5 | import MOVIE_DATA from '../../assets/movie.data';
6 |
7 | class CollectionDetailsMovie extends React.Component {
8 |
9 | constructor() {
10 | super();
11 |
12 | this.state = {
13 | isLoggedIn: 'false'
14 | }
15 | }
16 |
17 | componentDidMount(){
18 | fetch('http://localhost:3001/api/signedin', {
19 | method: 'GET',
20 | headers: {
21 | 'Accept': 'application/json',
22 | 'Content-Type': 'application/json'
23 | },
24 | credentials: 'include'
25 | })
26 | .then(res => res.json())
27 | .then(json => {
28 | if(json===true){
29 | this.setState({isLoggedIn: 'true'});
30 | }
31 | else{
32 | this.setState({isLoggedIn: 'false'});
33 | }
34 | })
35 | .catch(err => console.log(err));
36 | }
37 |
38 | bookWithoutLogin = () => {
39 | alert("You need to Sign-in/Register in order to book tickets...");
40 | }
41 |
42 | render() {
43 | const collections = MOVIE_DATA;
44 | const currentCollection = collections.find(collection => collection.imdbID === this.props.match.params.imdbID);
45 | console.log(currentCollection);
46 | if(currentCollection===undefined){
47 | return(The movie with the imdbID does not exist );
48 | }
49 |
50 | return(
51 |
52 |
53 |
54 |
55 |
56 |
57 |
{currentCollection.Title}
58 |
Released: {currentCollection.Released}
59 |
Rated: {currentCollection.Rated}
60 |
Genre: {currentCollection.Genre}
61 |
Runtime: {currentCollection.Runtime}
62 |
Cast: {currentCollection.Actors}
63 |
Director: {currentCollection.Director}
64 |
Writer: {currentCollection.Writer}
65 |
Plot: {currentCollection.Plot}
66 | {
67 | currentCollection.Year>=2013 ?
68 | (
IMDB Rating: N/A
)
69 | :
70 | (
IMDB Rating: {currentCollection.imdbRating}
)
71 | }
72 |
73 |
74 | {
75 | this.state.isLoggedIn==='true' ?
76 | (
77 |
78 |
79 | BOOK TICKETS
80 |
81 |
82 | )
83 | :
84 | (
85 |
86 |
87 | BOOK TICKETS
88 |
89 |
90 | )
91 | }
92 |
93 | );
94 | }
95 | }
96 |
97 | export default CollectionDetailsMovie;
--------------------------------------------------------------------------------
/frontend/src/components/collection-details-movie/collection-details-movie.styles.scss:
--------------------------------------------------------------------------------
1 | .collection-details-container{
2 | display: inline-flex;
3 | padding: 30px;
4 |
5 | .image-container{
6 | padding: 0px 30px;
7 | margin: auto;
8 | }
9 |
10 | .content{
11 | padding: 0px 30px;
12 |
13 | h2{
14 | font-size: 30px;
15 | }
16 |
17 | span{
18 | color: rgb(0, 195, 255);
19 | }
20 | }
21 | }
22 |
23 | .book-now{
24 | width: 100%;
25 | height: 60px;
26 | font-size: 20px;
27 | color: white;
28 | background-color: rgb(0, 195, 255);
29 | display: inline-flex;
30 | align-items: center;
31 | justify-content: center;
32 | transition: background-color 0.75s ease;
33 |
34 | &:hover{
35 | background-color: rgb(0, 130, 170);
36 | }
37 | }
--------------------------------------------------------------------------------
/frontend/src/components/collection-item/collection-item.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './collection-item.styles.scss';
3 | import { Link } from 'react-router-dom';
4 |
5 | const CollectionItem = ({Poster, imdbRating, imdbID, Title, collectionType}) => (
6 |
7 |
8 |
9 |
10 | {
11 | (() => {
12 | if(collectionType==='upcoming-direct' || collectionType==='upcoming-indirect'){
13 | return(
14 |
15 | {Title}
16 |
17 | );
18 | }
19 |
20 | else{
21 | return(
22 |
23 | {Title}
24 | {imdbRating*10}%
25 |
26 | );
27 | }
28 | })()
29 | }
30 |
31 | )
32 |
33 | export default CollectionItem;
--------------------------------------------------------------------------------
/frontend/src/components/collection-item/collection-item.styles.scss:
--------------------------------------------------------------------------------
1 | .collection-item{
2 | display: inline-block;
3 | //background-color: red;
4 | margin: 2em;
5 | height: 300px;
6 | width: 200px;
7 | color: white;
8 |
9 | &:hover{
10 | cursor: pointer;
11 | transform: scale(1.1);
12 | transition: transform 0.5s cubic-bezier(0.25, 0.45, 0.45, 0.95);
13 | }
14 |
15 | .image-container {
16 | height: 90%;
17 | width: 100%;
18 | opacity: 1.0;
19 | &:hover .image{
20 | opacity: 1.0;
21 | }
22 |
23 | .image {
24 | height: 100%;
25 | width: 100%;
26 | opacity: 0.7;
27 | }
28 | }
29 |
30 | .collection-footer {
31 | height: 10%;
32 | width: 100%;
33 | font-size: 15px;
34 | margin: 8px 0px;
35 | .rating{
36 | float: right;
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/frontend/src/components/collection-preview/collection-preview.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import './collection-preview.styles.scss';
4 | import CollectionItem from '../collection-item/collection-item.component';
5 |
6 | const CollectionPreview = ({collectionType, collections}) => (
7 |
8 | {
9 | (() => {
10 | let collectionsNowShowing = collections;
11 | let collectionsPopular = [...collections].sort((a, b) => (b.imdbRating-a.imdbRating));
12 | collectionsNowShowing = collectionsNowShowing.filter((collection, idx) => collection.Year<2013);
13 | collectionsPopular = collectionsPopular.filter((collection, idx) => collection.Year<2013);
14 | let collectionsUpcoming = [...collections].filter((collection, idx) => collection.Year >= 2013);
15 |
16 | if(collectionType==='now-showing-indirect'){
17 | return(collectionsNowShowing.filter((collection, idx) => idx<10).
18 | map(({ imdbID, ...otherCollectionProps }) =>
19 |
20 | ))
21 | }
22 |
23 | else if(collectionType==='now-showing-direct'){
24 | return(collectionsNowShowing.filter((collection, idx) => idx<40).
25 | map(({ imdbID, ...otherCollectionProps }) =>
26 |
27 | ))
28 | }
29 |
30 | else if(collectionType==='upcoming-indirect'){
31 | return(collectionsUpcoming.filter((collection, idx) => idx<10).
32 | map(({ imdbID, ...otherCollectionProps }) =>
33 |
34 | ))
35 | }
36 |
37 | else if(collectionType==='upcoming-direct'){
38 | return(collectionsUpcoming.filter((collection, idx) => idx<40).
39 | map(({ imdbID, ...otherCollectionProps }) =>
40 |
41 | ))
42 | }
43 |
44 | else if(collectionType==='popular-indirect'){
45 | return(collectionsPopular.filter((collection, idx) => idx<10).
46 | map(({ imdbID, ...otherCollectionProps }) =>
47 |
48 | ))
49 | }
50 |
51 | else{
52 | return(collectionsPopular.filter((collection, idx) => idx<40).
53 | map(({ imdbID, ...otherCollectionProps }) =>
54 |
55 | ))
56 | }
57 | })()
58 | }
59 |
60 | )
61 |
62 | export default CollectionPreview;
--------------------------------------------------------------------------------
/frontend/src/components/collection-preview/collection-preview.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/components/collection-preview/collection-preview.styles.scss
--------------------------------------------------------------------------------
/frontend/src/components/header/header.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import './header.styles.scss';
4 |
5 | const Header = (props) => {
6 | function handleLogout() {
7 | fetch('http://localhost:3001/api/logout', {
8 | method: 'GET',
9 | headers: {
10 | 'Accept': 'application/json',
11 | 'Content-Type': 'application/json'
12 | },
13 | credentials: 'include'
14 | })
15 | .then(res => {
16 | alert("You have logged out of your account!");
17 | window.location.replace("http://localhost:3000");
18 | })
19 | .catch(err => console.log(err));
20 | }
21 |
22 | return (
23 |
24 |
25 | MovieGo
26 |
27 |
28 | Now Showing
29 | Upcoming
30 | Popular
31 |
32 |
33 | {
34 | (props.isLoggedIn==='true') ?
35 | ( Logout)
36 | :
37 | ( Sign In / Register)
38 | }
39 |
40 |
41 | );
42 | }
43 |
44 | export default Header;
--------------------------------------------------------------------------------
/frontend/src/components/header/header.styles.scss:
--------------------------------------------------------------------------------
1 | .header {
2 | height: 70px;
3 | width: 100%;
4 | position: sticky;
5 | top: 0px;
6 | z-index: 1;
7 | display: flex;
8 | justify-content: space-between;
9 | margin-bottom: 25px;
10 | background-color: rgb(75, 75, 75);
11 | color: white;
12 | box-shadow: 0px 2px 4px black;
13 |
14 | .container {
15 | padding: 0px 50px;
16 | }
17 |
18 | .logo-container {
19 | height: 100%;
20 | width: 25%;
21 | padding: 25px;
22 | display: flex;
23 | align-items: center;
24 |
25 | .logo {
26 | color: rgb(0, 195, 255);
27 | font-size: 30px;
28 | font-style: oblique;
29 | font-weight: bolder;
30 | text-shadow: -1px 1px 4px black;
31 | }
32 | }
33 |
34 | .options {
35 | width: 50%;
36 | height: 100%;
37 | display: flex;
38 | align-items: center;
39 | justify-content: center;
40 |
41 | .option {
42 | padding: 10px 15px;
43 | cursor: pointer;
44 | color: white;
45 | font-size: 20px;
46 | &:hover{
47 | background-color: rgb(0, 195, 255);
48 | color: white;
49 | }
50 | &:focus{
51 | background-color: rgb(0, 195, 255);
52 | color: white;
53 | }
54 | }
55 | }
56 |
57 | .sign-in-container {
58 | height: 100%;
59 | width: 25%;
60 | display: flex;
61 | align-items: center;
62 | justify-content: flex-end;
63 |
64 | .sign-in {
65 | padding: 5px 20px;
66 | cursor: pointer;
67 | color: white;
68 | background-color: rgb(0, 195, 255);
69 | font-size: 20px;
70 | //border: 1px solid rgb(0, 195, 255);
71 | border-radius: 10px;
72 |
73 | &:hover{
74 | color: white;
75 | background-color: rgb(0, 130, 170);
76 | }
77 | }
78 |
79 | .log-out {
80 | padding: 5px 20px;
81 | cursor: pointer;
82 | color: white;
83 | background-color: rgb(255, 60, 60);
84 | font-size: 20px;
85 | //border: 1px solid rgb(255, 0, 0);
86 | border-radius: 10px;
87 |
88 | &:hover{
89 | color: white;
90 | background-color: red;
91 | }
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/frontend/src/components/sign-in/sign-in.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './sign-in.styles.scss';
3 | import { withRouter } from 'react-router-dom';
4 |
5 | class SignIn extends React.Component {
6 | constructor(props){
7 | super(props);
8 |
9 | this.state = {
10 | username: '',
11 | password: ''
12 | }
13 | }
14 |
15 | handleSubmit = (event) => {
16 | event.preventDefault();
17 |
18 | fetch('http://localhost:3001/api/signin',{
19 | method: 'POST',
20 | headers: {
21 | 'Accept': 'application/json',
22 | 'Content-Type': 'application/json'
23 | },
24 | credentials: 'include',
25 | body: JSON.stringify(this.state)
26 | })
27 | .then(res => {
28 | if(res.status === 401){
29 | alert("ERROR: Invalid Email and/or Password combination!");
30 | window.location.reload();
31 | }
32 | else if(res.status === 400){
33 | alert("ERROR: Fill all the required fields");
34 | }
35 | else{
36 | this.props.onAuthChange('true');
37 | this.props.history.push('/');
38 | }
39 | })
40 | .catch(err => console.log(err));
41 | }
42 |
43 | handleChange = (event) => {
44 | const {value, name} = event.target;
45 |
46 | this.setState({ [name]: value });
47 | }
48 |
49 | render() {
50 | return(
51 |
52 |
Already have an Account?
53 |
Sign In with your Email and Password
54 |
55 |
60 |
61 |
62 | );
63 | }
64 | }
65 |
66 | export default withRouter(SignIn);
--------------------------------------------------------------------------------
/frontend/src/components/sign-in/sign-in.styles.scss:
--------------------------------------------------------------------------------
1 | .sign-in-container {
2 | margin: 0px 10px;
3 | width: 50%;
4 |
5 | h2{
6 | font-size: 27px;
7 | }
8 |
9 | span{
10 | font-size: 20px;
11 | }
12 |
13 | .form-container {
14 | //margin: 20px;
15 | .input {
16 | //display: block;
17 | height: 35px;
18 | margin: 10px 0px;
19 | font-size: 16px;
20 | width: 100%;
21 | color: white;
22 | background-color: transparent;
23 | border: none;
24 | border-bottom: 1px solid white;
25 | outline: transparent;
26 | }
27 |
28 | .button {
29 | margin: 10px 0px;
30 | padding: 10px 15px;
31 | font-size: 16px;
32 | color: white;
33 | background-color: rgb(0, 195, 255);
34 | border: none;
35 | border-radius: 5px;
36 |
37 | &:hover{
38 | background-color: rgb(0, 130, 170);
39 | cursor: pointer;
40 | }
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/frontend/src/components/sign-up/sign-up.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './sign-up.styles.scss';
3 | import { withRouter } from 'react-router-dom';
4 |
5 | class SignUp extends React.Component {
6 | constructor(props){
7 | super(props);
8 |
9 | this.state = {
10 | fullName: '',
11 | username: '',
12 | contactNumber: '',
13 | password: '',
14 | confirmPassword: ''
15 | }
16 | }
17 |
18 | handleSubmit = (event) => {
19 | event.preventDefault();
20 |
21 | if(this.state.password === this.state.confirmPassword) {
22 | fetch('http://localhost:3001/api/register',{
23 | method: 'POST',
24 | headers: {
25 | 'Accept': 'application/json',
26 | 'Content-Type': 'application/json'
27 | },
28 | credentials: 'include',
29 | body: JSON.stringify(this.state)
30 | })
31 | .then(res => {
32 | if(res.status === 401){
33 | alert("ERROR: This Email already exists! Try to Sign-in");
34 | window.location.reload();
35 | }
36 | else if(res.status === 400){
37 | alert("ERROR: Fill all the required fields");
38 | }
39 | else{
40 | alert('Registered successfully!');
41 | this.props.onAuthChange('true');
42 | this.props.history.push('/');
43 | }
44 | })
45 | .catch(err => console.log(err));
46 | }
47 | else {
48 | alert("Password and Confirm Password fields do not match!");
49 | }
50 | }
51 |
52 | handleChange = (event) => {
53 | const {value, name} = event.target;
54 |
55 | this.setState({ [name]: value });
56 | }
57 |
58 | render() {
59 | return(
60 |
61 |
Not Registered Yet?
62 |
Create an Account
63 |
64 |
72 |
73 |
74 | );
75 | }
76 | }
77 |
78 | export default withRouter(SignUp);
--------------------------------------------------------------------------------
/frontend/src/components/sign-up/sign-up.styles.scss:
--------------------------------------------------------------------------------
1 | .sign-up-container {
2 | margin: 0px 10px;
3 | width: 50%;
4 |
5 | h2{
6 | font-size: 27px;
7 | }
8 |
9 | span{
10 | font-size: 20px;
11 | }
12 |
13 | .form-container {
14 | //margin: 20px;
15 | .input {
16 | //display: block;
17 | height: 35px;
18 | margin: 10px 0px;
19 | font-size: 16px;
20 | width: 100%;
21 | color: white;
22 | background-color: transparent;
23 | border: none;
24 | border-bottom: 1px solid white;
25 | outline: transparent;
26 | }
27 |
28 | .button {
29 | margin: 10px 0px;
30 | padding: 10px 15px;
31 | font-size: 16px;
32 | color: white;
33 | background-color: rgb(0, 195, 255);
34 | border: none;
35 | border-radius: 5px;
36 |
37 | &:hover{
38 | background-color: rgb(0, 130, 170);
39 | cursor: pointer;
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 |
6 |
7 | import { BrowserRouter } from 'react-router-dom';
8 |
9 | ReactDOM.render(
10 |
11 |
12 | , document.getElementById('root'));
13 |
--------------------------------------------------------------------------------
/frontend/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/src/pages/book-date-page/book-date-page.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Link, Switch } from 'react-router-dom';
3 |
4 | import './book-date-page.styles.scss';
5 |
6 | import BookDate from '../../components/book-date/book-date.component';
7 | import BookShowPage from '../book-show-page/book-show-page.component';
8 |
9 | const BookDatePage = ({ match }) => {
10 | return(
11 |
12 |
13 |
14 |
15 |
16 |
17 | );
18 | }
19 |
20 | export default BookDatePage;
--------------------------------------------------------------------------------
/frontend/src/pages/book-date-page/book-date-page.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-date-page/book-date-page.styles.scss
--------------------------------------------------------------------------------
/frontend/src/pages/book-movie-title-page/book-movie-title-page.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Switch } from 'react-router-dom';
3 | import './book-movie-title-page.styles.scss';
4 |
5 | import BookMovieTitle from '../../components/book-movie-title/book-movie-title.component';
6 | import BookDatePage from '../book-date-page/book-date-page.component';
7 |
8 | const BookMovieTitlePage = ({ match }) => {
9 | return(
10 |
11 |
12 |
13 |
14 |
15 |
16 | );
17 | }
18 |
19 | export default BookMovieTitlePage;
--------------------------------------------------------------------------------
/frontend/src/pages/book-movie-title-page/book-movie-title-page.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-movie-title-page/book-movie-title-page.styles.scss
--------------------------------------------------------------------------------
/frontend/src/pages/book-show-page/book-show-page.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Link, Switch } from 'react-router-dom';
3 |
4 | import './book-show-page.styles.scss';
5 |
6 | import BookShow from '../../components/book-show/book-show.component';
7 | import PayPage from '../pay-page/pay-page.component';
8 |
9 | const BookShowPage = ({ match }) => {
10 | return(
11 |
12 |
13 |
14 |
15 |
16 |
17 | );
18 | }
19 |
20 | export default BookShowPage;
--------------------------------------------------------------------------------
/frontend/src/pages/book-show-page/book-show-page.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-show-page/book-show-page.styles.scss
--------------------------------------------------------------------------------
/frontend/src/pages/collection-details-page/collection-details-page.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Switch } from 'react-router-dom';
3 | import './collection-details-page.styles.scss';
4 |
5 | import MOVIE_DATA from '../../assets/movie.data';
6 |
7 | import BookMovieTitlePage from '../book-movie-title-page/book-movie-title-page.component';
8 | import CollectionDetailsMovie from '../../components/collection-details-movie/collection-details-movie.component';
9 |
10 | const CollectionDetailsPage = ({ match }) => {
11 | const collections = MOVIE_DATA;
12 | const currentCollection = collections.find(collection => collection.imdbID === match.params.imdbID);
13 | console.log(currentCollection);
14 | return(
15 |
16 |
17 |
18 |
19 |
20 |
21 | );
22 | }
23 |
24 | export default CollectionDetailsPage;
--------------------------------------------------------------------------------
/frontend/src/pages/collection-details-page/collection-details-page.styles.scss:
--------------------------------------------------------------------------------
1 | /*.collection-details-container{
2 | display: inline-flex;
3 | padding: 30px;
4 |
5 | .image-container{
6 | padding: 0px 30px;
7 | }
8 |
9 | .content{
10 | padding: 0px 30px;
11 |
12 | h2{
13 | font-size: 30px;
14 | }
15 |
16 | span{
17 | color: rgb(0, 195, 255);
18 | }
19 | }
20 | }
21 |
22 | .book-now{
23 | width: 100%;
24 | height: 60px;
25 | font-size: 20px;
26 | color: white;
27 | background-color: rgb(0, 195, 255);
28 | display: inline-flex;
29 | align-items: center;
30 | justify-content: center;
31 | }*/
--------------------------------------------------------------------------------
/frontend/src/pages/homepage/homepage.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 |
4 | import MOVIE_DATA from '../../assets/movie.data';
5 | import './homepage.styles.scss';
6 | import CollectionPreview from '../../components/collection-preview/collection-preview.component';
7 |
8 | class HomePage extends React.Component {
9 | constructor(){
10 | super();
11 | this.state = {
12 | collections: MOVIE_DATA
13 | }
14 | }
15 |
16 | render() {
17 | const { collections } = this.state;
18 | return(
19 |
20 |
21 |
Now Showing
22 |
23 |
24 |
25 | Load More Items
26 |
27 |
28 |
29 |
30 |
Upcoming
31 |
32 |
33 |
34 | Load More Items
35 |
36 |
37 |
38 |
39 |
Popular
40 |
41 |
42 |
43 | Load More Items
44 |
45 |
46 |
47 |
48 | );
49 | }
50 | }
51 |
52 | export default HomePage;
--------------------------------------------------------------------------------
/frontend/src/pages/homepage/homepage.styles.scss:
--------------------------------------------------------------------------------
1 | .load-more-items {
2 | text-align: center;
3 |
4 | div{
5 | margin: auto;
6 | margin-bottom: 30px;
7 | display: flex;
8 | align-items: center;
9 | justify-content: center;
10 | height: 40px;
11 | width: 80%;
12 | border: 1px solid rgb(0, 195, 255);
13 | border-radius: 20px;
14 | color: rgb(0, 195, 255);
15 |
16 | &:hover{
17 | color: white;
18 | background-color: rgb(0, 195, 255);
19 | }
20 | }
21 | }
22 |
23 | h1{
24 | margin-left: 30px;
25 | }
--------------------------------------------------------------------------------
/frontend/src/pages/now-showing/now-showing.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './now-showing.styles.scss';
3 | import CollectionPreview from '../../components/collection-preview/collection-preview.component';
4 | import MOVIE_DATA from '../../assets/movie.data';
5 |
6 | class NowShowing extends React.Component {
7 | constructor(){
8 | super();
9 | this.state = {
10 | collections: MOVIE_DATA
11 | }
12 | }
13 |
14 | render() {
15 | const {collections} = this.state;
16 | return (
17 |
18 |
Now Showing
19 |
20 |
21 | );
22 | }
23 | }
24 |
25 | export default NowShowing;
--------------------------------------------------------------------------------
/frontend/src/pages/now-showing/now-showing.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/now-showing/now-showing.styles.scss
--------------------------------------------------------------------------------
/frontend/src/pages/pay-page/pay-page.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Link, Switch } from 'react-router-dom';
3 |
4 | import './pay-page.styles.scss';
5 |
6 | class PayPage extends React.Component {
7 | constructor(props){
8 | super(props);
9 |
10 | this.state = {
11 | fullName: '',
12 | username: '',
13 | city: '',
14 | state: '',
15 | zip: '',
16 | nameOnCard: '',
17 | cardNumber: '',
18 | expirationMonth: '',
19 | expirationYear: '',
20 | cvv: '',
21 | bookingDetails: props.match.params.imdbID + '/' + props.match.params.date + '/' + props.match.params.show + '/' + props.match.params.seat
22 | }
23 | }
24 |
25 | handleSubmit = (event) => {
26 | event.preventDefault();
27 |
28 | if(this.state.fullName==='' || this.state.username==='' || this.state.city==='' || this.state.state==='' ||
29 | this.state.zip==='' || this.state.nameOnCard==='' || this.state.cardNumber==='' || this.state.expirationMonth==='' ||
30 | this.state.expirationYear==='' || this.state.cvv===''){
31 | alert('Please fill out all the fields');
32 | }
33 |
34 | else{
35 | fetch('http://localhost:3001/api/pay',{
36 | method: 'POST',
37 | headers: {
38 | 'Accept': 'application/json',
39 | 'Content-Type': 'application/json'
40 | },
41 | credentials: 'include',
42 | body: JSON.stringify(this.state)
43 | })
44 | .then(res => {
45 | if(res.status === 400){
46 | alert("ERROR: Fill all the required fields");
47 | }
48 | else{
49 | alert("Payment done, booked seat successfully. You'll be redirected to your homepage");
50 | this.props.history.push('/');
51 | }
52 | })
53 | .catch(err => console.log(err));
54 | }
55 | }
56 |
57 | handleChange = (event) => {
58 | const {value, name} = event.target;
59 |
60 | this.setState({ [name]: value });
61 | }
62 |
63 | render() {
64 | return(
65 |
66 |
Booking the seat {this.props.match.params.seat} at {this.props.match.params.show}hrs on {this.props.match.params.date} of {this.props.match.params.Title.replace(/\+/g, " ")}
67 |
85 |
86 | );
87 | }
88 | }
89 |
90 | export default PayPage;
--------------------------------------------------------------------------------
/frontend/src/pages/pay-page/pay-page.styles.scss:
--------------------------------------------------------------------------------
1 | .pay-container {
2 | //margin: 0px 10px;
3 | width: 50%;
4 | margin: auto;
5 | text-align: center;
6 |
7 | h2{
8 | font-size: 40px;
9 | }
10 |
11 | .pay-form-container {
12 | //margin: 20px;
13 | .input {
14 | //display: block;
15 | height: 35px;
16 | margin: 10px 0px;
17 | font-size: 16px;
18 | width: 100%;
19 | color: white;
20 | background-color: transparent;
21 | border: none;
22 | border-bottom: 1px solid white;
23 | outline: transparent;
24 | }
25 |
26 | div{
27 | height: 70px;
28 | display: flex;
29 | align-items: center;
30 | justify-content: space-between;
31 |
32 | .button {
33 | float: left;
34 | margin: 10px 0px;
35 | padding: 10px 15px;
36 | font-size: 16px;
37 | color: white;
38 | background-color: rgb(0, 195, 255);
39 | border: none;
40 | border-radius: 5px;
41 |
42 | &:hover{
43 | background-color: rgb(0, 130, 170);
44 | cursor: pointer;
45 | }
46 | }
47 |
48 | span{
49 | font-size: 20px;
50 | float: right;
51 | }
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/frontend/src/pages/popular/popular.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './popular.styles.scss';
3 | import MOVIE_DATA from '../../assets/movie.data';
4 | import CollectionPreview from '../../components/collection-preview/collection-preview.component';
5 |
6 |
7 | class Popular extends React.Component {
8 | constructor(){
9 | super();
10 | this.state = {
11 | collections: MOVIE_DATA
12 | }
13 | }
14 |
15 | render(){
16 | const { collections } = this.state;
17 | return(
18 |
19 |
Popular
20 |
21 |
22 | )
23 | }
24 | }
25 |
26 | export default Popular;
--------------------------------------------------------------------------------
/frontend/src/pages/popular/popular.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/popular/popular.styles.scss
--------------------------------------------------------------------------------
/frontend/src/pages/sign-in-and-sign-up/sign-in-and-sign-up.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './sign-in-and-sign-up.styles.scss';
3 |
4 | import SignIn from '../../components/sign-in/sign-in.component';
5 | import SignUp from '../../components/sign-up/sign-up.component';
6 |
7 | const SignInAndSignUp = (props) => {
8 | return (
9 |
10 |
Log In or Create an Account
11 |
12 |
13 |
14 |
15 |
16 | )
17 | }
18 |
19 | export default SignInAndSignUp;
--------------------------------------------------------------------------------
/frontend/src/pages/sign-in-and-sign-up/sign-in-and-sign-up.styles.scss:
--------------------------------------------------------------------------------
1 | .sign-in-and-sign-up-container {
2 | margin: auto;
3 | //padding: 20px;
4 | display: flex;
5 | //background-color: blue;
6 | width: 75%;
7 | //align-items: center;
8 | justify-content: center;
9 | }
10 |
--------------------------------------------------------------------------------
/frontend/src/pages/upcoming/upcoming.component.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './upcoming.styles.scss';
3 | import MOVIE_DATA from '../../assets/movie.data';
4 | import CollectionPreview from '../../components/collection-preview/collection-preview.component';
5 |
6 |
7 | class Upcoming extends React.Component {
8 | constructor(){
9 | super();
10 | this.state = {
11 | collections: MOVIE_DATA
12 | }
13 | }
14 |
15 | render(){
16 | const { collections } = this.state;
17 | return(
18 |
19 |
Upcoming
20 |
21 |
22 | )
23 | }
24 | }
25 |
26 | export default Upcoming;
--------------------------------------------------------------------------------
/frontend/src/pages/upcoming/upcoming.styles.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/upcoming/upcoming.styles.scss
--------------------------------------------------------------------------------
/frontend/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.1/8 is considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl)
104 | .then(response => {
105 | // Ensure service worker exists, and that we really are getting a JS file.
106 | const contentType = response.headers.get('content-type');
107 | if (
108 | response.status === 404 ||
109 | (contentType != null && contentType.indexOf('javascript') === -1)
110 | ) {
111 | // No service worker found. Probably a different app. Reload the page.
112 | navigator.serviceWorker.ready.then(registration => {
113 | registration.unregister().then(() => {
114 | window.location.reload();
115 | });
116 | });
117 | } else {
118 | // Service worker found. Proceed as normal.
119 | registerValidSW(swUrl, config);
120 | }
121 | })
122 | .catch(() => {
123 | console.log(
124 | 'No internet connection found. App is running in offline mode.'
125 | );
126 | });
127 | }
128 |
129 | export function unregister() {
130 | if ('serviceWorker' in navigator) {
131 | navigator.serviceWorker.ready.then(registration => {
132 | registration.unregister();
133 | });
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "moviego-latest",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "ansi-regex": {
8 | "version": "3.0.0",
9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
10 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
11 | },
12 | "ansi-styles": {
13 | "version": "3.2.1",
14 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
15 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
16 | "requires": {
17 | "color-convert": "^1.9.0"
18 | }
19 | },
20 | "camelcase": {
21 | "version": "5.3.1",
22 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
23 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
24 | },
25 | "chalk": {
26 | "version": "2.4.2",
27 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
28 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
29 | "requires": {
30 | "ansi-styles": "^3.2.1",
31 | "escape-string-regexp": "^1.0.5",
32 | "supports-color": "^5.3.0"
33 | },
34 | "dependencies": {
35 | "supports-color": {
36 | "version": "5.5.0",
37 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
38 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
39 | "requires": {
40 | "has-flag": "^3.0.0"
41 | }
42 | }
43 | }
44 | },
45 | "cliui": {
46 | "version": "4.1.0",
47 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
48 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
49 | "requires": {
50 | "string-width": "^2.1.1",
51 | "strip-ansi": "^4.0.0",
52 | "wrap-ansi": "^2.0.0"
53 | }
54 | },
55 | "code-point-at": {
56 | "version": "1.1.0",
57 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
58 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
59 | },
60 | "color-convert": {
61 | "version": "1.9.3",
62 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
63 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
64 | "requires": {
65 | "color-name": "1.1.3"
66 | }
67 | },
68 | "color-name": {
69 | "version": "1.1.3",
70 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
71 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
72 | },
73 | "concurrently": {
74 | "version": "5.0.0",
75 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz",
76 | "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==",
77 | "requires": {
78 | "chalk": "^2.4.2",
79 | "date-fns": "^2.0.1",
80 | "lodash": "^4.17.15",
81 | "read-pkg": "^4.0.1",
82 | "rxjs": "^6.5.2",
83 | "spawn-command": "^0.0.2-1",
84 | "supports-color": "^4.5.0",
85 | "tree-kill": "^1.2.1",
86 | "yargs": "^12.0.5"
87 | }
88 | },
89 | "cross-spawn": {
90 | "version": "6.0.5",
91 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
92 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
93 | "requires": {
94 | "nice-try": "^1.0.4",
95 | "path-key": "^2.0.1",
96 | "semver": "^5.5.0",
97 | "shebang-command": "^1.2.0",
98 | "which": "^1.2.9"
99 | }
100 | },
101 | "date-fns": {
102 | "version": "2.6.0",
103 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.6.0.tgz",
104 | "integrity": "sha512-F55YxqRdEfP/eYQmQjLN798v0AwLjmZ8nMBjdQvNwEE3N/zWVrlkkqT+9seBlPlsbkybG4JmWg3Ee3dIV9BcGQ=="
105 | },
106 | "decamelize": {
107 | "version": "1.2.0",
108 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
109 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
110 | },
111 | "end-of-stream": {
112 | "version": "1.4.4",
113 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
114 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
115 | "requires": {
116 | "once": "^1.4.0"
117 | }
118 | },
119 | "error-ex": {
120 | "version": "1.3.2",
121 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
122 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
123 | "requires": {
124 | "is-arrayish": "^0.2.1"
125 | }
126 | },
127 | "escape-string-regexp": {
128 | "version": "1.0.5",
129 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
130 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
131 | },
132 | "execa": {
133 | "version": "1.0.0",
134 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
135 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
136 | "requires": {
137 | "cross-spawn": "^6.0.0",
138 | "get-stream": "^4.0.0",
139 | "is-stream": "^1.1.0",
140 | "npm-run-path": "^2.0.0",
141 | "p-finally": "^1.0.0",
142 | "signal-exit": "^3.0.0",
143 | "strip-eof": "^1.0.0"
144 | }
145 | },
146 | "find-up": {
147 | "version": "3.0.0",
148 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
149 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
150 | "requires": {
151 | "locate-path": "^3.0.0"
152 | }
153 | },
154 | "get-caller-file": {
155 | "version": "1.0.3",
156 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
157 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
158 | },
159 | "get-stream": {
160 | "version": "4.1.0",
161 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
162 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
163 | "requires": {
164 | "pump": "^3.0.0"
165 | }
166 | },
167 | "has-flag": {
168 | "version": "3.0.0",
169 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
170 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
171 | },
172 | "hosted-git-info": {
173 | "version": "2.8.9",
174 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
175 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
176 | },
177 | "invert-kv": {
178 | "version": "2.0.0",
179 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
180 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
181 | },
182 | "is-arrayish": {
183 | "version": "0.2.1",
184 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
185 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
186 | },
187 | "is-fullwidth-code-point": {
188 | "version": "2.0.0",
189 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
190 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
191 | },
192 | "is-stream": {
193 | "version": "1.1.0",
194 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
195 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
196 | },
197 | "isexe": {
198 | "version": "2.0.0",
199 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
200 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
201 | },
202 | "json-parse-better-errors": {
203 | "version": "1.0.2",
204 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
205 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
206 | },
207 | "lcid": {
208 | "version": "2.0.0",
209 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
210 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
211 | "requires": {
212 | "invert-kv": "^2.0.0"
213 | }
214 | },
215 | "locate-path": {
216 | "version": "3.0.0",
217 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
218 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
219 | "requires": {
220 | "p-locate": "^3.0.0",
221 | "path-exists": "^3.0.0"
222 | }
223 | },
224 | "lodash": {
225 | "version": "4.17.21",
226 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
227 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
228 | },
229 | "map-age-cleaner": {
230 | "version": "0.1.3",
231 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
232 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
233 | "requires": {
234 | "p-defer": "^1.0.0"
235 | }
236 | },
237 | "mem": {
238 | "version": "4.3.0",
239 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
240 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
241 | "requires": {
242 | "map-age-cleaner": "^0.1.1",
243 | "mimic-fn": "^2.0.0",
244 | "p-is-promise": "^2.0.0"
245 | }
246 | },
247 | "mimic-fn": {
248 | "version": "2.1.0",
249 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
250 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
251 | },
252 | "nice-try": {
253 | "version": "1.0.5",
254 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
255 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
256 | },
257 | "normalize-package-data": {
258 | "version": "2.5.0",
259 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
260 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
261 | "requires": {
262 | "hosted-git-info": "^2.1.4",
263 | "resolve": "^1.10.0",
264 | "semver": "2 || 3 || 4 || 5",
265 | "validate-npm-package-license": "^3.0.1"
266 | }
267 | },
268 | "npm-run-path": {
269 | "version": "2.0.2",
270 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
271 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
272 | "requires": {
273 | "path-key": "^2.0.0"
274 | }
275 | },
276 | "number-is-nan": {
277 | "version": "1.0.1",
278 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
279 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
280 | },
281 | "once": {
282 | "version": "1.4.0",
283 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
284 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
285 | "requires": {
286 | "wrappy": "1"
287 | }
288 | },
289 | "os-locale": {
290 | "version": "3.1.0",
291 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
292 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
293 | "requires": {
294 | "execa": "^1.0.0",
295 | "lcid": "^2.0.0",
296 | "mem": "^4.0.0"
297 | }
298 | },
299 | "p-defer": {
300 | "version": "1.0.0",
301 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
302 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
303 | },
304 | "p-finally": {
305 | "version": "1.0.0",
306 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
307 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
308 | },
309 | "p-is-promise": {
310 | "version": "2.1.0",
311 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
312 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
313 | },
314 | "p-limit": {
315 | "version": "2.2.1",
316 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
317 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
318 | "requires": {
319 | "p-try": "^2.0.0"
320 | }
321 | },
322 | "p-locate": {
323 | "version": "3.0.0",
324 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
325 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
326 | "requires": {
327 | "p-limit": "^2.0.0"
328 | }
329 | },
330 | "p-try": {
331 | "version": "2.2.0",
332 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
333 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
334 | },
335 | "parse-json": {
336 | "version": "4.0.0",
337 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
338 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
339 | "requires": {
340 | "error-ex": "^1.3.1",
341 | "json-parse-better-errors": "^1.0.1"
342 | }
343 | },
344 | "path-exists": {
345 | "version": "3.0.0",
346 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
347 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
348 | },
349 | "path-key": {
350 | "version": "2.0.1",
351 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
352 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
353 | },
354 | "path-parse": {
355 | "version": "1.0.7",
356 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
357 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
358 | },
359 | "pify": {
360 | "version": "3.0.0",
361 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
362 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
363 | },
364 | "pump": {
365 | "version": "3.0.0",
366 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
367 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
368 | "requires": {
369 | "end-of-stream": "^1.1.0",
370 | "once": "^1.3.1"
371 | }
372 | },
373 | "read-pkg": {
374 | "version": "4.0.1",
375 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
376 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
377 | "requires": {
378 | "normalize-package-data": "^2.3.2",
379 | "parse-json": "^4.0.0",
380 | "pify": "^3.0.0"
381 | }
382 | },
383 | "require-directory": {
384 | "version": "2.1.1",
385 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
386 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
387 | },
388 | "require-main-filename": {
389 | "version": "1.0.1",
390 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
391 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
392 | },
393 | "resolve": {
394 | "version": "1.12.0",
395 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
396 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
397 | "requires": {
398 | "path-parse": "^1.0.6"
399 | }
400 | },
401 | "rxjs": {
402 | "version": "6.5.3",
403 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
404 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
405 | "requires": {
406 | "tslib": "^1.9.0"
407 | }
408 | },
409 | "semver": {
410 | "version": "5.7.1",
411 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
412 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
413 | },
414 | "set-blocking": {
415 | "version": "2.0.0",
416 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
417 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
418 | },
419 | "shebang-command": {
420 | "version": "1.2.0",
421 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
422 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
423 | "requires": {
424 | "shebang-regex": "^1.0.0"
425 | }
426 | },
427 | "shebang-regex": {
428 | "version": "1.0.0",
429 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
430 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
431 | },
432 | "signal-exit": {
433 | "version": "3.0.2",
434 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
435 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
436 | },
437 | "spawn-command": {
438 | "version": "0.0.2-1",
439 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
440 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A="
441 | },
442 | "spdx-correct": {
443 | "version": "3.1.0",
444 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
445 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
446 | "requires": {
447 | "spdx-expression-parse": "^3.0.0",
448 | "spdx-license-ids": "^3.0.0"
449 | }
450 | },
451 | "spdx-exceptions": {
452 | "version": "2.2.0",
453 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
454 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
455 | },
456 | "spdx-expression-parse": {
457 | "version": "3.0.0",
458 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
459 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
460 | "requires": {
461 | "spdx-exceptions": "^2.1.0",
462 | "spdx-license-ids": "^3.0.0"
463 | }
464 | },
465 | "spdx-license-ids": {
466 | "version": "3.0.5",
467 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
468 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
469 | },
470 | "string-width": {
471 | "version": "2.1.1",
472 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
473 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
474 | "requires": {
475 | "is-fullwidth-code-point": "^2.0.0",
476 | "strip-ansi": "^4.0.0"
477 | }
478 | },
479 | "strip-ansi": {
480 | "version": "4.0.0",
481 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
482 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
483 | "requires": {
484 | "ansi-regex": "^3.0.0"
485 | }
486 | },
487 | "strip-eof": {
488 | "version": "1.0.0",
489 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
490 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
491 | },
492 | "supports-color": {
493 | "version": "4.5.0",
494 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
495 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
496 | "requires": {
497 | "has-flag": "^2.0.0"
498 | },
499 | "dependencies": {
500 | "has-flag": {
501 | "version": "2.0.0",
502 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
503 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
504 | }
505 | }
506 | },
507 | "tree-kill": {
508 | "version": "1.2.2",
509 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
510 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="
511 | },
512 | "tslib": {
513 | "version": "1.10.0",
514 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
515 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
516 | },
517 | "validate-npm-package-license": {
518 | "version": "3.0.4",
519 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
520 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
521 | "requires": {
522 | "spdx-correct": "^3.0.0",
523 | "spdx-expression-parse": "^3.0.0"
524 | }
525 | },
526 | "which": {
527 | "version": "1.3.1",
528 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
529 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
530 | "requires": {
531 | "isexe": "^2.0.0"
532 | }
533 | },
534 | "which-module": {
535 | "version": "2.0.0",
536 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
537 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
538 | },
539 | "wrap-ansi": {
540 | "version": "2.1.0",
541 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
542 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
543 | "requires": {
544 | "string-width": "^1.0.1",
545 | "strip-ansi": "^3.0.1"
546 | },
547 | "dependencies": {
548 | "ansi-regex": {
549 | "version": "2.1.1",
550 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
551 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
552 | },
553 | "is-fullwidth-code-point": {
554 | "version": "1.0.0",
555 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
556 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
557 | "requires": {
558 | "number-is-nan": "^1.0.0"
559 | }
560 | },
561 | "string-width": {
562 | "version": "1.0.2",
563 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
564 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
565 | "requires": {
566 | "code-point-at": "^1.0.0",
567 | "is-fullwidth-code-point": "^1.0.0",
568 | "strip-ansi": "^3.0.0"
569 | }
570 | },
571 | "strip-ansi": {
572 | "version": "3.0.1",
573 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
574 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
575 | "requires": {
576 | "ansi-regex": "^2.0.0"
577 | }
578 | }
579 | }
580 | },
581 | "wrappy": {
582 | "version": "1.0.2",
583 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
584 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
585 | },
586 | "y18n": {
587 | "version": "4.0.1",
588 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
589 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
590 | },
591 | "yargs": {
592 | "version": "12.0.5",
593 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
594 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
595 | "requires": {
596 | "cliui": "^4.0.0",
597 | "decamelize": "^1.2.0",
598 | "find-up": "^3.0.0",
599 | "get-caller-file": "^1.0.1",
600 | "os-locale": "^3.0.0",
601 | "require-directory": "^2.1.1",
602 | "require-main-filename": "^1.0.1",
603 | "set-blocking": "^2.0.0",
604 | "string-width": "^2.0.0",
605 | "which-module": "^2.0.0",
606 | "y18n": "^3.2.1 || ^4.0.0",
607 | "yargs-parser": "^11.1.1"
608 | }
609 | },
610 | "yargs-parser": {
611 | "version": "11.1.1",
612 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
613 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
614 | "requires": {
615 | "camelcase": "^5.0.0",
616 | "decamelize": "^1.2.0"
617 | }
618 | }
619 | }
620 | }
621 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "moviego-latest",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "concurrently \"cd backend && nodemon server.js\" \"cd frontend && npm start\""
8 | },
9 | "author": "Ahmed Gulab Khan",
10 | "license": "ISC",
11 | "dependencies": {
12 | "concurrently": "^5.0.0"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/snapshots/screenshot-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/snapshots/screenshot-1.png
--------------------------------------------------------------------------------
/snapshots/screenshot-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/snapshots/screenshot-2.png
--------------------------------------------------------------------------------