changed contacts routes to typescript

This commit is contained in:
canove
2020-09-15 19:28:06 -03:00
parent 14d90a2dd4
commit b04c0b878e
21 changed files with 536 additions and 133 deletions

View File

@@ -0,0 +1,32 @@
import AppError from "../../errors/AppError";
import Contact from "../../models/Contact";
interface Request {
name: string;
number: string;
email?: string;
}
const CreateContactService = async ({
name,
number,
email
}: Request): Promise<Contact> => {
const numberExists = await Contact.findOne({
where: { number }
});
if (numberExists) {
throw new AppError("A contact with this number already exists.");
}
const contact = await Contact.create({
name,
number,
email
});
return contact;
};
export default CreateContactService;

View File

@@ -0,0 +1,16 @@
import Contact from "../../models/Contact";
import AppError from "../../errors/AppError";
const DeleteContactService = async (id: string): Promise<void> => {
const contact = await Contact.findOne({
where: { id }
});
if (!contact) {
throw new AppError("No contact found with this ID.", 404);
}
await contact.destroy();
};
export default DeleteContactService;

View File

@@ -0,0 +1,50 @@
import { Sequelize, Op } from "sequelize";
import Contact from "../../models/Contact";
interface Request {
searchParam?: string;
pageNumber?: string;
}
interface Response {
contacts: Contact[];
count: number;
hasMore: boolean;
}
const ListContactsService = async ({
searchParam = "",
pageNumber = "1"
}: Request): Promise<Response> => {
const whereCondition = {
[Op.or]: [
{
name: Sequelize.where(
Sequelize.fn("LOWER", Sequelize.col("name")),
"LIKE",
`%${searchParam.toLowerCase()}%`
)
},
{ number: { [Op.like]: `%${searchParam}%` } }
]
};
const limit = 20;
const offset = limit * (+pageNumber - 1);
const { count, rows: contacts } = await Contact.findAndCountAll({
where: whereCondition,
limit,
offset,
order: [["createdAt", "DESC"]]
});
const hasMore = count > offset + contacts.length;
return {
contacts,
count,
hasMore
};
};
export default ListContactsService;

View File

@@ -0,0 +1,17 @@
import Contact from "../../models/Contact";
import AppError from "../../errors/AppError";
const ShowContactService = async (id: string): Promise<Contact> => {
const user = await Contact.findOne({
where: { id },
attributes: ["id", "name", "number", "email"]
});
if (!user) {
throw new AppError("No contact found with this ID.", 404);
}
return user;
};
export default ShowContactService;

View File

@@ -0,0 +1,39 @@
import AppError from "../../errors/AppError";
import Contact from "../../models/Contact";
interface ContactData {
email?: string;
number?: string;
name?: string;
}
interface Request {
contactData: ContactData;
contactId: string;
}
const UpdateContactService = async ({
contactData,
contactId
}: Request): Promise<Contact> => {
const { email, name, number } = contactData;
const contact = await Contact.findOne({
where: { id: contactId },
attributes: ["id", "name", "number", "email"]
});
if (!contact) {
throw new AppError("No contact found with this ID.", 404);
}
await contact.update({
name,
number,
email
});
return contact;
};
export default UpdateContactService;