diff --git a/app.js b/app.js index faff468..cdc0b29 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,8 @@ const swaggerJsdoc = require('swagger-jsdoc'); const swaggerUi = require('swagger-ui-express'); const config = require('./src/config/main'); const path = require('path'); +const cors = require('cors'); + const swaggerOptions = { definition: { @@ -41,6 +43,7 @@ Model.knex(knex); const app = express(); app.use(express.json()); +app.use(cors()); // Routes app.use('/auth', require('./src/routes/auth')); @@ -48,8 +51,9 @@ app.use('/admin', require('./src/routes/admin')); app.use('/messages', require('./src/routes/messages')); app.use('/email', require('./src/routes/email')); app.use('/test', require('./src/routes/test')); -app.use('/', require('./src/routes/index')); +// app.use('/', require('./src/routes/index')); app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); +app.use('/stats', require('./src/routes/stats')); app.get('/favicon.svg', (req, res) => { res.sendFile(path.join(__dirname, './images/favicon.svg')); @@ -73,6 +77,35 @@ cron.schedule('0 0 * * *', async () => { } }); + +app.get('/api/stats/total', (req, res) => { + // Replace this with your actual database query + res.json({ + emailsCreated: 152847, + messagesReceived: 892365 + }); +}); + +app.get('/api/stats/timeseries', (req, res) => { + // Replace this with your actual database query + res.json([ + { name: 'Mon', emails: 1240, messages: 5430 }, + { name: 'Tue', emails: 1580, messages: 6210 }, + { name: 'Wed', emails: 1890, messages: 7840 }, + { name: 'Thu', emails: 2090, messages: 8120 }, + { name: 'Fri', emails: 1870, messages: 6980 }, + { name: 'Sat', emails: 1450, messages: 5640 }, + { name: 'Sun', emails: 1320, messages: 4980 } + ]); +}); + +app.use(express.static(path.join(__dirname, 'client/build'))); + + +app.get('*', (req, res) => { + res.sendFile(path.join(__dirname, 'client/build', 'index.html')); +}); + app.listen(config.site.port, () => { console.log(`API server running on port ${config.site.port}`); }); \ No newline at end of file diff --git a/client/build/asset-manifest.json b/client/build/asset-manifest.json new file mode 100644 index 0000000..9f9570f --- /dev/null +++ b/client/build/asset-manifest.json @@ -0,0 +1,13 @@ +{ + "files": { + "main.css": "/static/css/main.f6ab033f.css", + "main.js": "/static/js/main.4a7c450d.js", + "index.html": "/index.html", + "main.f6ab033f.css.map": "/static/css/main.f6ab033f.css.map", + "main.4a7c450d.js.map": "/static/js/main.4a7c450d.js.map" + }, + "entrypoints": [ + "static/css/main.f6ab033f.css", + "static/js/main.4a7c450d.js" + ] +} \ No newline at end of file diff --git a/client/build/index.html b/client/build/index.html new file mode 100644 index 0000000..183e16b --- /dev/null +++ b/client/build/index.html @@ -0,0 +1 @@ +
0?i=i.charAt(0)+"."+i.slice(1)+j(r):a>1&&(i=i.charAt(0)+"."+i.slice(1)),i=i+(o<0?"e":"e+")+o):o<0?(i="0."+j(-o-1)+i,n&&(r=n-a)>0&&(i+=j(r))):o>=a?(i+=j(o+1-a),n&&(r=n-o-1)>0&&(i=i+"."+j(r))):((r=o+1)0&&(o+1===a&&(i+="."),i+=j(r))),e.s<0?"-"+i:i}function C(e,t){if(e.length>t)return e.length=t,!0}function T(e){if(!e||"object"!==typeof e)throw Error(u+"Object expected");var t,n,r,o=["precision",1,i,"rounding",0,8,"toExpNeg",-1/0,0,"toExpPos",0,1/0];for(t=0;t e||125 =p&&d<=f}return c?He(He({},t),{},{radius:i,angle:Ke(d,t)}):null};function Ze(e){var t=e.cx,n=e.cy,r=e.radius,o=e.startAngle,i=e.endAngle;return{points:[Ge(t,n,r,o),Ge(t,n,r,i)],cx:t,cy:n,radius:r,startAngle:o,endAngle:i}}var Je={isSsr:!("undefined"!==typeof window&&window.document&&window.document.createElement&&window.setTimeout),get:function(e){return Je[e]},set:function(e,t){if("string"===typeof e)Je[e]=t;else{var n=Object.keys(e);n&&n.length&&n.forEach((function(t){Je[t]=e[t]}))}}};function et(e){return et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},et(e)}function tt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function nt(e){for(var t=1;t{var r=n(9812),o=n(2929),i=n(3211),a=n(3668),l=n(4160),u=n(2074),c=r?r.prototype:void 0,s=c?c.valueOf:void 0;e.exports=function(e,t,n,r,c,f,p){switch(n){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!f(new o(e),new o(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var d=l;case"[object Set]":var h=1&r;if(d||(d=u),e.size!=t.size&&!h)return!1;var y=p.get(e);if(y)return y==t;r|=2,p.set(e,t);var v=a(d(e),d(t),r,c,f,p);return p.delete(e),v;case"[object Symbol]":if(s)return s.call(e)==s.call(t)}return!1}},5752:(e,t,n)=>{var r=n(9395),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,i,a,l){var u=1&n,c=r(e),s=c.length;if(s!=r(t).length&&!u)return!1;for(var f=s;f--;){var p=c[f];if(!(u?p in t:o.call(t,p)))return!1}var d=l.get(e),h=l.get(t);if(d&&h)return d==t&&h==e;var y=!0;l.set(e,t),l.set(t,e);for(var v=u;++f{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;e.exports=r},9395:(e,t,n)=>{var r=n(4262),o=n(9621),i=n(8673);e.exports=function(e){return r(e,i,o)}},2622:(e,t,n)=>{var r=n(705);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},3781:(e,t,n)=>{var r=n(9417),o=n(8673);e.exports=function(e){for(var t=o(e),n=t.length;n--;){var i=t[n],a=e[i];t[n]=[i,a,r(a)]}return t}},7937:(e,t,n)=>{var r=n(6954),o=n(4657);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},5990:(e,t,n)=>{var r=n(3028)(Object.getPrototypeOf,Object);e.exports=r},4552:(e,t,n)=>{var r=n(9812),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,l=r?r.toStringTag:void 0;e.exports=function(e){var t=i.call(e,l),n=e[l];try{e[l]=void 0;var r=!0}catch(u){}var o=a.call(e);return r&&(t?e[l]=n:delete e[l]),o}},9621:(e,t,n)=>{var r=n(7529),o=n(7828),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,l=a?function(e){return null==e?[]:(e=Object(e),r(a(e),(function(t){return i.call(e,t)})))}:o;e.exports=l},6924:(e,t,n)=>{var r=n(7685),o=n(5204),i=n(5387),a=n(2070),l=n(6600),u=n(6913),c=n(6996),s="[object Map]",f="[object Promise]",p="[object Set]",d="[object WeakMap]",h="[object DataView]",y=c(r),v=c(o),m=c(i),g=c(a),b=c(l),x=u;(r&&x(new r(new ArrayBuffer(1)))!=h||o&&x(new o)!=s||i&&x(i.resolve())!=f||a&&x(new a)!=p||l&&x(new l)!=d)&&(x=function(e){var t=u(e),n="[object Object]"==t?e.constructor:void 0,r=n?c(n):"";if(r)switch(r){case y:return h;case v:return s;case m:return f;case g:return p;case b:return d}return t}),e.exports=x},4657:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},9057:(e,t,n)=>{var r=n(5324),o=n(2777),i=n(4052),a=n(9194),l=n(6173),u=n(914);e.exports=function(e,t,n){for(var c=-1,s=(t=r(t,e)).length,f=!1;++c{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},7615:(e,t,n)=>{var r=n(5575);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},5051:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},2154:(e,t,n)=>{var r=n(5575),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return"__lodash_hash_undefined__"===n?void 0:n}return o.call(t,e)?t[e]:void 0}},8734:(e,t,n)=>{var r=n(5575),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:o.call(t,e)}},2662:(e,t,n)=>{var r=n(5575);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?"__lodash_hash_undefined__":t,this}},7116:(e,t,n)=>{var r=n(9812),o=n(2777),i=n(4052),a=r?r.isConcatSpreadable:void 0;e.exports=function(e){return i(e)||o(e)||!!(a&&e&&e[a])}},9194:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,n){var r=typeof e;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&t.test(e))&&e>-1&&e%1==0&&e1)for(var n,r,o,i=1,a=e[t[0]],l=a.length;i