MantisBase v0.3.4
Loading...
Searching...
No Matches
entity_schema.h
Go to the documentation of this file.
1
9#ifndef MANTISBASE_ENTITY_SCHEMA_H
10#define MANTISBASE_ENTITY_SCHEMA_H
11
12#include <vector>
13#include <ranges>
14#include <algorithm>
15
16#include "entity.h"
17#include "entity_schema_field.h"
18#include "access_rules.h"
19
20namespace mb {
39 public:
43 EntitySchema() = default;
44
50 explicit EntitySchema(const std::string &entity_name, const std::string &entity_type = "base");
51
52 // Allow copy constructors & assignment ops for easy cloning
55
56 // Move operators ...
57 EntitySchema(EntitySchema &&) noexcept = default;
58 EntitySchema &operator=(EntitySchema &&) noexcept = default;
59
61
67 bool operator==(const EntitySchema &other) const;
68
74 static EntitySchema fromSchema(const json &entity_schema);
75
81 static EntitySchema fromEntity(const Entity &entity);
82
87 [[nodiscard]] Entity toEntity() const;
88
89 // ----------- SCHEMA METHODS ----------- //
94 [[nodiscard]] std::string id() const;
95
100 [[nodiscard]] std::string name() const;
101
107 EntitySchema &setName(const std::string &name);
108
113 [[nodiscard]] std::string type() const;
114
120 EntitySchema &setType(const std::string &type);
121
126 [[nodiscard]] bool hasApi() const;
127
133 EntitySchema &setHasApi(const bool &hasApi);
134
139 [[nodiscard]] bool isSystem() const;
140
146 EntitySchema &setSystem(const bool &isSystem);
147
148 [[nodiscard]] AccessRule listRule() const;
149
151
152 [[nodiscard]] AccessRule getRule() const;
153
155
156 [[nodiscard]] AccessRule addRule() const;
157
159
160 [[nodiscard]] AccessRule updateRule() const;
161
163
164 [[nodiscard]] AccessRule deleteRule() const;
165
167
172 [[nodiscard]] std::vector<EntitySchemaField> fields() const;
173
180
186 bool removeField(const std::string &field_name);
187
194 EntitySchemaField &field(const std::string &field_name);
195
202 EntitySchemaField &fieldById(const std::string &field_id);
203
209 [[nodiscard]] bool hasField(const std::string &field_name) const;
210
216 [[nodiscard]] bool hasFieldById(const std::string &field_id) const;
217
222 [[nodiscard]] std::string viewQuery() const;
223
229 EntitySchema &setViewQuery(const std::string &viewQuery);
230
235 void updateWith(const nlohmann::json &new_data);
236
237 // ----------- SCHEMA CONVERSION ----------- //
242 [[nodiscard]] json toJSON() const;
243
248 [[nodiscard]] std::string toDDL() const;
249
256 static std::string toDefaultSqlValue(const std::string &type, const nlohmann::json &v);
257
262 [[nodiscard]] std::string dump() const;
263
264 // ----------- SCHEMA CRUD ----------- //
270 static nlohmann::json listTables(const nlohmann::json &opts = nlohmann::json::object());
271
277 static nlohmann::json getTable(const std::string &table_id);
278
284 static nlohmann::json createTable(const EntitySchema &new_table);
285
292 static nlohmann::json updateTable(const std::string &table_id, const nlohmann::json &new_schema);
293
298 static void dropTable(const EntitySchema &original_table);
299
304 static void dropTable(const std::string &table_id);
305
311 static bool tableExists(const std::string &table_name);
312
318 static bool tableExists(const EntitySchema &table);
319
325 static std::string genEntityId(const std::string &entity_name);
326
332 static std::optional<std::string> validate(const EntitySchema &table_schema);
333
338 [[nodiscard]] std::optional<std::string> validate() const;
339
344 static bool isValidEntityName(const std::string& name);
345
350 static bool isValidEntityType(const std::string& type);
351
352 // --------------- SCHEMA ROUTING ------------------ //
353 [[nodiscard]] HandlerFn getOneRouteHandler() const;
354
355 [[nodiscard]] HandlerFn getManyRouteHandler() const;
356
357 [[nodiscard]] HandlerFn postRouteHandler() const;
358
359 [[nodiscard]] HandlerFn patchRouteHandler() const;
360
361 [[nodiscard]] HandlerFn deleteRouteHandler() const;
362
363 void createEntityRoutes() const;
364
365
366 static const std::vector<EntitySchemaField> &defaultBaseFieldsSchema();
367 static const std::vector<EntitySchemaField> &defaultAuthFieldsSchema();
368
369 private:
370 static std::string getFieldType(const std::string &type, std::shared_ptr<soci::session> sql);
371
372 void addFieldsIfNotExist(const std::string &type);
373
374 std::string m_name;
375 std::string m_type;
376 std::string m_viewSqlQuery;
377 bool m_isSystem = false;
378 bool m_hasApi = true;
379 std::vector<EntitySchemaField> m_fields;
380 AccessRule m_listRule, m_getRule, m_addRule, m_updateRule, m_deleteRule;
381 };
382} // mb
383
384#endif //MANTISBASE_ENTITY_SCHEMA_H
Access rule definition for entity permissions.
Access control rule for entity permissions.
Definition access_rules.h:31
Represents a single field in a database table schema.
Definition entity_schema_field.h:36
Builder class for creating and managing database table schemas.
Definition entity_schema.h:38
AccessRule updateRule() const
Definition entity_schema.cpp:380
EntitySchema & addField(const EntitySchemaField &field)
Add a field to the schema (fluent interface).
Definition entity_schema.cpp:396
static nlohmann::json listTables(const nlohmann::json &opts=nlohmann::json::object())
List all tables from database.
Definition entity_schema_crud.cpp:14
std::string dump() const
Dump schema as formatted string (for debugging).
Definition entity_schema.cpp:552
EntitySchema(EntitySchema &&) noexcept=default
AccessRule addRule() const
Definition entity_schema.cpp:373
json toJSON() const
Convert schema to JSON representation.
Definition entity_schema.cpp:418
std::string name() const
Get table name.
Definition entity_schema.cpp:317
EntitySchema & setListRule(const AccessRule &listRule)
Definition entity_schema.cpp:361
std::optional< std::string > validate() const
Validate this schema instance.
Definition entity_schema.cpp:677
EntitySchema & operator=(const EntitySchema &)
Definition entity_schema.cpp:21
HandlerFn patchRouteHandler() const
Definition entity_schema_routes_handlers.cpp:133
EntitySchema & setSystem(const bool &isSystem)
Set system table flag (fluent interface).
Definition entity_schema.cpp:354
void createEntityRoutes() const
Definition entity_schema_routes_handlers.cpp:216
static EntitySchema fromEntity(const Entity &entity)
Create schema from existing Entity.
Definition entity_schema.cpp:121
std::string viewQuery() const
Get SQL query for view type entities.
Definition entity_schema.cpp:191
EntitySchemaField & field(const std::string &field_name)
Get field by name (mutable reference).
Definition entity_schema.cpp:165
EntitySchema & setDeleteRule(const AccessRule &deleteRule)
Definition entity_schema.cpp:389
bool hasApi() const
Check if API endpoints are enabled.
Definition entity_schema.cpp:345
void updateWith(const nlohmann::json &new_data)
Update schema with new JSON data (merges fields).
Definition entity_schema.cpp:202
HandlerFn postRouteHandler() const
Definition entity_schema_routes_handlers.cpp:80
static nlohmann::json createTable(const EntitySchema &new_table)
Create table in database from schema.
Definition entity_schema_crud.cpp:62
static std::string toDefaultSqlValue(const std::string &type, const nlohmann::json &v)
Get default SQL value for a field type.
Definition entity_schema.cpp:527
static nlohmann::json updateTable(const std::string &table_id, const nlohmann::json &new_schema)
Update existing table schema in database.
Definition entity_schema_crud.cpp:125
static std::string genEntityId(const std::string &entity_name)
Generate unique entity ID from name.
Definition entity_schema.cpp:581
HandlerFn getManyRouteHandler() const
Definition entity_schema_routes_handlers.cpp:50
static void dropTable(const EntitySchema &original_table)
Drop table from database.
Definition entity_schema_crud.cpp:750
EntitySchema & setHasApi(const bool &hasApi)
Enable/disable API endpoints (fluent interface).
Definition entity_schema.cpp:347
AccessRule deleteRule() const
Definition entity_schema.cpp:387
AccessRule getRule() const
Definition entity_schema.cpp:366
std::string toDDL() const
Generate SQL DDL (CREATE TABLE) statement.
Definition entity_schema.cpp:445
static bool isValidEntityType(const std::string &type)
Validate this schema type to the 3 supported types.
Definition entity_schema.cpp:681
bool hasField(const std::string &field_name) const
Check if field exists by name.
Definition entity_schema.cpp:510
static const std::vector< EntitySchemaField > & defaultAuthFieldsSchema()
Definition entity_schema_base_fields.cpp:69
static bool tableExists(const std::string &table_name)
Check if table exists by name.
Definition entity_schema_crud.cpp:796
static EntitySchema fromSchema(const json &entity_schema)
Create schema from JSON object.
Definition entity_schema.cpp:45
std::string type() const
Get entity type.
Definition entity_schema.cpp:324
Entity toEntity() const
Convert schema to Entity for database operations.
Definition entity_schema.cpp:156
EntitySchema(const EntitySchema &)
EntitySchema & setAddRule(const AccessRule &addRule)
Definition entity_schema.cpp:375
EntitySchemaField & fieldById(const std::string &field_id)
Get field by ID (mutable reference).
Definition entity_schema.cpp:178
bool removeField(const std::string &field_name)
Remove a field by name.
Definition entity_schema.cpp:406
EntitySchema & setGetRule(const AccessRule &getRule)
Definition entity_schema.cpp:368
static nlohmann::json getTable(const std::string &table_id)
Get table schema by ID from database.
Definition entity_schema_crud.cpp:37
EntitySchema & setViewQuery(const std::string &viewQuery)
Set SQL query for view type (fluent interface).
Definition entity_schema.cpp:195
HandlerFn deleteRouteHandler() const
Definition entity_schema_routes_handlers.cpp:183
EntitySchema & setType(const std::string &type)
Set entity type (fluent interface).
Definition entity_schema.cpp:326
AccessRule listRule() const
Definition entity_schema.cpp:359
HandlerFn getOneRouteHandler() const
Definition entity_schema_routes_handlers.cpp:6
static bool isValidEntityName(const std::string &name)
Validate this schema name to alphanum and _ only.
Definition entity_schema.cpp:688
EntitySchema & setUpdateRule(const AccessRule &updateRule)
Definition entity_schema.cpp:382
bool isSystem() const
Check if this is a system table.
Definition entity_schema.cpp:352
bool hasFieldById(const std::string &field_id) const
Check if field exists by ID.
Definition entity_schema.cpp:518
static const std::vector< EntitySchemaField > & defaultBaseFieldsSchema()
Definition entity_schema_base_fields.cpp:9
EntitySchema & setName(const std::string &name)
Set table name (fluent interface).
Definition entity_schema.cpp:319
EntitySchema()=default
Default constructor (creates empty schema).
std::vector< EntitySchemaField > fields() const
Get all field definitions.
Definition entity_schema.cpp:394
Represents a database table/entity with schema and CRUD operations.
Definition entity.h:39
Entity class for database table operations and CRUD functionality.
Entity schema field definition and validation.
router.h
Definition auth.h:15
std::function< void(MantisRequest &, MantisResponse &)> HandlerFn
‍Route Handler function shorthand
Definition types.h:36
nlohmann::json json
Shorten JSON namespace.
Definition context_store.h:18
Definition log_database.h:20
Definition utils.h:34