Skip to content

Commit

Permalink
add REST controller for CRUD functionality of Ocpp Tags (#910)
Browse files Browse the repository at this point in the history
  • Loading branch information
goekay committed Sep 17, 2022
1 parent 7d589ea commit e340739
Show file tree
Hide file tree
Showing 4 changed files with 217 additions and 9 deletions.
17 changes: 14 additions & 3 deletions src/main/java/de/rwth/idsg/steve/repository/dto/OcppTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,20 @@ public final class OcppTag {
@Builder
@ToString
public static final class Overview {
private final Integer ocppTagPk, parentOcppTagPk;
private final String idTag, parentIdTag, expiryDateFormatted;
private final boolean inTransaction, blocked;
private final Integer ocppTagPk;
private final String idTag;

private final Integer parentOcppTagPk;
private final String parentIdTag;

private final boolean inTransaction;
private final boolean blocked;

private final String expiryDateFormatted;
private final DateTime expiryDate;

private final Integer maxActiveTransactionCount;
private final Long activeTransactionCount;
private final String note;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.joda.time.DateTime;
import org.jooq.DSLContext;
import org.jooq.JoinType;
import org.jooq.Record10;
import org.jooq.Record7;
import org.jooq.RecordMapper;
import org.jooq.Result;
Expand Down Expand Up @@ -78,11 +79,18 @@ public List<Overview> getOverview(OcppTagQueryForm form) {
OCPP_TAG_ACTIVITY.PARENT_ID_TAG,
OCPP_TAG_ACTIVITY.EXPIRY_DATE,
OCPP_TAG_ACTIVITY.IN_TRANSACTION,
OCPP_TAG_ACTIVITY.BLOCKED
OCPP_TAG_ACTIVITY.BLOCKED,
OCPP_TAG_ACTIVITY.MAX_ACTIVE_TRANSACTION_COUNT,
OCPP_TAG_ACTIVITY.ACTIVE_TRANSACTION_COUNT,
OCPP_TAG_ACTIVITY.NOTE
);

selectQuery.addJoin(parentTable, JoinType.LEFT_OUTER_JOIN, parentTable.ID_TAG.eq(OCPP_TAG_ACTIVITY.PARENT_ID_TAG));

if (form.isOcppTagPkSet()) {
selectQuery.addConditions(OCPP_TAG_ACTIVITY.OCPP_TAG_PK.eq(form.getOcppTagPk()));
}

if (form.isIdTagSet()) {
selectQuery.addConditions(OCPP_TAG_ACTIVITY.ID_TAG.eq(form.getIdTag()));
}
Expand Down Expand Up @@ -243,9 +251,9 @@ private void processBooleanType(SelectQuery selectQuery,
}

private static class UserMapper
implements RecordMapper<Record7<Integer, Integer, String, String, DateTime, Boolean, Boolean>, Overview> {
implements RecordMapper<Record10<Integer, Integer, String, String, DateTime, Boolean, Boolean, Integer, Long, String>, Overview> {
@Override
public Overview map(Record7<Integer, Integer, String, String, DateTime, Boolean, Boolean> r) {
public Overview map(Record10<Integer, Integer, String, String, DateTime, Boolean, Boolean, Integer, Long, String> r) {
return Overview.builder()
.ocppTagPk(r.value1())
.parentOcppTagPk(r.value2())
Expand All @@ -255,6 +263,9 @@ public Overview map(Record7<Integer, Integer, String, String, DateTime, Boolean,
.expiryDateFormatted(humanize(r.value5()))
.inTransaction(r.value6())
.blocked(r.value7())
.maxActiveTransactionCount(r.value8())
.activeTransactionCount(r.value9())
.note(r.value10())
.build();
}
}
Expand Down
170 changes: 170 additions & 0 deletions src/main/java/de/rwth/idsg/steve/web/api/OcppTagsRestController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
/*
* SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve
* Copyright (C) 2013-2019 RWTH Aachen University - Information Systems - Intelligent Distributed Systems Group (IDSG).
* All Rights Reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.rwth.idsg.steve.web.api;

import de.rwth.idsg.steve.repository.OcppTagRepository;
import de.rwth.idsg.steve.repository.dto.OcppTag;
import de.rwth.idsg.steve.service.OcppTagService;
import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse;
import de.rwth.idsg.steve.web.dto.OcppTagForm;
import de.rwth.idsg.steve.web.dto.OcppTagQueryForm;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;

import javax.validation.Valid;
import java.util.Collections;
import java.util.List;

/**
* @author Sevket Goekay <sevketgokay@gmail.com>
* @since 13.09.2022
*/
@Slf4j
@RestController
@RequestMapping(value = "/api/v1/ocppTags", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
public class OcppTagsRestController {

private final OcppTagRepository ocppTagRepository;
private final OcppTagService ocppTagService;

@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class),
@ApiResponse(code = 403, message = "Forbidden", response = ApiErrorResponse.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)}
)
@GetMapping(value = "")
@ResponseBody
public List<OcppTag.Overview> get(OcppTagQueryForm params) {
log.debug("Read request for query: {}", params);

var response = ocppTagRepository.getOverview(params);
log.debug("Read response for query: {}", response);
return response;
}

@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class),
@ApiResponse(code = 403, message = "Forbidden", response = ApiErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ApiErrorResponse.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)}
)
@GetMapping("/{ocppTagPk}")
@ResponseBody
public OcppTag.Overview getOne(@PathVariable("ocppTagPk") Integer ocppTagPk) {
log.debug("Read request for ocppTagPk: {}", ocppTagPk);

var response = getOneInternal(ocppTagPk);
log.debug("Read response: {}", response);
return response;
}

@ApiResponses(value = {
@ApiResponse(code = 201, message = "Created"),
@ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class),
@ApiResponse(code = 403, message = "Forbidden", response = ApiErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ApiErrorResponse.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)}
)
@PostMapping
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public OcppTag.Overview create(@RequestBody @Valid OcppTagForm params) {
log.debug("Create request: {}", params);

int ocppTagPk = ocppTagRepository.addOcppTag(params);
ocppTagService.removeUnknown(Collections.singletonList(params.getIdTag()));

var response = getOneInternal(ocppTagPk);
log.debug("Create response: {}", response);
return response;
}

@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class),
@ApiResponse(code = 403, message = "Forbidden", response = ApiErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ApiErrorResponse.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)}
)
@PutMapping("/{ocppTagPk}")
@ResponseBody
public OcppTag.Overview update(@PathVariable("ocppTagPk") Integer ocppTagPk, @RequestBody @Valid OcppTagForm params) {
params.setOcppTagPk(ocppTagPk); // the one from incoming params does not matter
log.debug("Update request: {}", params);

ocppTagRepository.updateOcppTag(params);

var response = getOneInternal(ocppTagPk);
log.debug("Update response: {}", response);
return response;
}

@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class),
@ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class),
@ApiResponse(code = 403, message = "Forbidden", response = ApiErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ApiErrorResponse.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)}
)
@DeleteMapping("/{ocppTagPk}")
@ResponseBody
public OcppTag.Overview delete(@PathVariable("ocppTagPk") Integer ocppTagPk) {
log.debug("Delete request for ocppTagPk: {}", ocppTagPk);

var response = getOneInternal(ocppTagPk);
ocppTagRepository.deleteOcppTag(ocppTagPk);

log.debug("Delete response: {}", response);
return response;
}

private OcppTag.Overview getOneInternal(int ocppTagPk) {
OcppTagQueryForm params = new OcppTagQueryForm();
params.setOcppTagPk(ocppTagPk);

List<OcppTag.Overview> results = ocppTagRepository.getOverview(params);
if (results.isEmpty()) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find this ocppTag");
}
return results.get(0);
}
}
22 changes: 19 additions & 3 deletions src/main/java/de/rwth/idsg/steve/web/dto/OcppTagQueryForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package de.rwth.idsg.steve.web.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
Expand All @@ -34,20 +35,35 @@
@ToString
public class OcppTagQueryForm {

@ApiModelProperty(value = "Database primary key of the OCPP tag")
private Integer ocppTagPk;

@ApiModelProperty(value = "The OCPP tag")
private String idTag;

@ApiModelProperty(value = "The parent OCPP tag of this OCPP tag")
private String parentIdTag;

/**
* Init with sensible default values
*/
@ApiModelProperty(value = "Return expired, not expired, or all Ocpp tags? Defaults to ALL")
private BooleanType expired = BooleanType.FALSE;

@ApiModelProperty(value = "Return in-transaction, not in-transaction, or all Ocpp tags? Defaults to ALL")
private BooleanType inTransaction = BooleanType.ALL;

@ApiModelProperty(value = "Return blocked, not blocked, or all Ocpp tags? Defaults to ALL")
private BooleanType blocked = BooleanType.FALSE;

@ApiModelProperty(hidden = true)
public boolean isOcppTagPkSet() {
return ocppTagPk != null;
}

@ApiModelProperty(hidden = true)
public boolean isIdTagSet() {
return idTag != null;
}

@ApiModelProperty(hidden = true)
public boolean isParentIdTagSet() {
return parentIdTag != null;
}
Expand Down

0 comments on commit e340739

Please sign in to comment.