├── server.ts ├── routes └── products.routes.ts ├── README.md └── controllers └── index.controller.ts /server.ts: -------------------------------------------------------------------------------- 1 | import { Application } from "https://deno.land/x/oak/mod.ts"; 2 | import router from "./routes/products.routes.ts"; 3 | 4 | const app = new Application(); 5 | 6 | app.use(router.routes()); 7 | app.use(router.allowedMethods()); 8 | 9 | console.log("Server running on port", 3000); 10 | await app.listen({ port: 3000 }); 11 | -------------------------------------------------------------------------------- /routes/products.routes.ts: -------------------------------------------------------------------------------- 1 | import { Router, Response } from "https://deno.land/x/oak/mod.ts"; 2 | import * as indexCtrl from "../controllers/index.controller.ts"; 3 | 4 | const router = new Router(); 5 | 6 | router.get("/", ({ response }: { response: Response }) => { 7 | response.body = "Welcome to my API"; 8 | }); 9 | 10 | router 11 | .get("/users", indexCtrl.getUsers) 12 | .post("/users", indexCtrl.createUser) 13 | .get("/users/:id", indexCtrl.getUser) 14 | .put("/users/:id", indexCtrl.updateUser) 15 | .delete("/users/:id", indexCtrl.deleteUser); 16 | 17 | export default router; 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deno REST API 2 | A simple CRUD REST API example using Deno and Oak 3 | 4 | ## Run Locally 5 | ``` 6 | deno run --allow-net server.ts 7 | ``` 8 | 9 | ## Run by URL 10 | ``` 11 | deno run --allow-net https://raw.githubusercontent.com/FaztWeb/deno-oak-crud-restapi/master/server.ts 12 | ``` 13 | 14 | # Endpoints 15 | 16 | Get All users 17 | ``` 18 | GET /users 19 | ``` 20 | 21 | Get a single User by Id 22 | ``` 23 | GET /users/:id 24 | ``` 25 | 26 | Create a new User 27 | ``` 28 | POST /products 29 | ``` 30 | 31 | Update an existing User by Id 32 | ``` 33 | PUT /users/:id 34 | ``` 35 | 36 | Delete an existing User by Id 37 | ``` 38 | DELETE /users/:id 39 | ``` -------------------------------------------------------------------------------- /controllers/index.controller.ts: -------------------------------------------------------------------------------- 1 | import { Response, Request, Body } from "https://deno.land/x/oak/mod.ts"; 2 | import { v4 } from "https://deno.land/std/uuid/mod.ts"; 3 | 4 | interface User { 5 | id: string; 6 | name: string; 7 | } 8 | 9 | let users: User[] = [ 10 | { 11 | id: "1", 12 | name: "Ryan Ray", 13 | }, 14 | ]; 15 | 16 | export const getUsers = ({ response }: { response: Response }) => { 17 | response.body = { 18 | message: "Sucessful Query", 19 | users, 20 | }; 21 | }; 22 | 23 | export const getUser = ({ 24 | params, 25 | response, 26 | }: { 27 | params: { id: string }; 28 | response: Response; 29 | }) => { 30 | const userFound = users.find((user) => user.id === params.id); 31 | if (userFound) { 32 | response.status = 200; 33 | response.body = { 34 | message: "You got a single User", 35 | userFound, 36 | }; 37 | } else { 38 | response.status = 404; 39 | response.body = { 40 | message: "User Not Found", 41 | }; 42 | } 43 | }; 44 | 45 | export const createUser = async ({ 46 | request, 47 | response, 48 | }: { 49 | request: Request; 50 | response: Response; 51 | }) => { 52 | const body: Body = await request.body(); 53 | 54 | if (!request.hasBody) { 55 | response.status = 404; 56 | response.body = { 57 | message: "You need to provide data", 58 | }; 59 | } else { 60 | // Create the new Product 61 | const newUser = body.value; 62 | newUser.id = v4.generate(); 63 | 64 | // Add the new product to the list 65 | users.push(newUser); 66 | 67 | // respond to the client 68 | response.status = 200; 69 | response.body = { 70 | message: "New Product Created", 71 | newUser, 72 | }; 73 | } 74 | }; 75 | 76 | export const updateUser = async ({ 77 | params, 78 | request, 79 | response, 80 | }: { 81 | params: { id: string }; 82 | request: Request; 83 | response: Response; 84 | }) => { 85 | const userFound = users.find((user) => user.id === params.id); 86 | 87 | if (!userFound) { 88 | response.status = 404; 89 | response.body = { 90 | message: "User Not Found", 91 | }; 92 | } else { 93 | const body = await request.body(); 94 | const updatedProduct = body.value; 95 | 96 | users = users.map((user) => 97 | user.id === params.id ? { ...user, ...updatedProduct } : user 98 | ); 99 | 100 | response.status = 200; 101 | response.body = { 102 | users, 103 | }; 104 | } 105 | }; 106 | 107 | export const deleteUser = ({ 108 | params, 109 | response, 110 | }: { 111 | params: { id: string }; 112 | response: Response; 113 | }) => { 114 | users = users.filter((user) => user.id !== params.id); 115 | response.status = 200; 116 | response.body = { 117 | message: "User Deleted Successfully", 118 | users 119 | }; 120 | }; 121 | --------------------------------------------------------------------------------