July 19, 2016

Xây dựng ứng dụng API với NodeJS - Phần 2.3: CRUD - Update

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Tiếp theo những phần trước, bài này sẽ đi tới phần Update trong CRUD. Để minh họa, mình sẽ viết tiếp phần login vừa rồi, sau khi login sẽ cập nhật thông tin "last_logged_in" chính là ngày hiện hành. Bây giờ chúng ta sẽ sửa lại phương thức login của tập tin user.js trong thư mục app/services như sau:
login: function (email, password, cb) {
      var isSuccessful = true;
      User
        .findOne({
          where: {email: email}
        })
        .then(function (instance) {
          if (!instance) {
            return cb(null, false);
          }
          var user = _.clone(instance.dataValues);
          if (user.password !== password) {
            isSuccessful = false;
            return;
          }
          instance.last_logged_in = sequelize.fn('NOW');
          return instance.save({silent: true});
        })
        .then(function () {
          return cb(null, isSuccessful);
        })
        .catch(function (error) {
          return cb(error);
        });
    }


Ở đây, chúng ta dùng một biến isSuccessful để kiểm soát việc login thành công hay không, và dùng phương thức save() của instance. Thêm một điểm nữa là mình dùng sequelize.fn('NOW'), điều này căn bản là nó sẽ gọi những hàm của hệ CSDL thực hiện giúp cho bạn. Bạn nên nhớ, chúng ta đang dùng Sequelize - thư viện ORM trên nền NodeJS nên hãy tận dụng tốt nhất có thể những tính năng mà ORM mang đến nói chung và Sequelize nói riêng.

Căn bản câu lệnh trên sẽ phát sinh một SQL tương tự như sau:
UPDATE `users` SET `last_logged_in`=NOW() WHERE `id` = 1

Những phần còn lại, chúng ta không cần thay đổi gì, bây giờ bạn hãy thử "login" lại lần nữa, và hãy nhớ thử login thành công, rồi quay vào database kiểm tra dòng user mà bạn dùng login, sẽ thấy trạng thái "last_logged_in" đã được thay đổi.

Xây dựng API cập nhật thông tin user

Để minh họa cho việc xây dựng API cập nhật thông tin user, mình chỉ làm một phần, phần còn lại các bạn dựa vào những gì mình minh họa mà làm tiếp. Ở đây, mình sẽ thực hiện việc thay đổi mật khẩu (password), và mình chỉ hiện một cách đơn giản nhất (mình sẽ cập nhật cách bảo mật mật khẩu trong những phần tiếp theo của loạt bài này)

Bây giờ, chúng ta sẽ thêm một phương thức giúp cập nhật mật khẩu, như bên dưới:
changePassword: function (email, oldPassword, newPassword, cb) {
      var service = this;
      service.login(email, oldPassword, function (error, isSuccessful) {
        if (error) {
          return cb(error);
        }
        if (!isSuccessful) {
          return cb(new Error('Cannot change password'));
        }
        User
          .update({password: newPassword}, {where: {email: email}})
          .then(function () {
            return cb(null, true);
          })
          .catch(function (error) {
            return cb(error);
          });
      });
    }

Tiếp theo, chúng ta thêm một router để nhận thông tin cập nhật mật khẩu cho user. Ở đây, mọi người nên lưu ý là chúng ta sẽ sử dụng phương thức PUT để đúng ý nghĩa trong RESTful như bên dưới:
router.put('/change-password', function (req, res, next) {

  var email = req.body.email,
    oldPassword = req.body.old_password,
    newPassword = req.body.new_password;

  if (!email || !validator.isEmail(email)) {
    var error = new Error('Email is required or is invalid email format');
    error.status = 400;
    return next(error);
  }

  if (!oldPassword || !newPassword) {
    var error = new Error('Password is required');
    error.status = 400;
    return next(error);
  }

  userService.changePassword(email, oldPassword, newPassword, function(error, isSuccess){
    if (error) {
      return next(error);
    }
    return res.json({message: isSuccess ? "Successful" : "Fail"});
  });

});

Như vậy là xong, hãy thử tiến hành thí nghiệm nó để cảm nhận thành quả làm nãy giờ, và cách mình tiếp cận đơn giản hiện giờ là dùng CURL như những bài trước.
curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'email=abc@demo.com&old_password=111111&new_password=123456' "http://localhost:3000/user/change-password"

Xây dựng ứng dụng API với NodeJS - Phần 2.1: CRUD - Create
Xây dựng ứng dụng API với NodeJS - Phần 2.2: CRUD - Read

source:

git clone https://github.com/tmquang6805/api-express-tut-demo.git api_tut
cd api_tut
git checkout 663d2d7

No comments:

Post a Comment