├── config ├── production.json └── default.json ├── README.md ├── .gitignore ├── public ├── img │ ├── bkg.png │ ├── flat2.jpg │ ├── kukai.jpg │ ├── scultura.png │ ├── signature.png │ └── scultura_old.png ├── css │ └── custom.css └── js │ ├── ws.js │ ├── hammer.min.js │ └── jquery.min.js ├── views ├── about.pug ├── error.pug ├── login.pug ├── register.pug ├── layout_page.pug ├── data.pug └── layout.pug ├── index.js ├── models ├── account.js └── data.js ├── ecosystem.config.js ├── package.json ├── app.js └── routes.js /config/production.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flxerSocket2 2 | # flxerSocket2 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | .DS_Store 4 | .env -------------------------------------------------------------------------------- /public/img/bkg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/bkg.png -------------------------------------------------------------------------------- /public/img/flat2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/flat2.jpg -------------------------------------------------------------------------------- /public/img/kukai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/kukai.jpg -------------------------------------------------------------------------------- /public/img/scultura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/scultura.png -------------------------------------------------------------------------------- /public/img/signature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/signature.png -------------------------------------------------------------------------------- /public/img/scultura_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gianlucadelgobbo/flxerSocket2/main/public/img/scultura_old.png -------------------------------------------------------------------------------- /views/about.pug: -------------------------------------------------------------------------------- 1 | extends layout_page 2 | 3 | block content 4 | .vev(shadow="shadow" data-path=data.path) 5 | script(async="async" src=data.src) 6 | -------------------------------------------------------------------------------- /views/error.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | script. 5 | var is_admin = true 6 | h1= message 7 | h2= error.status 8 | pre #{error.stack} 9 | -------------------------------------------------------------------------------- /config/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "development": { 3 | "wsdomain": "ws://localhost:8080" 4 | }, 5 | "production": { 6 | "wsdomain": "wss://ted.avnode.net:8060" 7 | }, 8 | "delay": 1440 9 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var app = require('./app'); 3 | var pkg = require('./package.json'); 4 | 5 | app.set('port', process.env.PORT || 4000); 6 | 7 | var server = app.listen(app.get('port'), function() { 8 | console.log(pkg.name, 'listening on port http://localhost:' + server.address().port); 9 | }); 10 | -------------------------------------------------------------------------------- /models/account.js: -------------------------------------------------------------------------------- 1 | let mongoose = require('mongoose'), 2 | Schema = mongoose.Schema, 3 | passportLocalMongoose = require('passport-local-mongoose'); 4 | 5 | const Account = new Schema({ 6 | nickname: String, 7 | birthdate: Date 8 | }); 9 | 10 | Account.plugin(passportLocalMongoose); 11 | 12 | module.exports = mongoose.model('Account', Account); -------------------------------------------------------------------------------- /views/login.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | script. 5 | var is_admin = true 6 | .row.justify-content-center 7 | .col-md-4 8 | h2.mt-5.pt-3 Log In 9 | if message && message != '' 10 | .alert.alert-danger #{message} 11 | form(method="post") 12 | .form-group 13 | label(for="email") Username 14 | input.form-control#email(type="text",name="username") 15 | .form-group.mt-3 16 | label(for="password") Password 17 | input.form-control#password(type="password",name="password") 18 | .mt-3 19 | button.btn.btn-primary(type="submit") Log In 20 | -------------------------------------------------------------------------------- /views/register.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | script. 5 | var is_admin = true 6 | .row.justify-content-center 7 | .col-md-4 8 | h2.mt-5 Register 9 | if message && message != '' 10 | .alert.alert-danger!=message 11 | form(method="post") 12 | .form-group 13 | label(for="email") Username 14 | input.form-control#email(type="text",name="username") 15 | .form-group.mt-3 16 | label(for="password") Password 17 | input.form-control#password(type="password",name="password") 18 | .mt-3 19 | button.btn.btn-primary(type="submit") Register 20 | 21 | -------------------------------------------------------------------------------- /models/data.js: -------------------------------------------------------------------------------- 1 | let mongoose = require('mongoose'), 2 | Schema = mongoose.Schema; 3 | 4 | const Data = new Schema({ 5 | email: { 6 | required: "EMAIL_IS_REQUIRED", 7 | type: String, 8 | trim: true, 9 | index: true, 10 | unique: "You have already booked an NFT", 11 | validate: [(email) => { 12 | //var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3,4})+$/; 13 | var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 14 | return re.test(email) 15 | }, 'EMAIL_IS_NOT_VALID'] 16 | }, 17 | buy_id: Number, 18 | status: String 19 | }, { 20 | timestamps: true 21 | }); 22 | 23 | module.exports = mongoose.model('Data', Data); -------------------------------------------------------------------------------- /ecosystem.config.js: -------------------------------------------------------------------------------- 1 | //pm2 deploy ecosystem.config.js production setup 2 | module.exports = { 3 | apps : [{ 4 | name: "TED", 5 | max_memory_restart: "2G", 6 | script: "index.js", 7 | "log_file": "/sites/logs/avnode_ted-combined.log", 8 | "out_file": "/sites/logs/avnode_ted-out.log", 9 | "error_file": "/sites/logs/avnode_ted-err.log", 10 | ignore_watch: [ 11 | "public", "logs" 12 | ], 13 | /* "args": "-lang ru", */ 14 | time: true, 15 | instances: 1, 16 | exec_mode: "fork", 17 | autorestart: true, 18 | watch: true, 19 | watch_options: { 20 | followSymlinks: false 21 | }, 22 | env: { 23 | NODE_ENV: "production" 24 | } 25 | }], 26 | 27 | deploy : { 28 | production : { 29 | user : "us-her-www", 30 | host : [{host : "142.93.138.219:8500",port : "22"}], 31 | ref : "origin/master", 32 | repo : "git@github.com:HER-She-Loves-Data/WWWClient.git", 33 | path : "", 34 | "post-deploy" : "npm install && pm2 reload ecosystem.config.js --env production" 35 | } 36 | } 37 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FLxER Socket 2.0", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "nodemon index" 7 | }, 8 | "dependencies": { 9 | "config": "^3.3.7", 10 | "connect-flash": "^0.1.1", 11 | "cookie-parser": "^1.4.6", 12 | "cookie-session": "^2.0.0", 13 | "dotenv": "^16.0.1", 14 | "express": "^4.17.3", 15 | "mongoose": "^6.2.10", 16 | "morgan": "^1.10.0", 17 | "nodemailer": "^6.7.5", 18 | "nodemon": "^2.0.16", 19 | "passport": "^0.5.2", 20 | "passport-local": "^1.0.0", 21 | "passport-local-mongoose": "^7.0.0", 22 | "pug": "^3.0.2", 23 | "serve-favicon": "^2.5.0", 24 | "ws": "^8.6.0" 25 | }, 26 | "dependenciaaaaaaaes": { 27 | "body-parser": "^1.19.2", 28 | "connect-flash": "^0.1.1", 29 | "cookie-parser": "^1.4.6", 30 | "cookie-session": "^2.0.0", 31 | "debug": "^4.3.3", 32 | "express": "^4.17.3", 33 | "mongoose": "^6.2.5", 34 | "morgan": "^1.10.0", 35 | "passport": "^0.5.2", 36 | "passport-local": "1.0.x", 37 | "passport-local-mongoose": "^6.1.0", 38 | "pug": "^3.0.2", 39 | "serve-favicon": "^2.5.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /public/css/custom.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;700&display=swap'); 2 | 3 | body, .btn { 4 | font-family: "DM Sans", Arial, Helvetica, sans-serif; 5 | } 6 | .buttonfull,.prenotato, .comprato { 7 | height: 100%; 8 | width: 100%; 9 | text-align: right; 10 | font-size: 12px; 11 | padding: 5px; 12 | text-decoration: none; 13 | color: black; 14 | } 15 | .shape td { 16 | background-color: rgba(0,0,0,0); 17 | /*border: 1px solid #FFF;*/ 18 | height: 41.5px; 19 | width: 53.7px; 20 | } 21 | .buttonfull,.prenotato, .comprato { 22 | display: block; 23 | } 24 | 25 | .buttonfull span{ 26 | margin: auto; 27 | } 28 | 29 | .buttonfull:hover { 30 | background-color: rgba(30,30,30,0.4); 31 | color:#FFF 32 | } 33 | 34 | .prenotato { 35 | background-color:#FFF; 36 | } 37 | 38 | .comprato { 39 | background-color:rgb(255, 0, 0); 40 | color: #FFF; 41 | } 42 | 43 | .shape{ 44 | margin: auto; 45 | width: max-content; 46 | background-image: url("/img/scultura.png"); 47 | background-position: 0px 1px; 48 | background-repeat: no-repeat; 49 | background-size: contain; 50 | } 51 | .mycontainer { 52 | /* */ width: 100%; 53 | height: 100vh; 54 | overflow: scroll; 55 | padding: 100px; 56 | background-color: #000; 57 | /* background-image: url("/img/bkg.png"); 58 | background-position: -1px 3px; 59 | background-repeat:repeat-x; */ 60 | } 61 | 62 | @media (min-width: 992px) { 63 | .navbar-expand-lg .navbar-nav { 64 | position: absolute; 65 | right: 0; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /views/layout_page.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | head 4 | title GATEWAY 5 | // Required meta tags 6 | meta(charset='utf-8') 7 | meta(name='viewport' content='width=device-width, initial-scale=1') 8 | // Bootstrap CSS 9 | link(href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet' integrity='sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3' crossorigin='anonymous') 10 | 11 | link(rel='stylesheet', href='/css/custom.css') 12 | body 13 | nav.navbar.navbar-dark.bg-dark.navbar-expand-lg.sticky-top 14 | .container-fluid 15 | a.navbar-brand GATEWAY 16 | button.navbar-toggler(type='button' data-bs-toggle='collapse' data-bs-target='#navbarNavDropdown' aria-controls='navbarNavDropdown' aria-expanded='false' aria-label='Toggle navigation') 17 | span.navbar-toggler-icon 18 | #navbarNavDropdown.collapse.navbar-collapse 19 | ul.navbar-nav 20 | li.nav-item 21 | a.nav-link(href='/') GATEWAY 22 | li.nav-item 23 | a.nav-link(href="/about") ABOUT 24 | li.nav-item 25 | a.nav-link(href="/nft") NFT 26 | li.nav-item 27 | a.nav-link(href="/faq") FAQ 28 | //-if (typeof(user) == 'undefined') 29 | li.nav-item 30 | a.nav-link(href="/login") Log In 31 | else 32 | li.nav-item 33 | a.nav-link(href="/logout") Log Out 34 | li.nav-item 35 | a.nav-link(href="/data") DATA 36 | 37 | block content 38 | 39 | script(src='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js' integrity='sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p' crossorigin='anonymous') 40 | script(src='/js/jquery.min.js') 41 | //script(src='/js/ws.js') 42 | -------------------------------------------------------------------------------- /views/data.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | 5 | script. 6 | var is_admin = true 7 | .container 8 | if (user) 9 | h1.mt-5.pt-3.mb-4 You are currently logged in as #{user} 10 | table.table 11 | thead 12 | tr 13 | - console.log(user) 14 | if user=="admin" 15 | th Act 16 | th NFT 17 | th Email 18 | th Status 19 | th Sells 20 | th Booking time 21 | tbody 22 | each d in data 23 | tr(id=d._id) 24 | if user=="admin" 25 | td 26 | button.btn.btn-danger.admindelete(type='button' data-id=d._id data-buy_id=d.buy_id) 27 | span.btn-close 28 | td=d.buy_id 29 | td 30 | a(href="mailto:"+d.email)=d.email 31 | td 32 | - var date = new Date(); 33 | - var date2 = new Date(d.createdAt); 34 | - date2.setTime(date2.getTime() + (config.delay * 60 * 1000)); 35 | if date2.getTime() > date.getTime() 36 | !="BOOKED" 37 | else if d.status == "comprato" 38 | !="SOLD" 39 | else if d.status == "prenotato" 40 | !="EXPIRED" 41 | td 42 | if d.status == "comprato" || (d.status == "prenotato" && buyed.indexOf(d.buy_id)===-1) 43 | .form-check 44 | input.form-check-input.adminstatus(data-id=d._id data-time=d.createdAt type="checkbox" checked=(d.status == "comprato" ? "" : undefined) data-buy_id=d.buy_id) 45 | label.form-check-label(for=d._id)=" BUYED" 46 | else 47 | !="BUYED FROM SOMEONE ELSE" 48 | td=d.createdAt 49 | else 50 | p You are currently not logged in. Plaese login or register... 51 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const path = require('path'); 3 | const favicon = require('serve-favicon'); 4 | const logger = require('morgan'); 5 | const cookieParser = require('cookie-parser'); 6 | const session = require('cookie-session'); 7 | const bodyParser = require('body-parser'); 8 | 9 | const mongoose = require('mongoose'); 10 | const passport = require('passport'); 11 | const LocalStrategy = require('passport-local').Strategy; 12 | const flash = require('connect-flash'); 13 | 14 | const app = express(); 15 | 16 | // view engine setup 17 | app.set('views', path.join(__dirname, 'views')); 18 | app.set('view engine', 'pug'); 19 | 20 | // uncomment after placing your favicon in /public 21 | //app.use(favicon(__dirname + '/public/favicon.ico')); 22 | app.use(logger('dev')); 23 | app.use(bodyParser.json()); 24 | app.use(bodyParser.urlencoded({extended: false})); 25 | app.use(cookieParser()); 26 | app.use(session({keys: ['secretkey1', 'secretkey2', '...']})); 27 | app.use(flash()); 28 | 29 | app.use(express.static(path.join(__dirname, 'public'))); 30 | 31 | // Configure passport middleware 32 | app.use(passport.initialize()); 33 | app.use(passport.session()); 34 | 35 | // Configure passport-local to use account model for authentication 36 | const Account = require('./models/account'); 37 | //const { config } = require('process'); 38 | const config = require('config'); 39 | passport.use(new LocalStrategy(Account.authenticate())); 40 | 41 | passport.serializeUser(Account.serializeUser()); 42 | passport.deserializeUser(Account.deserializeUser()); 43 | 44 | // Connect mongoose 45 | mongoose.connect('mongodb://localhost/flxerSocket2', { useNewUrlParser: true, useUnifiedTopology: true }, function(err) { 46 | if (err) { 47 | console.log('Could not connect to mongodb on localhost. Ensure that you have mongodb running on localhost and mongodb accepts connections on standard ports!'); 48 | } 49 | }); 50 | //mongoose.set('useCreateIndex', true); 51 | 52 | // Register routes 53 | app.use('/', require('./routes')); 54 | 55 | // catch 404 and forward to error handler 56 | app.use(function(req, res, next) { 57 | const err = new Error('Not Found'); 58 | err.status = 404; 59 | next(err); 60 | }); 61 | 62 | // error handlers 63 | 64 | // development error handler 65 | // will print stacktrace 66 | if (app.get('env') === 'development') { 67 | app.use(function(err, req, res, next) { 68 | res.status(err.status || 500); 69 | res.render('error', { 70 | message: err.message, 71 | error: err 72 | }); 73 | }); 74 | } 75 | config.env = app.get('env'); 76 | 77 | // production error handler 78 | // no stacktraces leaked to user 79 | app.use(function(err, req, res, next) { 80 | res.status(err.status || 500); 81 | res.render('error', { 82 | message: err.message, 83 | error: {} 84 | }); 85 | }); 86 | 87 | module.exports = app; 88 | -------------------------------------------------------------------------------- /views/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | head 4 | title GATEWAY 5 | // Required meta tags 6 | meta(charset='utf-8') 7 | meta(name='viewport' content='user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width') 8 | // Bootstrap CSS 9 | link(href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet' integrity='sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3' crossorigin='anonymous') 10 | 11 | link(rel='stylesheet', href='/css/custom.css') 12 | if wsdomain 13 | - var dd = JSON.stringify(full) 14 | - var buyed = [] 15 | - for (var a=0;a