Skip to content

Advance practice

1. Scenario

  • Create lambda can execute one of CRUD by Parameter passed from Payload.

2. Debugging

  1. After set breakpoint for the part you want in src/controller.js file, click on debug button

    Alt text

  2. Below the Run button and you can check the Payload part. When debugging, JSON created in this part can be through objRequestParam.

    Alt text

  3. Click on the Run button to start debugging.

    Alt text

  4. After confirming that the debugger has stopped at the breakpoint, enter this.objRequestParams in the debug console area to check if the value entered in the payload exists within the output object. Alt text

3. Creat source code

3.1. model

Paste following source in model/lambdaModel.js file

class MemberDataModel extends ApplicationLambdaBaseModel {
 constructor({ memberId, memberName, memberNo, memberDesc, activeFlag }) {
   super();
   this.memberId = memberId ? memberId : "";
   this.memberName = memberName ? memberName : "";
   this.memberNo = memberNo ? memberNo : "";
   this.memberDesc = memberDesc ? memberDesc : "";
   this.activeFlag = activeFlag ? activeFlag : "";
 }
}
exports.MemberDataModel = MemberDataModel;

3.2. src

controller.js
Paste the following source code in src/controller.js file.
Explanation of source is written in the comment part.

"use strict";
// Input required module in source 
const {
 BaseController,
 CompareUtility,
 calsLogger,
 ParameterNonExistException,
} = require("@cals-framework/lambda");
const Service = require("./service");


module.exports = class Controller extends BaseController {
 constructor({ event, context }) {
   super({ event, context });
   this.event = event;
   this.context = context;


   this.calsContext.serviceContext === undefined
     ? (this.clsService = new Service())
     : typeof this.calsContext.serviceContext !== "undefined"
     ? (this.calsContext.serviceContext = new Service())
     : (this.clsService = this.calsContext.serviceContext);
 }


 async process() {
   calsLogger.param(this.event, this.context);


   // Todo : validate parameter, check session  
   // Check operation value
   if (CompareUtility.isEmpty(this.objRequestParams.operation)) {
     throw new ParameterNonExistException("operation");
   }
   // run function based on operation value passed by payload
   switch (this.objRequestParams.operation) {
     case "i":
       // if operation value is I, run  memberInsert service
       // in case of insert, check required values such as memberId, memberName 
       if (CompareUtility.isEmpty(this.objRequestParams.memberId) 
           && CompareUtility.isEmpty(this.objRequestParams.memberName)) {
         throw new ParameterNonExistException("memberId or memberName");
       }
       this.objReturn = await clsService.memberInsert({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "u":
       // if operation value is u, run memberUpdateservice
       this.objReturn = await clsService.memberUpdate({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "s":
       // if operation value is s, run memberSelect service
       this.objReturn = await clsService.memberSelect({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "d":
       // if operation value is d, run memberDelete service
       // in case if delete, check required value such as memberId 
       if (CompareUtility.isEmpty(this.objRequestParams.memberId)) {
         throw new ParameterNonExistException("memberId");
       }
       this.objReturn = await clsService.memberDelete({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
   }


   calsLogger.result(this.objReturn);
   return this.objReturn;
 }
};

Service
Here is the memberInsert function of src/service.js Write the logic that needs to be performed in code.

 async memberInsert({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);


   // 1. Create member model
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);


   // 2. memberNo is current registered member Count + 1
   let objDAOReturn = await this.clsDAO.memberSelect({
     objDAOParams: objMemberDataModel,
     objReturn,
   });


   objMemberDataModel.memberNo = objDAOReturn.objReturn.data[0].count + 1;


   // 3. Insert Member 
   objDAOReturn = await this.clsDAO.memberInsert({
     objDAOParams: objMemberDataModel,
     objReturn,
   });


   // if the row for the memberInsert query is 0, it is considered as failed and will cause an error. 
   // if bIgnoreFlag of memberInsert in src/dao.js file is set as false, following error handling will be processed in the framework.  
   
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }


   calsLogger.result(objDAOReturn);


   return objDAOReturn.objReturn;
 }

memberUpdate function of src/service.js
Write the logic that needs to be performed in code.

 async memberUpdate({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);


   // 1. Create member model
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);


   // 2. Update member
   const objDAOReturn = await this.clsDAO.memberUpdate({
     objDAOParams: objMemberDataModel,
     objReturn,
   });


   // if update row for memberUpdate query is 0, it is considered as failed and cause error
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }


   calsLogger.result(objDAOReturn);


   return objDAOReturn.objReturn;
 }

Here is the memberSelect function of src/service.js
Write the logic that needs to be performed in code.

 async memberSelect({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);


   // 1. Create member model
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);


   // 2. Select member 
   const objDAOReturn = await this.clsDAO.memberSelect({
     objDAOParams: objMemberDataModel,
     objReturn,
   });


   calsLogger.result(objDAOReturn);


   return objDAOReturn.objReturn;
 }

memberDelete function of src/service.js
Write the logic that needs to be performed in code.

 async memberDelete({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);


   // 1. Create member model
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);


   // 2. Delete member
   const objDAOReturn = await this.clsDAO.memberDelete({
     objDAOParams: objMemberDataModel,
     objReturn,
   });


  // if the delete row for memberDelete query is 0, it is considered as failed and causes error. 
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }


   calsLogger.result(objDAOReturn);


   return objDAOReturn.objReturn;
 }

DAO
Here is the memberInsert function of src/dao.js
Write the logic to be executed by code.

 async memberInsert({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "insertMember",
     objParam: objDAOParams,
     objReturn: objReturn,
     // bIgnoreFlag is optional, default value is true.
     // bIgnoreFlag: true | false,
   };

   const objDAOReturn = await this.insert(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

Here is the memberUpdate function of src/dao.js
Write logic to be executed by code.

 async memberUpdate({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "updateMember",
     objParam: objDAOParams,
     objReturn: objReturn,
   };

   const objDAOReturn = await this.update(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

Here is the memberSelect function of src/dao.js Write logic to be executed by code.

 async memberSelect({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "selectMember",
     objParam: objDAOParams,
     objReturn: objReturn,
   };

   const objDAOReturn = await this.select(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

Here is the memberDelete function of src/dao.js Write logic to be executed by code.

async memberDelete({ objDAOParams, objReturn }) {
  calsLogger.param(objDAOParams);

  const objQueryInfo = {
    sQueryId: "deleteMember",
    objParam: objDAOParams,
    objReturn: objReturn,
  };

  const objDAOReturn = await this.delete(objQueryInfo);

  calsLogger.result(objDAOReturn);

  return objDAOReturn;
}

3.3 query

mysql.xml
It is an insertMember query of mysql/mysql.xm file. Write the logic to be executed by query

Use ${systemField} /${systemValue} to automate the handling for system fields provided in CALS platform.

<insert id="insertMember">
   INSERT INTO member
     (
           ${systemField}
         , MEM_ID
         , MEM_NAME
         , MEM_DESC
         , MEM_NO
         , ACTIVE_FLAG
     )
   VALUES
     (
           ${systemValue}
         , #{memberId} 
         , #{memberName}
         , #{memberDesc}
         , #{memberNo}
         , #{activeFlag}
     )
 </insert>

Here is the updateMember query of mysql/mysql.xm file. Write the logic to be executed by query

( Use ${systemField} /${systemValue} to automate the handling for system fields provided in CALS platform.)

<update id="updateMember">
   UPDATE member
   SET     ${systemValue}
           , MEM_NAME = #{memberName}
           , MEM_NO = #{memberNo}
           , MEM_DESC = #{memberDesc}
           , ACTIVE_FLAG = #{activeFlag}
   WHERE   MEM_ID          = #{memberId}
   AND     SYS_FLAG        = 1
 </update>

Here is the selectMember query of mysql/mysql.xm file.
Write the logic to be executed by query

( Use ${systemField} /${systemValue} to automate the handling for system fields provided in CALS platform.)

<select id="selectMember">
   SELECT
           count(0) as count
   FROM    member
   WHERE   1 = 1
   AND     ${systemValue}
   AND     SYS_FLAG = 1
 </select>

Here is the deleteMember query of mysql/mysql.xm file.
Write the logic to be executed by query

(In this example, a delete query is actually executed, but in the CALS common Lambda, logical deletion using SYS_FLAG is the standard practice. Unless there are specific requirements, logical deletion is recommended. The deletion condition level should preferably be set to the primary key (PK).)

<delete id="deleteMember">
    DELETE FROM member WHERE 1 = 1
    AND     MEM_ID = #{memberId}
 </delete>