Search code examples
node.jstypescriptexpresstypeormrestify

What is the best way to update different properties?


I'm building an API with Restify which is based on Express. I'm using Typeorm and I'm wondering what is the best way to update different properties which came from user input.

Essentially I have a route like this:

server.put('/users/:id', errorHandler(update));

which fire this method:

const update = async (req: Request, res: Response) => {
    const user = { ...req.body, id: req.params.id } as User;
    res.send(await userService.update(user));
}

as you can see I used the spread operator to create an User entity. Then, inside userService.update I have the following:

export const update = async (user: User): Promise<User> => {
    const repository = getRepository(User);
    const entity = await repository.findOne({ id: user.id });
    if (!entity) throw new errors.ResourceNotFoundError(`There is no user with id of ${user.id}`);

    Object.assign(entity, user, { id: entity.id, chat_id: entity.chat_id, project_id: entity.project_id, deleted: false });
    return await repository.save(entity);
}

as you can see, I want prevent that the data provided by the API consumer will replace some important properties like: id, chat_id, project_id, deleted, so I used the method Object.assign to achieve this.

Is this a good way? What do you suggest for improve this?


Solution

  • You can use update method of typeorm like this, it will partially update the values that you give as a second argument.

    // this will find a user with id ${user.id} and will only 
    // change the fields that is specified in the user object
    await repository.update(user.id, user);
    
    // check if updated for debugging 
    const updatedUser = await repository.findOne(user.id);
    console.log(updatedUser, null, 2) 
    

    If you want to create a new record of the existing user in db, then you only need to change it's id. To do that

    1. Deep clone the object so there will be another user object with new reference
    2. Remove id field from the deep cloned object and use insert afterwards
    // Deep clone user object
    const clonedUser = JSON.parse(JSON.stringify(user))
    // Delete id field from the deep clone 
    delete clonedUser.id;
    // create a new user with different id
    await repository.insert(clonedUser);