This repository has been archived by the owner on Oct 5, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 23
/
hotel_reservation_service.bal
118 lines (106 loc) · 3.79 KB
/
hotel_reservation_service.bal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (c) 2018 WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
//
// WSO2 Inc. licenses this file to you under the Apache License,
// Version 2.0 (the "License"); you may not use this file except
// in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import ballerina/http;
import ballerina/log;
//import ballerinax/docker;
//import ballerinax/kubernetes;
//@docker:Config {
// registry:"ballerina.guides.io",
// name:"hotel_reservation_service",
// tag:"v1.0"
//}
//
//@docker:Expose{}
//@kubernetes:Ingress {
// hostname:"ballerina.guides.io",
// name:"ballerina-guides-hotel-reservation-service",
// path:"/"
//}
//
//@kubernetes:Service {
// serviceType:"NodePort",
// name:"ballerina-guides-hotel-reservation-service"
//}
//
//@kubernetes:Deployment {
// image:"ballerina.guides.io/hotel_reservation_service:v1.0",
// name:"ballerina-guides-hotel-reservation-service"
//}
// Service endpoint
listener http:Listener hotelEP = new (9092);
// Available room types
const AC = "AIR CONDITIONED";
const NORMAL = "NORMAL";
// Hotel reservation service to reserve hotel rooms
@http:ServiceConfig {
basePath: "/hotel"
}
service hotelReservationService on hotelEP {
// Resource to reserve a room
@http:ResourceConfig {
methods: ["POST"],
path: "/reserve",
consumes: ["application/json"],
produces: ["application/json"]
}
resource function reserveRoom(http:Caller caller, http:Request request) {
http:Response response = new;
json reqPayload = {};
var payload = request.getJsonPayload();
// Try parsing the JSON payload from the request
if (payload is json) {
// Valid JSON payload
reqPayload = payload;
} else {
// NOT a valid JSON payload
response.statusCode = 400;
response.setJsonPayload({"Message": "Invalid payload - Not a valid JSON payload"});
var result = caller->respond(response);
handleError(result);
return;
}
json | error name = reqPayload.Name;
json | error arrivalDate = reqPayload.ArrivalDate;
json | error departDate = reqPayload.DepartureDate;
json | error preferredRoomType = reqPayload.Preference;
// If payload parsing fails, send a "Bad Request" message as the response
if (name is error || arrivalDate is error || departDate is error || preferredRoomType is error) {
response.statusCode = 400;
response.setJsonPayload({"Message": "Bad Request - Invalid Payload"});
var result = caller->respond(response);
handleError(result);
return;
}
// Mock logic
// If request is for an available room type, send a reservation successful status
string preferredTypeStr = preferredRoomType.toString();
if (preferredTypeStr.toUpperAscii() == AC || preferredTypeStr.toUpperAscii() == NORMAL) {
response.setJsonPayload({"Status": "Success"});
}
else {
// If request is not for an available room type, send a reservation failure status
response.setJsonPayload({"Status": "Failed"});
}
// Send the response
var result = caller->respond(response);
handleError(result);
}
}
function handleError(error? result) {
if (result is error) {
log:printError(result.reason(), err = result);
}
}