diff options
| author | Daniel Andreas Wang <danielaw@relvokcor.xyz> | 2026-03-14 15:37:31 +0100 |
|---|---|---|
| committer | Daniel Andreas Wang <danielaw@relvokcor.xyz> | 2026-03-14 15:37:31 +0100 |
| commit | f4f6f490ab0bb1a2a06d660ce1b276a4fad9d2c2 (patch) | |
| tree | 9c9af5b4f49274fd1a62627b8879caf616d25a93 | |
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | backend/src/app.js | 10 | ||||
| -rw-r--r-- | backend/src/config/constants.js | 1 | ||||
| -rw-r--r-- | backend/src/config/database.js | 17 | ||||
| -rw-r--r-- | backend/src/controllers/user.controller.js | 33 | ||||
| -rw-r--r-- | backend/src/index.js | 27 | ||||
| -rw-r--r-- | backend/src/models/user.model.js | 32 | ||||
| -rw-r--r-- | backend/src/routes/user.route.js | 7 | ||||
| -rw-r--r-- | package.json | 19 |
9 files changed, 149 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fe20f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +package-lock.json
\ No newline at end of file diff --git a/backend/src/app.js b/backend/src/app.js new file mode 100644 index 0000000..ef74178 --- /dev/null +++ b/backend/src/app.js @@ -0,0 +1,10 @@ +import express from 'express' + +const app = express() +app.use(express.json()) + +import userRouter from './routes/user.route.js' + +app.use('/api/v1/users', userRouter) + +export default app
\ No newline at end of file diff --git a/backend/src/config/constants.js b/backend/src/config/constants.js new file mode 100644 index 0000000..d7f4ed1 --- /dev/null +++ b/backend/src/config/constants.js @@ -0,0 +1 @@ +export const DB_NAME = 'intro-to-backend';
\ No newline at end of file diff --git a/backend/src/config/database.js b/backend/src/config/database.js new file mode 100644 index 0000000..98ce0cc --- /dev/null +++ b/backend/src/config/database.js @@ -0,0 +1,17 @@ +import mongoose from "mongoose"; +import { DB_NAME } from './constants.js' + +const connectDB = async () => { + try { + const connectionInstance = await mongoose.connect( + `${process.env.MONGODB_URI}/${DB_NAME}`, + ); + console.log(`\nMongoDB connected successfully + ${connectionInstance.connection.host}`) + } catch (error) { + console.log("MongoDB connection failed", error) + process.exit(1) + } +} + +export default connectDB diff --git a/backend/src/controllers/user.controller.js b/backend/src/controllers/user.controller.js new file mode 100644 index 0000000..b5d2048 --- /dev/null +++ b/backend/src/controllers/user.controller.js @@ -0,0 +1,33 @@ +import { User } from '../models/user.model.js' + +const registerUser = async (req, res) => { + try { + const { username, email, password } = req.body + + if (!username || !email || !password) { + return res.status(400).json({ message: 'All fields are important!'}) + } + + const existing = await User.findOne({ email: email.toLowerCase() }) + if (existing) { + return res.status(400).json({ message: 'User already exists.'}) + } + + const user = await User.create({ + username, + email: email.toLowerCase(), + password, + }) + + res.status(201).json({ + message: 'User registered.', + user: { id: user._id, email: user.email, username: user.username } + }) + } catch (error) { + res.status(500).json({ message: 'Internal server error!', error: error.message }) + } +} + +export { + registerUser +} diff --git a/backend/src/index.js b/backend/src/index.js new file mode 100644 index 0000000..3dfe7a4 --- /dev/null +++ b/backend/src/index.js @@ -0,0 +1,27 @@ +import dotenv from "dotenv"; +import connectDB from "./config/database.js"; +import app from "./app.js"; + +dotenv.config({ + path: "./.env", +}); + +const PORT = process.env.PORT || 8000; + +const startServer = async () => { + try { + await connectDB(); + app.on('error', (error) => { + console.log('ERROR', error) + throw error + }) + + app.listen(PORT, () => { + console.log(`Server is running on port: ${PORT}`) + }) + } catch (error) { + console.log('Connection failed', error) + } +} + +startServer()
\ No newline at end of file diff --git a/backend/src/models/user.model.js b/backend/src/models/user.model.js new file mode 100644 index 0000000..6cb9476 --- /dev/null +++ b/backend/src/models/user.model.js @@ -0,0 +1,32 @@ +import mongoose, { Schema } from 'mongoose' + +const userSchema = new Schema( + { + username: { + type: String, + required: true, + unique: true, + lowercase: true, + trim: true, + minLength: 1, + maxLength: 30 + }, + + password: { + type: String, + required: true, + minLength: 8, + maxLength: 50 + }, + + email: { + type: String, + required: true, + unique: true, + lowercase: true, + trim: true, + } + } +) + +export const User = mongoose.model("User", userSchema)
\ No newline at end of file diff --git a/backend/src/routes/user.route.js b/backend/src/routes/user.route.js new file mode 100644 index 0000000..0765632 --- /dev/null +++ b/backend/src/routes/user.route.js @@ -0,0 +1,7 @@ +import { Router } from 'express' +import { registerUser } from '../controllers/user.controller.js' + +const router = Router() +router.route('/register').post(registerUser) + +export default router diff --git a/package.json b/package.json new file mode 100644 index 0000000..1932f22 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "intro-to-backend", + "version": "1.0.0", + "description": "backend tutorial", + "main": "index.js", + "type": "module", + "scripts": { + "start": "node backend/src/index.js", + "dev": "nodemon backend/src/index.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "dotenv": "^17.3.1", + "express": "^5.2.1", + "mongoose": "^9.3.0", + "nodemon": "^3.1.14" + } +} |
