Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"env": {
"commonjs": true,
"es2021": true,
"node": true,
"jest": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest"
},
"rules": {
}
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
34 changes: 34 additions & 0 deletions api/friends/friends-model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

const db = require('../../data/db-config')

const getAll = () => {
return db('friends');
}

const getById = async (friend_id) => {
const friend = await db('friends')
.where({ friend_id })
.first()
return friend
}

const remove = async (friend_id) => {
const deletedFriend = await db('friends')
.where({ friend_id })
.del()
return deletedFriend
}

const add = async (friend) => {
const [id] = await db('friends')
.insert(friend)
return getById(id)
}


module.exports = {
getAll,
getById,
remove,
add
}
54 changes: 54 additions & 0 deletions api/friends/friends-router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const router = require("express").Router();
const Friends = require("./friends-model");

router.get("/", (req, res) => {
Friends.getAll()
.then((friends) => {
res.json(friends);
})
.catch((err) => {
res.status(500).json({
message: "Something went wrong when fetching friends",
error: err,
});
});
});

router.get("/:friend_id", async (req, res) => {
try {
const friend = await Friends.getById(req.params.friend_id);
res.json(friend);
} catch (err) {
res.status(500).json({
message: `Something went wrong when fetching friend with id: ${req.params.friend_id}`,
error: err,
});
}
});

router.delete("/:friend_id", async (req, res) => {
try {
const deletedFriend = await Friends.getById(req.params.friend_id);
await Friends.remove(req.params.friend_id);
res.json(deletedFriend);
} catch (err) {
res.status(500).json({
message: `Something went wrong when fetching friend with id: ${req.params.friend_id}`,
error: err,
});
}
});

router.post("/", async (req, res) => {
try {
const newFriend = await Friends.add(req.body);
res.status(201).json(newFriend);
} catch (err) {
res.status(500).json({
message: `Something went wrong when fetching friend with id: ${req.params.friend_id}`,
error: err,
});
}
});

module.exports = router;
17 changes: 17 additions & 0 deletions api/friends/friends.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const Friend = require('../friends/friends-model')
const db = require('../../data/db-config')

beforeAll(async () => {
await db.migrate.rollback()
await db.migrate.latest()
})
beforeEach(async () => {
await db.seed.run()
})

describe('getAll', () => {
test('returns all friends in the database', async () => {
const friends = await Friend.getAll()
expect(friends).toHaveLength(3)
})
})
12 changes: 12 additions & 0 deletions api/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const express = require('express')
const server = express();
const friendsRouter = require('./friends/friends-router')

server.use(express.json())
server.use('/api/friends', friendsRouter)

server.get('/', (req, res) => {
res.json({ api: 'running'})
})

module.exports = server
45 changes: 45 additions & 0 deletions api/server.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
const db = require('../data/db-config')
const request = require('supertest')
const server = require('./server')

beforeAll(async () => {
await db.migrate.rollback()
await db.migrate.latest()
})
beforeEach(async () => {
await db.seed.run()
})

describe('[GET] /api/friends', () => {
test('responds with friends list', async () => {
const res = await request(server).get('/api/friends')
expect(res.body).toHaveLength(3)
})
test('responds with OK 200', async () => {
const res = await request(server).get('/api/friends')
expect(res.status).toBe(200)
})
})

describe('[GET] /api/friends/:friend_id', () => {
test('responds with given friend', async () => {
const friend = { friend_name: "Isaac" }
const res = await request(server).get('/api/friends/1')
expect(res.body).toMatchObject(friend)
})
})

describe('[POST] /api/friends', () => {
test('adds friend to the database', async () => {
const newFriend = { friend_id: 4, friend_name: "Brooke" }
await request(server).post('/api/friends').send(newFriend)
expect(await db('friends')).toHaveLength(4)
})
})

describe('[DELETE] /api/friends/:friend_id', () => {
test('removes friend from the database', async () => {
await request(server).delete('/api/friends/1')
expect(await db('friends')).toHaveLength(2)
})
})
7 changes: 7 additions & 0 deletions data/db-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const knex = require('knex')

const config = require('../knexfile.js')

const environment = process.env.NODE_ENV || "development"

module.exports = knex(config[environment])
Binary file added data/friends.db3
Binary file not shown.
20 changes: 20 additions & 0 deletions data/migrations/20240430020000_friends.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = function(knex) {
return knex.schema.createTable('friends', tbl => {
tbl.increments('friend_id')
tbl.string('friend_name')
.unique()
.notNullable()
})
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = function(knex) {
return knex.schema.dropTableIfExists('friends')
};
13 changes: 13 additions & 0 deletions data/seeds/01-friends.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.seed = async function(knex) {
// Deletes ALL existing entries
await knex('friends').truncate()
await knex('friends').insert([
{friend_name: 'Isaac'},
{friend_name: 'Bransen'},
{friend_name: 'Derek'}
]);
};
Binary file added data/test.db3
Binary file not shown.
8 changes: 8 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
require('dotenv').config()

const server = require('./api/server')
const port = process.env.PORT || 9000

server.listen(port, () => {
console.log(`server is listening on port ${port}`);
})
34 changes: 34 additions & 0 deletions knexfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Update with your config settings.

/**
* @type { Object.<string, import("knex").Knex.Config> }
*
*/

const common = {
client: 'sqlite3',
useNullAsDefault: true,
migrations: { directory: './data/migrations'},
seeds: { directory: './data/seeds'}
}

module.exports = {

development: {
...common,
connection: {
filename: './data/friends.db3'
}
},

testing: {
...common,
connection: {
filename: './data/test.db3',
},
},
production: {

}

};
Loading