Advance practice
1. Scenario
- Create lambda can execute one of
CRUD
byParameter
passed fromPayload
.
2. Debugging
After set breakpoint for the part you want in
src/controller.js
file, click ondebug
buttonBelow the
Run
button and you can check thePayload
part. When debugging,JSON
created in this part can be throughobjRequestParam
.Click on the
Run
button to start debugging.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 thepayload
exists within the output object.
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>