Bladeren bron

SQLite database. App model and controller

unknown 4 jaren geleden
bovenliggende
commit
2acc3b72ec
11 gewijzigde bestanden met toevoegingen van 875 en 25 verwijderingen
  1. 2 1
      .gitignore
  2. 79 0
      controllers/apps.js
  3. 25 0
      db.js
  4. 17 0
      middleware/asyncWrapper.js
  5. 15 0
      middleware/errorHandler.js
  6. 20 0
      models/App.js
  7. 666 21
      package-lock.json
  8. 4 1
      package.json
  9. 23 0
      routes/apps.js
  10. 16 2
      server.js
  11. 8 0
      utils/ErrorResponse.js

+ 2 - 1
.gitignore

@@ -1,2 +1,3 @@
 node_modules/
 node_modules/
-.env
+.env
+*.sqlite

+ 79 - 0
controllers/apps.js

@@ -0,0 +1,79 @@
+const asyncWrapper = require('../middleware/asyncWrapper');
+const ErrorResponse = require('../utils/ErrorResponse');
+const App = require('../models/App');
+
+// @desc      Create new app
+// @route     POST /api/apps
+// @access    Public
+exports.createApp = asyncWrapper(async (req, res, next) => {
+  const app = await App.create(req.body);
+
+  res.status(201).json({
+    success: true,
+    data: app
+  })
+})
+
+// @desc      Get all apps
+// @route     GET /api/apps
+// @access    Public
+exports.getApps = asyncWrapper(async (req, res, next) => {
+  const apps = await App.findAll();
+
+  res.status(200).json({
+    success: true,
+    data: apps
+  })
+})
+
+// @desc      Get single app
+// @route     GET /api/apps/:id
+// @access    Public
+exports.getApp = asyncWrapper(async (req, res, next) => {
+  const app = await App.findOne({
+    where: { id: req.params.id }
+  });
+
+  if (!app) {
+    return next(new ErrorResponse(`App with id of ${req.params.id} was not found`, 404));
+  }
+
+  res.status(200).json({
+    success: true,
+    data: app
+  })
+})
+
+// @desc      Update app
+// @route     PUT /api/apps/:id
+// @access    Public
+exports.updateApp = asyncWrapper(async (req, res, next) => {
+  let app = await App.findOne({
+    where: { id: req.params.id }
+  });
+
+  if (!app) {
+    return next(new ErrorResponse(`App with id of ${req.params.id} was not found`, 404));
+  }
+
+  app = await app.update({ ...req.body });
+
+  res.status(200).json({
+    success: true,
+    data: app
+  })
+})
+
+// @desc      Delete app
+// @route     DELETE /api/apps/:id
+// @access    Public
+exports.deleteApp = asyncWrapper(async (req, res, next) => {
+  await App.destroy({
+    where: { id: req.params.id }
+  })
+
+  res.status(200).json({
+    success: true,
+    data: {}
+  })
+})

+ 25 - 0
db.js

@@ -0,0 +1,25 @@
+const { Sequelize } = require('sequelize');
+
+const sequelize = new Sequelize({
+  dialect: 'sqlite',
+  storage: './db.sqlite'
+});
+
+const connectDB = async () => {
+  try {
+    await sequelize.authenticate({ logging: false });
+    console.log('Connected to database'.cyan.underline);
+    await sequelize.sync({
+      // alter: true,
+      logging: false
+    });
+    console.log('All models were synced'.cyan.underline);
+  } catch (error) {
+    console.error('Unable to connect to the database:', error);
+  }
+}
+
+module.exports = {
+  connectDB,
+  sequelize
+};

+ 17 - 0
middleware/asyncWrapper.js

@@ -0,0 +1,17 @@
+// const asyncWrapper = foo => (req, res, next) => {
+//   return Promise
+//     .resolve(foo(req, res, next))
+//     .catch(next);
+// }
+
+// module.exports = asyncWrapper;
+
+function asyncWrapper(foo) {
+  return function (req, res, next) {
+    return Promise
+      .resolve(foo(req, res, next))
+      .catch(next);
+  }
+}
+
+module.exports = asyncWrapper;

+ 15 - 0
middleware/errorHandler.js

@@ -0,0 +1,15 @@
+const ErrorResponse = require('../utils/ErrorResponse');
+
+const errorHandler = (err, req, res, next) => {
+  let error = { ...err };
+  error.message = err.message;
+
+  console.log(err);
+
+  res.status(err.statusCode || 500).json({
+    success: false,
+    error: error.message || 'Server Error'
+  })
+}
+
+module.exports = errorHandler;

+ 20 - 0
models/App.js

@@ -0,0 +1,20 @@
+const { Sequelize, DataTypes } = require('sequelize');
+const { sequelize } = require('../db');
+
+const App = sequelize.define('App', {
+  name: {
+    type: DataTypes.STRING,
+    allowNull: false
+  },
+  url: {
+    type: DataTypes.STRING,
+    allowNull: false
+  },
+  icon: {
+    type: DataTypes.STRING,
+    allowNull: false,
+    defaultValue: 'cancel'
+  }
+});
+
+module.exports = App;

File diff suppressed because it is too large
+ 666 - 21
package-lock.json


+ 4 - 1
package.json

@@ -13,9 +13,12 @@
   "license": "ISC",
   "license": "ISC",
   "dependencies": {
   "dependencies": {
     "@types/express": "^4.17.11",
     "@types/express": "^4.17.11",
+    "colors": "^1.4.0",
     "concurrently": "^6.0.2",
     "concurrently": "^6.0.2",
     "dotenv": "^9.0.0",
     "dotenv": "^9.0.0",
-    "express": "^4.17.1"
+    "express": "^4.17.1",
+    "sequelize": "^6.6.2",
+    "sqlite3": "^5.0.2"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "nodemon": "^2.0.7"
     "nodemon": "^2.0.7"

+ 23 - 0
routes/apps.js

@@ -0,0 +1,23 @@
+const express = require('express');
+const router = express.Router();
+
+const {
+  createApp,
+  getApps,
+  getApp,
+  updateApp,
+  deleteApp
+} = require('../controllers/apps');
+
+router
+  .route('/')
+  .post(createApp)
+  .get(getApps);
+
+router
+  .route('/:id')
+  .get(getApp)
+  .put(updateApp)
+  .delete(deleteApp);
+
+module.exports = router;

+ 16 - 2
server.js

@@ -1,13 +1,27 @@
 const express = require('express');
 const express = require('express');
+const { connectDB } = require('./db');
+const errorHandler = require('./middleware/errorHandler');
+const colors = require('colors');
 require('dotenv').config();
 require('dotenv').config();
 
 
+connectDB();
+
 const app = express();
 const app = express();
 const PORT = process.env.PORT || 5005;
 const PORT = process.env.PORT || 5005;
 
 
 app.get('/', (req, res) => {
 app.get('/', (req, res) => {
-  res.send('hello');
+  res.send('Server is working');
 })
 })
 
 
+// Body parser
+app.use(express.json());
+
+// Link controllers with routes
+app.use('/api/apps', require('./routes/apps'));
+
+// Custom error handler
+app.use(errorHandler);
+
 app.listen(PORT, () => {
 app.listen(PORT, () => {
-  console.log(`Server is running on port ${PORT}`);
+  console.log(`Server is running on port ${PORT} in ${process.env.NODE_ENV} mode`.yellow.bold);
 })
 })

+ 8 - 0
utils/ErrorResponse.js

@@ -0,0 +1,8 @@
+class ErrorResponse extends Error {
+  constructor(message, statusCode) {
+    super(message);
+    this.statusCode = statusCode
+  }
+}
+
+module.exports = ErrorResponse;

Some files were not shown because too many files changed in this diff