Trong bài toán phát triển dịch vụ Web, ngoài các vấn đề cơ bản là đăng ký tài khoản và xác thực người dùng. Thì một vấn đề quan trọng là phát triển và quản lý dịch vụ Web của mình như thế nào? Trong bài này tôi chỉ nêu ý tưởng về thiết kế ứng dụng và sơ lược về kĩ thuật thực hiện. Có thể bạn sẽ cần tìm hiểu thêm nhiều nguồn nữa để hoàn thiện dự án của mình. 😀

Mục đích của bài này, hướng tới cho các bạn có ý tưởng tận dụng các hàm mặc định mà Sails đã định nghĩa sẵn, 1 vòng đời của Model/API, ví dụ như: beforeValidate, afterValidate, beforeCreate, afterCreate.

phòng khám online

Tôi giả sử là bạn đang xây dựng dịch vụ Web phòng khám online, hỗ trợ các bác sỹ khám và chẩn đoán bệnh qua nền tảng Web. Qua đấy bạn có thể thấy được việc quản lý Phòng khám là rất quan trọng. Làm thế nào để liên kết phòng khám với tài khoản của bác sỹ?

Trước khi vọc bài này, nếu bạn chưa biết cách tạo trang đăng ký và đăng nhập tài khoản người dùng thì hãy đọc bài hướng dẫn này tại đây:

Tự động tạo 1 phòng khám khi đăng ký tài khoản

Rõ ràng là khi đăng ký tài khoản, sau đó bác sỹ cần có 1 phòng khám để có thể trực tuyến và hỗ trợ tư vấn, chẩn đoán cho bệnh nhân. Vậy bạn làm thế nào ?

Chắc chắn bạn không muốn người dùng mất công tạo thêm 1 bước tạo phòng nữa, hãy tạo 1 phòng mặc định khi tài khoản được tạo thành công. 2 bước cần phải làm là 1) là tạo tài khoản. 2) là tạo phòng khám.

Trong Sails.js v0.10.x bạn thêm đoạn mã tạo phòng mặc định trong hàm afterCreate như sau đây:

/**
 * User
 *
 * @module      :: Model
 * @description :: A short summary of how this model works and what it represents.
 *
 */
var bcrypt = require('bcryptjs')
  , debug = require('debug')
  ;
  
module.exports = {
  
  attributes: {
    username: {
      type: 'string',
      required: true,
      unique: true
    },
    password: {
      type: 'string',
      required: true
    },
    toJSON: function() {
      var obj = this.toObject();
      delete obj.password;
      return obj;
    }
  },
  
  beforeCreate: function(user, cb) {
    bcrypt.genSalt(10, function(err, salt) {
      bcrypt.hash(user.password, salt, function(err, hash) {
        if (err) {
          console.log(err);
          cb(err);
        }else{
          user.password = hash;
          cb(null, user);
        }
      });
    });
  },

 afterCreate: function (user, cb) {
    // Create default ROOM(id == username)
    debug('User afterCreate: ', user);
    debug('Create default room: ' + user.username);

    Room.create({
      creator: user
      , room_url: user.username
    }).exec(function (err, room) {
      debug("Create room done: " + err);
      if(err) return cb(err);

      cb(null, user);
    })

  }
  
};

Trong đó, api Room được tạo ra bởi lệnh sau:

sails generate api room

2 file mới sẽ được sinh ra tại api/controllers/RoomController.jsapi/models/Room.js. Với file RoomController.js thì ta để mặc định, hiện tại là không thêm nếm, sửa chữa gì cả. Mà hãy định nghĩa model Room như sau:

/**
 * Room.js
 *
 * @description :: Room Model
 * @docs        :: http://meetingui.com/help
 */

module.exports = {

  attributes: {
    room_name: {
      type: "string",
      defaultsTo: "Default",
      size: 255
    }
    , room_url: {
      type: "string",
      unique: true,
      required: true
    }
    , room_type: {
      type: "string",
      defaultsTo: "11", // 11-1N-NM
      required: false
    }
    , announcement: {
      type: "string"
    }
    , backgroundImage: {
        type: "string"
    }
    , opening_hours: {
      type: "datetime"
    }
    , closing_hours: {
      type: "datetime"
    }
    , creator: {
      model: "user",
      required: true
    }
  }
};

Về việc test các api vừa tạo, bạn có thể cài đặt extension trên Chrome để thực hiện gọi các request Restful. Bạn có thể cài đặt extension này tại đây: Postman – REST Client

Cấu hình Routing

Sau khi tạo API (model, controller) xong xuôi và bạn cần phải gom nhóm các API này theo đoạn prefix trên đường dẫn. Ví dụ: http://phongkhamonline.com/api/room
Để làm việc này bạn chỉ cần cấu hình giá trị prefix: "/api", trong file config/blueprints.js là xong.

Liên kết tham khảo

About The Author