Adding operator tables.

This commit is contained in:
stephb9959
2022-04-07 21:48:06 -07:00
parent 1b853b385d
commit df390466d5
12 changed files with 193 additions and 115 deletions

2
build
View File

@@ -1 +1 @@
92
93

View File

@@ -1156,12 +1156,14 @@ components:
$ref: '#/components/schemas/ObjectInfo'
serialNumber:
type: string
realMacAddress:
type: string
operatorId:
type: string
format: uuid
deviceType:
type: string
subscriber:
subscriberId:
type: string
format: uuid
qrCode:

View File

@@ -8,6 +8,7 @@
#include "StorageService.h"
#include "framework/MicroService.h"
#include "framework/ConfigurationValidator.h"
#include "sdks/SDK_sec.h"
namespace OpenWifi {
@@ -521,6 +522,13 @@ namespace OpenWifi {
return (V=="on" || V=="off" || V=="inherit");
}
inline bool ValidRRM(const std::string &V, RESTAPIHandler &H) {
if(V=="on" || V=="off" || V=="inherit")
return true;
H.BadRequest(RESTAPI::Errors::InvalidRRM);
return false;
}
inline bool ValidSourceIP([[maybe_unused]] const std::vector<std::string> & IPs) {
return true;
}
@@ -538,9 +546,87 @@ namespace OpenWifi {
C=="corporate");
}
inline bool ValidContactType(const std::string &contact, RESTAPIHandler &H) {
auto C = Poco::toLower(contact);
if (C=="subscriber" || C=="user" || C=="installer" || C=="csr" ||
C=="manager" || C=="businessowner" || C=="technician" ||
C=="corporate")
return true;
H.BadRequest(RESTAPI::Errors::InvalidContactType);
return false;
}
inline bool ValidLocationType(const std::string &location) {
auto C = Poco::toLower(location);
return (C=="service" || C=="equipment" || C=="auto" || C=="manual" ||
C=="special" || C=="unknown" || C=="corporate");
}
inline bool ValidLocationType(const std::string &location, RESTAPIHandler &H) {
auto C = Poco::toLower(location);
if((C=="service" || C=="equipment" || C=="auto" || C=="manual" ||
C=="special" || C=="unknown" || C=="corporate"))
return true;
H.BadRequest(RESTAPI::Errors::InvalidLocationType);
return false;
}
template <typename DBType> bool ValidDbId(const Types::UUID_t &uuid, DBType & DB, bool AllowEmpty , const std::string &Error , RESTAPIHandler & H) {
if(!AllowEmpty && uuid.empty()) {
H.BadRequest(Error);
return false;
}
if(uuid.empty())
return true;
if(!DB.Exists("id",uuid)) {
H.BadRequest(Error);
return false;
}
return true;
}
inline bool ValidSubscriberId( const Types::UUID_t & uuid, bool AllowEmpty, RESTAPIHandler &H ) {
if(!AllowEmpty && uuid.empty()) {
H.BadRequest(RESTAPI::Errors::InvalidSubscriberId);
return false;
}
if(uuid.empty())
return true;
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(&H, uuid, NewSubInfo)) {
H.BadRequest(RESTAPI::Errors::InvalidSubscriberId);
return false;
}
return true;
}
inline bool ValidSubscriberId( const Types::UUID_t & uuid, bool AllowEmpty, std::string & email, RESTAPIHandler &H ) {
if(!AllowEmpty && uuid.empty()) {
H.BadRequest(RESTAPI::Errors::InvalidSubscriberId);
return false;
}
if(uuid.empty())
return true;
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(&H, uuid, NewSubInfo)) {
H.BadRequest(RESTAPI::Errors::InvalidSubscriberId);
return false;
}
email = NewSubInfo.email;
return true;
}
inline bool ValidSerialNumber(const std::string &serialNumber, bool AllowEmpty, RESTAPIHandler &H) {
if(!AllowEmpty && serialNumber.empty()) {
H.BadRequest(RESTAPI::Errors::InvalidSerialNumber);
return false;
}
if(!Utils::ValidSerialNumber(serialNumber)) {
H.BadRequest(RESTAPI::Errors::InvalidSerialNumber);
return false;
}
return true;
}
}

View File

@@ -50,33 +50,11 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(RawObject->has("type")) {
if(!NewObject.type.empty()) {
if (ValidContactType(NewObject.type)) {
return BadRequest(RESTAPI::Errors::InvalidContactType);
}
NewObject.type = Poco::toLower(NewObject.type);
} else {
NewObject.type.clear();
}
}
if(NewObject.operatorId.empty() || !StorageService()->OperatorDB().Exists("id",NewObject.operatorId)) {
return BadRequest(RESTAPI::Errors::MissingUUID);
}
if(!NewObject.subscriberId.empty()) {
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(this, NewObject.subscriberId, NewSubInfo)) {
return BadRequest(RESTAPI::Errors::InvalidSubscriberId);
}
NewObject.primaryEmail = NewSubInfo.email;
} else {
NewObject.primaryEmail.clear();
}
if(RawObject->has("managementPolicy") && !StorageService()->PolicyDB().Exists("id",NewObject.managementPolicy)) {
return BadRequest(RESTAPI::Errors::UnknownManagementPolicyUUID);
if( !ValidDbId(NewObject.operatorId,StorageService()->OperatorDB(), false, RESTAPI::Errors::InvalidOperatorId, *this ) ||
!ValidDbId(NewObject.managementPolicy,StorageService()->PolicyDB(), false, RESTAPI::Errors::UnknownManagementPolicyUUID, *this ) ||
!ValidContactType(NewObject.type,*this) ||
!ValidSubscriberId(NewObject.subscriberId,true,NewObject.primaryEmail,*this)) {
return;
}
ProvObjects::CreateObjectInfo(RawObject, UserInfo_.userinfo, NewObject.info);
@@ -104,33 +82,14 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(RawObject->has("managementPolicy") && !StorageService()->PolicyDB().Exists("id",UpdateObj.managementPolicy)) {
return BadRequest(RESTAPI::Errors::UnknownManagementPolicyUUID);
}
if(!UpdateObj.subscriberId.empty()) {
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(this, UpdateObj.subscriberId, NewSubInfo)) {
return BadRequest(RESTAPI::Errors::InvalidSubscriberId);
}
UpdateObj.primaryEmail = NewSubInfo.email;
} else {
UpdateObj.primaryEmail.clear();
}
if(RawObject->has("type")) {
if(!UpdateObj.type.empty()) {
if (ValidContactType(UpdateObj.type)) {
return BadRequest(RESTAPI::Errors::InvalidContactType);
}
Existing.type = Poco::toLower(UpdateObj.type);
} else {
Existing.type.clear();
}
if( !ValidContactType(UpdateObj.type,*this) ||
!ValidDbId(UpdateObj.managementPolicy,StorageService()->PolicyDB(), true, RESTAPI::Errors::UnknownManagementPolicyUUID, *this ) ||
!ValidSubscriberId(UpdateObj.subscriberId,true,Existing.primaryEmail,*this)
) {
return;
}
ProvObjects::UpdateObjectInfo(RawObject, UserInfo_.userinfo, Existing.info);
AssignIfPresent(RawObject,"type",Existing.type);
AssignIfPresent(RawObject,"title",Existing.title);
AssignIfPresent(RawObject,"salutation",Existing.salutation);

View File

@@ -49,30 +49,11 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(RawObject->has("type")) {
if(!NewObject.type.empty()) {
if (ValidLocationType(NewObject.type)) {
return BadRequest(RESTAPI::Errors::InvalidLocationType);
}
NewObject.type = Poco::toLower(NewObject.type);
} else {
NewObject.type.clear();
}
}
if(NewObject.operatorId.empty() || !StorageService()->OperatorDB().Exists("id",NewObject.operatorId)) {
return BadRequest(RESTAPI::Errors::MissingUUID);
}
if(!NewObject.subscriberId.empty()) {
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(this, NewObject.subscriberId, NewSubInfo)) {
return BadRequest(RESTAPI::Errors::InvalidSubscriberId);
}
}
if(RawObject->has("managementPolicy") && !StorageService()->PolicyDB().Exists("id",NewObject.managementPolicy)) {
return BadRequest(RESTAPI::Errors::UnknownManagementPolicyUUID);
if( !ValidDbId(NewObject.operatorId,StorageService()->OperatorDB(), false, RESTAPI::Errors::InvalidOperatorId, *this ) ||
!ValidDbId(NewObject.managementPolicy,StorageService()->PolicyDB(), true, RESTAPI::Errors::UnknownManagementPolicyUUID, *this ) ||
!ValidSubscriberId(NewObject.subscriberId,true, *this) ||
!ValidLocationType(NewObject.type,*this)) {
return;
}
ProvObjects::CreateObjectInfo(RawObject, UserInfo_.userinfo, NewObject.info);
@@ -100,33 +81,17 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(RawObject->has("type")) {
if(!UpdateObj.type.empty()) {
if (ValidLocationType(UpdateObj.type)) {
return BadRequest(RESTAPI::Errors::InvalidLocationType);
}
Existing.type = Poco::toLower(UpdateObj.type);
} else {
Existing.type.clear();
}
}
if(RawObject->has("managementPolicy") && !StorageService()->PolicyDB().Exists("id",UpdateObj.managementPolicy)) {
return BadRequest(RESTAPI::Errors::UnknownManagementPolicyUUID);
}
if(!UpdateObj.subscriberId.empty()) {
SecurityObjects::UserInfo NewSubInfo;
if(!SDK::Sec::Subscriber::Get(this, UpdateObj.subscriberId, NewSubInfo)) {
return BadRequest(RESTAPI::Errors::InvalidSubscriberId);
}
} else {
if(RawObject->has("subscriberId") && UpdateObj.subscriberId.empty())
Existing.subscriberId.clear();
if( !ValidLocationType(UpdateObj.type,*this) ||
!ValidDbId(UpdateObj.managementPolicy,StorageService()->PolicyDB(), true, RESTAPI::Errors::UnknownManagementPolicyUUID, *this ) ||
!ValidSubscriberId(UpdateObj.subscriberId,true,*this)
) {
return;
}
ProvObjects::UpdateObjectInfo(RawObject, UserInfo_.userinfo, Existing.info);
AssignIfPresent(RawObject,"type",Existing.type);
AssignIfPresent(RawObject,"subscriberId", Existing.subscriberId);
AssignIfPresent(RawObject,"managementPolicy", Existing.managementPolicy);
AssignIfPresent(RawObject,"buildingName",Existing.buildingName);
AssignIfPresent(RawObject,"addressLines",Existing.addressLines);
AssignIfPresent(RawObject,"city",Existing.city);

View File

@@ -3,12 +3,13 @@
//
#include "RESTAPI_sub_devices_handler.h"
#include "RESTAPI/RESTAPI_db_helpers.h"
#include "sdks/SDK_sec.h"
namespace OpenWifi {
void RESTAPI_sub_devices_handler::DoGet() {
auto uuid = GetParameter("uuid");
auto uuid = GetBinding("uuid");
if(uuid.empty()) {
return BadRequest(RESTAPI::Errors::MissingUUID);
}
@@ -24,13 +25,65 @@ namespace OpenWifi {
}
void RESTAPI_sub_devices_handler::DoDelete() {
auto uuid = GetBinding("uuid");
if(uuid.empty()) {
return BadRequest(RESTAPI::Errors::MissingUUID);
}
if(!DB_.Exists("id",uuid)) {
return NotFound();
}
DB_.DeleteRecord("id",uuid);
return OK();
}
void RESTAPI_sub_devices_handler::DoPost() {
auto RawObject = ParseStream();
SubscriberDeviceDB::RecordName NewObject;
if(!NewObject.from_json(RawObject)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if( !ValidDbId(NewObject.managementPolicy, StorageService()->PolicyDB(), true , RESTAPI::Errors::UnknownManagementPolicyUUID, *this) ||
!ValidDbId(NewObject.contact, StorageService()->OpContactDB(), true, RESTAPI::Errors::InvalidContactId, *this) ||
!ValidDbId(NewObject.location, StorageService()->OpLocationDB(), true, RESTAPI::Errors::InvalidLocationId, *this) ||
!ValidDbId(NewObject.operatorId, StorageService()->OperatorDB(), true, RESTAPI::Errors::InvalidOperatorId, *this) ||
!ValidDbId(NewObject.serviceClass, StorageService()->ServiceClassDB(), true, RESTAPI::Errors::InvalidServiceClassId, *this) ||
!ValidSubscriberId(NewObject.subscriberId, true, *this) ||
!ValidRRM(NewObject.rrm,*this) ||
!ValidSerialNumber(NewObject.serialNumber,false,*this)
) {
return;
}
ProvObjects::CreateObjectInfo(RawObject,UserInfo_.userinfo,NewObject.info);
if(DB_.CreateRecord(NewObject)) {
SubscriberDeviceDB::RecordName New;
DB_.GetRecord("id",NewObject.info.id,New);
Poco::JSON::Object Answer;
New.to_json(Answer);
return ReturnObject(Answer);
}
return InternalError("Count not create record.");
}
void RESTAPI_sub_devices_handler::DoPut() {
auto uuid = GetBinding("uuid");
auto RawObject = ParseStream();
SubscriberDeviceDB::RecordName UpdateObj;
if(!UpdateObj.from_json(RawObject)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
SubscriberDeviceDB::RecordName Existing;
if(!DB_.GetRecord("id",uuid,Existing)) {
return NotFound();
}
}

View File

@@ -927,7 +927,7 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj,"serialNumber", serialNumber);
field_to_json( Obj,"deviceType", deviceType);
field_to_json( Obj,"operatorId", operatorId);
field_to_json( Obj,"subscriber", subscriber);
field_to_json( Obj,"subscriberId", subscriberId);
field_to_json( Obj,"location", location);
field_to_json( Obj,"contact", contact);
field_to_json( Obj,"managementPolicy", managementPolicy);
@@ -940,6 +940,7 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj,"billingCode", billingCode);
field_to_json( Obj,"configuration", configuration);
field_to_json( Obj,"suspended", suspended);
field_to_json( Obj,"realMacAddress", realMacAddress);
}
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -948,7 +949,7 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"serialNumber", serialNumber);
field_from_json( Obj,"deviceType", deviceType);
field_from_json( Obj,"operatorId", operatorId);
field_from_json( Obj,"subscriber", subscriber);
field_from_json( Obj,"subscriberId", subscriberId);
field_from_json( Obj,"location", location);
field_from_json( Obj,"contact", contact);
field_from_json( Obj,"managementPolicy", managementPolicy);
@@ -961,6 +962,7 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"billingCode", billingCode);
field_from_json( Obj,"configuration", configuration);
field_from_json( Obj,"suspended", suspended);
field_from_json( Obj,"realMacAddress", realMacAddress);
return true;
} catch(...) {

View File

@@ -601,7 +601,7 @@ namespace OpenWifi::ProvObjects {
std::string serialNumber;
std::string deviceType;
Types::UUID_t operatorId;
Types::UUID_t subscriber;
Types::UUID_t subscriberId;
Types::UUID_t location;
Types::UUID_t contact;
Types::UUID_t managementPolicy;
@@ -614,6 +614,7 @@ namespace OpenWifi::ProvObjects {
std::string billingCode;
DeviceConfigurationElementVec configuration;
bool suspended=false;
std::string realMacAddress;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);

View File

@@ -1933,7 +1933,7 @@ namespace OpenWifi {
return true;
}
[[nodiscard]] inline const std::string & GetBinding(const std::string &Name, const std::string &Default) {
[[nodiscard]] inline const std::string & GetBinding(const std::string &Name, const std::string &Default="") {
auto E = Bindings_.find(Poco::toLower(Name));
if (E == Bindings_.end())
return Default;

View File

@@ -92,8 +92,12 @@ namespace OpenWifi::RESTAPI::Errors {
static const std::string InvalidBillingCode{"Empty of invalid billing code."};
static const std::string InvalidBillingPeriod{"Invalid billing period."};
static const std::string InvalidSubscriberId{"Invalid subscriber ID"};
static const std::string InvalidContactId{"Invalid contact ID"};
static const std::string InvalidLocationId{"Invalid location ID"};
static const std::string InvalidContactType{"Invalid contact type"};
static const std::string InvalidLocationType{"Invalid location type"};
static const std::string InvalidOperatorId{"Invalid operator ID"};
static const std::string InvalidServiceClassId{"Invalid service class ID"};
}
namespace OpenWifi::RESTAPI::Protocol {

View File

@@ -21,7 +21,7 @@ namespace OpenWifi {
ORM::Field{"serialNumber",ORM::FieldType::FT_TEXT},
ORM::Field{"deviceType",ORM::FieldType::FT_TEXT},
ORM::Field{"operatorId",ORM::FieldType::FT_TEXT},
ORM::Field{"subscriber",ORM::FieldType::FT_TEXT},
ORM::Field{"subscriberId",ORM::FieldType::FT_TEXT},
ORM::Field{"location",ORM::FieldType::FT_TEXT},
ORM::Field{"contact",ORM::FieldType::FT_TEXT},
ORM::Field{"managementPolicy",ORM::FieldType::FT_TEXT},
@@ -33,14 +33,17 @@ namespace OpenWifi {
ORM::Field{"locale",ORM::FieldType::FT_TEXT},
ORM::Field{"billingCode",ORM::FieldType::FT_TEXT},
ORM::Field{"configuration",ORM::FieldType::FT_TEXT},
ORM::Field{"suspended",ORM::FieldType::FT_BOOLEAN}
ORM::Field{"suspended",ORM::FieldType::FT_BOOLEAN},
ORM::Field{"realMacAddress",ORM::FieldType::FT_TEXT}
};
static ORM::IndexVec SubscriberDeviceDB_Indexes{
{ std::string("subscriber_device_name_index"),
ORM::IndexEntryVec{
{std::string("name"),
ORM::Indextype::ASC} } }
ORM::IndexEntryVec{ {std::string("name"), ORM::Indextype::ASC} } },
{ std::string("subscriber_device_serialNumber_index"),
ORM::IndexEntryVec{ {std::string("serialNumber"), ORM::Indextype::ASC} } } ,
{ std::string("subscriber_device_realMacAddress_index"),
ORM::IndexEntryVec{ {std::string("realMacAddress"), ORM::Indextype::ASC} } }
};
SubscriberDeviceDB::SubscriberDeviceDB( OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L) :
@@ -66,7 +69,7 @@ template<> void ORM::DB< OpenWifi::SubDeviceDBRecordType, OpenWifi::ProvObjec
Out.serialNumber = In.get<6>();
Out.deviceType = In.get<7>();
Out.operatorId = In.get<8>();
Out.subscriber = In.get<9>();
Out.subscriberId = In.get<9>();
Out.location = In.get<10>();
Out.contact = In.get<11>();
Out.managementPolicy = In.get<12>();
@@ -79,6 +82,7 @@ template<> void ORM::DB< OpenWifi::SubDeviceDBRecordType, OpenWifi::ProvObjec
Out.billingCode = In.get<19>();
Out.configuration = OpenWifi::RESTAPI_utils::to_object_array<OpenWifi::ProvObjects::DeviceConfigurationElement>(In.get<20>());
Out.suspended = In.get<21>();
Out.realMacAddress = In.get<22>();
}
template<> void ORM::DB< OpenWifi::SubDeviceDBRecordType, OpenWifi::ProvObjects::SubscriberDevice>::Convert(const OpenWifi::ProvObjects::SubscriberDevice &In, OpenWifi::SubDeviceDBRecordType &Out) {
@@ -91,7 +95,7 @@ template<> void ORM::DB< OpenWifi::SubDeviceDBRecordType, OpenWifi::ProvObjec
Out.set<6>(In.serialNumber);
Out.set<7>(In.deviceType);
Out.set<8>(In.operatorId);
Out.set<9>(In.subscriber);
Out.set<9>(In.subscriberId);
Out.set<10>(In.location);
Out.set<11>(In.contact);
Out.set<12>(In.managementPolicy);
@@ -104,4 +108,5 @@ template<> void ORM::DB< OpenWifi::SubDeviceDBRecordType, OpenWifi::ProvObjec
Out.set<19>(In.billingCode);
Out.set<20>(OpenWifi::RESTAPI_utils::to_string(In.configuration));
Out.set<21>(In.suspended);
Out.set<22>(In.realMacAddress);
}

View File

@@ -41,7 +41,8 @@ namespace OpenWifi {
std::string,
std::string,
std::string,
bool
bool,
std::string
> SubDeviceDBRecordType;
class SubscriberDeviceDB : public ORM::DB<SubDeviceDBRecordType, ProvObjects::SubscriberDevice> {