/*
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
* Copyright (C) 2020-2021 dallmann consulting GmbH.
* 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 .
*/
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using OCPP.Core.Database;
namespace OCPP.Core.Management.Controllers
{
public partial class ApiController : BaseController
{
[Authorize]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public async Task UnlockConnector(string Id)
{
if (User != null && !User.IsInRole(Constants.AdminRoleName))
{
Logger.LogWarning("UnlockConnector: Request by non-administrator: {0}", User?.Identity?.Name);
return StatusCode((int)HttpStatusCode.Unauthorized);
}
int httpStatuscode = (int)HttpStatusCode.OK;
string resultContent = string.Empty;
Logger.LogTrace("UnlockConnector: Request to unlock chargepoint '{0}'", Id);
if (!string.IsNullOrEmpty(Id))
{
try
{
ChargePoint chargePoint = DbContext.ChargePoints.Find(Id);
if (chargePoint != null)
{
string serverApiUrl = base.Config.GetValue("ServerApiUrl");
string apiKeyConfig = base.Config.GetValue("ApiKey");
if (!string.IsNullOrEmpty(serverApiUrl))
{
try
{
using (var httpClient = new HttpClient())
{
if (!serverApiUrl.EndsWith('/'))
{
serverApiUrl += "/";
}
Uri uri = new Uri(serverApiUrl);
uri = new Uri(uri, $"UnlockConnector/{Uri.EscapeDataString(Id)}");
httpClient.Timeout = new TimeSpan(0, 0, 4); // use short timeout
// API-Key authentication?
if (!string.IsNullOrWhiteSpace(apiKeyConfig))
{
httpClient.DefaultRequestHeaders.Add("X-API-Key", apiKeyConfig);
}
else
{
Logger.LogWarning("UnlockConnector: No API-Key configured!");
}
HttpResponseMessage response = await httpClient.GetAsync(uri);
if (response.StatusCode == HttpStatusCode.OK)
{
string jsonResult = await response.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(jsonResult))
{
try
{
dynamic jsonObject = JsonConvert.DeserializeObject(jsonResult);
Logger.LogInformation("UnlockConnector: Result of API request is '{0}'", jsonResult);
string status = jsonObject.status;
switch (status)
{
case "Unlocked":
resultContent = _localizer["UnlockConnectorAccepted"];
break;
case "UnlockFailed":
case "OngoingAuthorizedTransaction":
case "UnknownConnector":
resultContent = _localizer["UnlockConnectorFailed"];
break;
case "NotSupported":
resultContent = _localizer["UnlockConnectorNotSupported"];
break;
default:
resultContent = string.Format(_localizer["UnlockConnectorUnknownStatus"], status);
break;
}
}
catch (Exception exp)
{
Logger.LogError(exp, "UnlockConnector: Error in JSON result => {0}", exp.Message);
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorError"];
}
}
else
{
Logger.LogError("UnlockConnector: Result of API request is empty");
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorError"];
}
}
else if (response.StatusCode == HttpStatusCode.NotFound)
{
// Chargepoint offline
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorOffline"];
}
else
{
Logger.LogError("UnlockConnector: Result of API request => httpStatus={0}", response.StatusCode);
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorError"];
}
}
}
catch (Exception exp)
{
Logger.LogError(exp, "UnlockConnector: Error in API request => {0}", exp.Message);
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorError"];
}
}
}
else
{
Logger.LogWarning("UnlockConnector: Error loading charge point '{0}' from database", Id);
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnknownChargepoint"];
}
}
catch (Exception exp)
{
Logger.LogError(exp, "UnlockConnector: Error loading charge point from database");
httpStatuscode = (int)HttpStatusCode.OK;
resultContent = _localizer["UnlockConnectorError"];
}
}
return StatusCode(httpStatuscode, resultContent);
}
}
}