diff --git a/backend/src/api/controllers/campaigns.ts b/backend/src/api/controllers/campaigns.ts new file mode 100644 index 0000000..9a01c8d --- /dev/null +++ b/backend/src/api/controllers/campaigns.ts @@ -0,0 +1,37 @@ +import { RequestHandler } from "express"; +import { Campaign } from "../../db/campaign"; + +export const getMany: RequestHandler = async (req, res, next) => { + try { + const campaigns = await Campaign.find(); + + return res.json({ + ok: true, + data: campaigns, + }); + } catch (error) { + return next(error); + } +}; + +export const create: RequestHandler = async (req, res, next) => { + try { + const { name, contractAddress } = req.body; + if (!name || !contractAddress) { + throw new Error("Missing field(s)."); + } + + const campaign = new Campaign({ + name: req.body.name, + contractAddress: req.body.contractAddress, + }); + await campaign.save(); + + return res.json({ + ok: true, + data: campaign, + }); + } catch (error) { + return next(error); + } +}; diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 16d6ec3..15024a1 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -1,5 +1,6 @@ import cors from "cors"; -import express from "express"; +import express, { ErrorRequestHandler } from "express"; +import { campaignsRouter } from "./routes/campaigns"; import { testRouter } from "./routes/test"; export const api = express(); @@ -10,3 +11,14 @@ api.use(express.json()); // Routes api.use("/test", testRouter); +api.use("/campaigns", campaignsRouter); + +// Error Handler +const errorHandler: ErrorRequestHandler = (error, req, res, next) => { + console.error(error); + return res.json({ + ok: false, + error: error.message || "Something went wrong.", + }); +}; +api.use(errorHandler); diff --git a/backend/src/api/routes/campaigns.ts b/backend/src/api/routes/campaigns.ts new file mode 100644 index 0000000..c484fbd --- /dev/null +++ b/backend/src/api/routes/campaigns.ts @@ -0,0 +1,7 @@ +import express from "express"; +import * as controllers from "../controllers/campaigns"; + +export const campaignsRouter = express.Router(); + +campaignsRouter.route("/").get(controllers.getMany); +campaignsRouter.route("/").post(controllers.create); diff --git a/backend/src/db/campaign.ts b/backend/src/db/campaign.ts new file mode 100644 index 0000000..1795c75 --- /dev/null +++ b/backend/src/db/campaign.ts @@ -0,0 +1,19 @@ +import mongoose from "mongoose"; + +interface ICampaign { + name: string; + contractAddress: string; +} + +const campaignSchema = new mongoose.Schema({ + name: { + type: String, + required: true, + }, + contractAddress: { + type: String, + required: true, + }, +}); + +export const Campaign = mongoose.model("Campaign", campaignSchema);