From c3e035b50350834a51c9858abec18951884bfcbd Mon Sep 17 00:00:00 2001 From: Luis Gabriel Janco Date: Tue, 9 Aug 2022 23:15:55 -0400 Subject: [PATCH 1/3] feat: set connection with database --- db/utils/database.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 db/utils/database.js diff --git a/db/utils/database.js b/db/utils/database.js new file mode 100644 index 0000000..8e75161 --- /dev/null +++ b/db/utils/database.js @@ -0,0 +1,30 @@ +import { connect, connection } from 'mongoose' + +const { DB_USERNAME, DB_PASSWORD, DB_CLUSTER_NAME, DB_NAME } = process.env +const connectionString = `mongodb+srv://${DB_USERNAME}:${DB_PASSWORD}@${DB_CLUSTER_NAME}/${DB_NAME}?retryWrites=true&w=majority` + +if (connectionString === '') { + throw new Error('ConnectionString: Please define the process.env[variables] environment variable inside .env.local file') +} + +const conn = { + isConnected: false, +} + +export async function dbConnect() { + try { + if (conn.isConnected) return + const db = await connect(connectionString) + conn.isConnected = db.connections[0].readyState + } catch (error) { + console.error(error.message) + } +} + +connection.on('connected', () => { + console.log('MongoDB is connected') +}) + +connection.on('error', (error) => { + console.error(error.message) +}) From 369100f05a58dc7d4f00acf523afd2074194eb69 Mon Sep 17 00:00:00 2001 From: Luis Gabriel Janco Date: Tue, 9 Aug 2022 23:16:56 -0400 Subject: [PATCH 2/3] feat: setup models of schema for the collections --- db/models/File.js | 19 +++++++++++++++++++ db/models/Playground.js | 25 +++++++++++++++++++++++++ db/models/User.js | 26 ++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 db/models/File.js create mode 100644 db/models/Playground.js create mode 100644 db/models/User.js diff --git a/db/models/File.js b/db/models/File.js new file mode 100644 index 0000000..7c4fcac --- /dev/null +++ b/db/models/File.js @@ -0,0 +1,19 @@ +import { Schema, model, models } from 'mongoose' + +const fileSchema = new Schema({ + name: { + type: String, + trim: true, + required: true, + }, + content: { + type: String, + }, + playground_id: { + required: true, + type: Schema.Types.ObjectId, + ref: 'Playground' + } +}) + +export default models.File || model('File', fileSchema) diff --git a/db/models/Playground.js b/db/models/Playground.js new file mode 100644 index 0000000..e05bdbe --- /dev/null +++ b/db/models/Playground.js @@ -0,0 +1,25 @@ +import { Schema, model, models } from 'mongoose' + +const playgroundSchema = new Schema({ + language: { + type: String, + trim: true, + required: true, + }, + extension: { + type: String, + required: true, + trim: true, + }, + files: [{ + type: Schema.Types.ObjectId, + ref: 'File' + }], + user_id: { + required: true, + type: Schema.Types.ObjectId, + ref: 'User' + } +}, { timestamps: true, versionKey: false }) + +export default models.Playground || model('Playground', playgroundSchema) diff --git a/db/models/User.js b/db/models/User.js new file mode 100644 index 0000000..86324ca --- /dev/null +++ b/db/models/User.js @@ -0,0 +1,26 @@ +import { Schema, model, models } from 'mongoose' + +const userSchema = new Schema({ + username: { + type: String, + trim: true, + required: [true, 'Username is required'], + unique: true + }, + email: { + type: String, + trim: true, + required: true, + unique: true + }, + photoUrl: { + type: String, + trim: true, + }, + playgrounds: [{ + type: Schema.Types.ObjectId, + ref: 'Playground' + }] +}, { timestamps: true, versionKey: false }) + +export default models.User || model('User', userSchema) From 94785c11dda364975d3b72cd4961fc5efd8b58f3 Mon Sep 17 00:00:00 2001 From: Luis Gabriel Janco Date: Tue, 9 Aug 2022 23:17:49 -0400 Subject: [PATCH 3/3] feat: setup api endpoint with database --- pages/api/ping.js | 8 ++++++++ pages/api/user.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 pages/api/ping.js create mode 100644 pages/api/user.js diff --git a/pages/api/ping.js b/pages/api/ping.js new file mode 100644 index 0000000..6a75764 --- /dev/null +++ b/pages/api/ping.js @@ -0,0 +1,8 @@ +import { NextApiResponse, NextApiRequest } from 'next' +/** + * @param {NextApiRequest} req + * @param {NextApiResponse} res + */ +export default async function handler(req, res) { + res.status(200).json('pong') +} diff --git a/pages/api/user.js b/pages/api/user.js new file mode 100644 index 0000000..3c4b44f --- /dev/null +++ b/pages/api/user.js @@ -0,0 +1,29 @@ +import { dbConnect } from "db/utils/database" +import User from 'db/models/User' + +dbConnect() +/** + * @param {NextApiRequest} req + * @param {NextApiResponse} res + */ +export default async function handler(req, res) { + const { method } = req + + switch (method) { + case 'GET': + try { + const user = await User.find({}) + return res.status(200).json(user) + } catch (error) { + console.error(error) + } + case 'POST': + return res.status(200).json('posting files') + case 'UPDATE': + return res.status(200).json('updating file') + case 'DELETE': + return res.status(200).json('deleting file') + default: + return res.status(400).json('invalid method') + } +}