import org.vertx.java.core.json.JsonObject; //导入方法依赖的package包/类
@Override
public void createBooking(final String resourceId, final JsonObject data, final UserInfos user,
final Handler> handler) {
SqlStatementsBuilder statementsBuilder = new SqlStatementsBuilder();
Object rId = parseId(resourceId);
// Upsert current user
statementsBuilder.prepared(UPSERT_USER_QUERY,
new JsonArray().add(user.getUserId()).add(user.getUsername()));
// Lock query to avoid race condition
statementsBuilder.raw(LOCK_BOOKING_QUERY);
// Insert query
StringBuilder query = new StringBuilder();
JsonArray values = new JsonArray();
Object newStartDate = data.getValue("start_date");
Object newEndDate = data.getValue("end_date");
query.append("INSERT INTO rbs.booking")
.append("(resource_id, owner, booking_reason, status, start_date, end_date)")
.append(" SELECT ?, ?, ?,");
values.add(rId)
.add(user.getUserId())
.add(data.getValue("booking_reason"));
// If validation is activated, the booking is created with status "created".
// Otherwise, it is created with status "validated".
// TODO V2 : la reservation doit etre automatiquement validee si le demandeur est valideur
query.append(" (SELECT CASE ")
.append( " WHEN (t.validation IS true) THEN ?")
.append( " ELSE ?")
.append( " END")
.append( " FROM rbs.resource_type AS t")
.append( " INNER JOIN rbs.resource AS r ON r.type_id = t.id")
.append( " WHERE r.id = ?),");
values.add(CREATED.status())
.add(VALIDATED.status())
.add(rId);
// Unix timestamps are converted into postgresql timestamps.
query.append(" to_timestamp(?), to_timestamp(?)");
values.add(newStartDate)
.add(newEndDate);
// Check that there does not exist a validated booking that overlaps the new booking.
query.append(" WHERE NOT EXISTS (")
.append("SELECT 1 FROM rbs.booking")
.append(" WHERE resource_id = ?")
.append(" AND status = ?")
.append(" AND (start_date, end_date) OVERLAPS (to_timestamp(?), to_timestamp(?))")
.append(") RETURNING id, status,")
.append(" to_char(start_date, '").append(DATE_FORMAT).append("') AS start_date,")
.append(" to_char(end_date, '").append(DATE_FORMAT).append("') AS end_date");
values.add(rId)
.add(VALIDATED.status())
.add(newStartDate)
.add(newEndDate);
statementsBuilder.prepared(query.toString(), values);
// Send queries to eventbus
Sql.getInstance().transaction(statementsBuilder.build(),
validUniqueResultHandler(2, handler));
}