Simplified code.

This commit is contained in:
Martin Preuss
2023-08-10 13:28:37 +02:00
parent 23c9e286b1
commit 17889fd30b

View File

@@ -47,8 +47,8 @@ static GWEN_MSG *_handlePostAdd(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq);
static GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id); static GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id);
static int _writeAddPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf); static int _writeAddPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf);
static int _writeEditPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf); static int _writeEditPage(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, GWEN_DB_NODE *dbValues, GWEN_BUFFER *pageBuf);
static GWEN_MSG *_addRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq); static GWEN_MSG *_addOrEditAndCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id);
static GWEN_MSG *_editRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id); static int _addOrEditRoom(AQH_HTTP_URLHANDLER *uh, const AQH_ROOM *newRoom, int id);
@@ -287,38 +287,26 @@ void _handleGetEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id, GWEN_
sv=AQH_HttpUrlHandler_GetHttpService(uh); sv=AQH_HttpUrlHandler_GetHttpService(uh);
sto=AqHomeHttpService_GetStorage(sv); sto=AqHomeHttpService_GetStorage(sv);
if (sto) { if (id>0) {
if (id>0) { const AQH_ROOM *r;
const AQH_ROOM *r;
r=AQH_Storage_GetRoomById(sto, id); r=AQH_Storage_GetRoomById(sto, id);
if (r) { if (r) {
GWEN_DB_NODE *db; GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new("room"); db=GWEN_DB_Group_new("room");
rv=AQH_Room_toDb(r, db); AQH_Room_toDb(r, db);
if (rv>=0) _writeEditPage(uh, rq, db, pageBuf);
_writeEditPage(uh, rq, db, pageBuf); GWEN_DB_Group_free(db);
else {
DBG_ERROR(NULL, "Error writing room %d to db", id);
GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Internal error."));
}
GWEN_DB_Group_free(db);
}
else {
DBG_ERROR(NULL, "Room %d not found", id);
GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Room not found."));
}
} }
else { else {
DBG_ERROR(NULL, "Missing room id"); DBG_ERROR(NULL, "Room %d not found", id);
GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Missing or invalid room id.")); GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Room not found."));
} }
} }
else { else {
DBG_ERROR(NULL, "No storage"); DBG_ERROR(NULL, "Missing room id");
GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Internal error.")); GWEN_Buffer_AppendArgs(pageBuf, "<p><font color=\"red\">%s</font></p>", I18N("Missing or invalid room id."));
} }
} }
else { else {
@@ -411,18 +399,8 @@ GWEN_MSG *_handlePostAdd(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq)
protocol=AQH_HttpRequest_GetProtocol(rq); protocol=AQH_HttpRequest_GetProtocol(rq);
sv=AQH_HttpUrlHandler_GetHttpService(uh); sv=AQH_HttpUrlHandler_GetHttpService(uh);
perms=AQH_HttpRequest_GetModulePerms(rq); perms=AQH_HttpRequest_GetModulePerms(rq);
if (perms & AQHOME_HTTP_PERMS_ADD_ROOM) { if (perms & AQHOME_HTTP_PERMS_ADD_ROOM)
AQH_STORAGE *sto; return _addOrEditAndCreateResponse(uh, rq, 0);
sto=AqHomeHttpService_GetStorage(sv);
if (sto) {
return _addRoomCreateResponse(uh, rq);
}
else {
DBG_ERROR(NULL, "No storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
}
}
else { else {
return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL); return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL);
} }
@@ -439,17 +417,8 @@ GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id)
protocol=AQH_HttpRequest_GetProtocol(rq); protocol=AQH_HttpRequest_GetProtocol(rq);
sv=AQH_HttpUrlHandler_GetHttpService(uh); sv=AQH_HttpUrlHandler_GetHttpService(uh);
perms=AQH_HttpRequest_GetModulePerms(rq); perms=AQH_HttpRequest_GetModulePerms(rq);
if (perms & AQHOME_HTTP_PERMS_ADD_ROOM) { if (perms & AQHOME_HTTP_PERMS_EDIT_ROOM) {
AQH_STORAGE *sto; return _addOrEditAndCreateResponse(uh, rq, id);
sto=AqHomeHttpService_GetStorage(sv);
if (sto) {
return _editRoomCreateResponse(uh, rq, id);
}
else {
DBG_ERROR(NULL, "No storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
}
} }
else { else {
return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL); return AQH_HttpService_CreateResponseMsg(sv, 403, "Forbidden", protocol, NULL);
@@ -458,119 +427,107 @@ GWEN_MSG *_handlePostEdit(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id)
GWEN_MSG *_addRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq) GWEN_MSG *_addOrEditAndCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
const char *protocol; const char *protocol;
GWEN_DB_NODE *db; GWEN_DB_NODE *db;
const char *roomName; AQH_ROOM *r;
const char *roomDescr; int rv;
AQH_STORAGE *sto;
sv=AQH_HttpUrlHandler_GetHttpService(uh); sv=AQH_HttpUrlHandler_GetHttpService(uh);
protocol=AQH_HttpRequest_GetProtocol(rq); protocol=AQH_HttpRequest_GetProtocol(rq);
db=AQH_HttpRequest_GetDbPostBody(rq); db=AQH_HttpRequest_GetDbPostBody(rq);
roomName=GWEN_DB_GetCharValue(db, "name", 0, NULL); r=AQH_Room_fromDb(db);
roomDescr=GWEN_DB_GetCharValue(db, "description", 0, NULL); rv=_addOrEditRoom(uh, r, id);
AQH_Room_free(r);
if (!(roomName && *roomName)) { if (rv<0) {
DBG_INFO(NULL, "Missing room name"); switch(rv) {
return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing room name"), 1, db, _writeAddPage); case GWEN_ERROR_INVALID:
} return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing fields"), 1, db, _writeAddPage);
case GWEN_ERROR_FOUND:
sto=AqHomeHttpService_GetStorage(sv); return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room already exists"), 1, db, _writeEditPage);
if (sto) { case GWEN_ERROR_NOT_FOUND:
AQH_ROOM *r; return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room not found"), 1, db, _writeEditPage);
int rv; case GWEN_ERROR_IO:
case GWEN_ERROR_INTERNAL:
r=AQH_Room_new(); default:
AQH_Room_SetName(r, roomName);
if (roomDescr && *roomDescr)
AQH_Room_SetDescription(r, roomDescr);
rv=AqHomeHttpService_LockStorage(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error locking storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
} }
if (AQH_Storage_GetRoomByName(sto, roomName)!=NULL) {
DBG_INFO(NULL, "Room \"%s\" already exists", roomName);
AqHomeHttpService_UnlockStorage(sv);
return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room already exists"), 1, db, _writeAddPage);
}
AQH_Storage_AddRoom(sto, r);
AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED);
rv=AqHomeHttpService_UnlockStorage(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error unlocking storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
}
return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list");
} }
else return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
} }
GWEN_MSG *_editRoomCreateResponse(AQH_HTTP_URLHANDLER *uh, AQH_HTTP_REQUEST *rq, int id) int _addOrEditRoom(AQH_HTTP_URLHANDLER *uh, const AQH_ROOM *newRoom, int id)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
const char *protocol;
GWEN_DB_NODE *db;
const char *roomName;
const char *roomDescr;
AQH_STORAGE *sto; AQH_STORAGE *sto;
const char *roomName;
int rv;
sv=AQH_HttpUrlHandler_GetHttpService(uh); sv=AQH_HttpUrlHandler_GetHttpService(uh);
protocol=AQH_HttpRequest_GetProtocol(rq); sto=AqHomeHttpService_GetStorage(sv);
db=AQH_HttpRequest_GetDbPostBody(rq);
roomName=GWEN_DB_GetCharValue(db, "name", 0, NULL);
roomDescr=GWEN_DB_GetCharValue(db, "description", 0, NULL);
roomName=AQH_Room_GetName(newRoom);
if (!(roomName && *roomName)) { if (!(roomName && *roomName)) {
DBG_INFO(NULL, "Missing room name"); DBG_INFO(NULL, "Missing room name");
return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Missing room name"), 1, db, _writeAddPage); return GWEN_ERROR_INVALID;
} }
sto=AqHomeHttpService_GetStorage(sv); rv=AqHomeHttpService_LockStorage(sv);
if (sto) { if (rv<0) {
AQH_ROOM *r; DBG_ERROR(NULL, "Error locking storage");
int rv; return GWEN_ERROR_IO;
}
rv=AqHomeHttpService_LockStorage(sv); if (id>0) {
if (rv<0) { AQH_ROOM *r;
DBG_ERROR(NULL, "Error locking storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
}
r=AQH_Storage_GetRoomById(sto, id); r=AQH_Storage_GetRoomById(sto, id);
if (r==NULL) { if (r==NULL) {
AqHomeHttpService_UnlockStorage(sv); AqHomeHttpService_UnlockStorage(sv);
DBG_ERROR(NULL, "Room %d not found", id); DBG_ERROR(NULL, "Room %d not found", id);
return AQH_HttpUrlHandler_CreatePageMessage(uh, rq, "red", I18N("Room not found"), 1, db, _writeEditPage); return GWEN_ERROR_NOT_FOUND;
} }
AQH_Room_SetId(r, id);
/* edit room */
AQH_Room_SetName(r, roomName); AQH_Room_SetName(r, roomName);
if (roomDescr && *roomDescr) AQH_Room_SetDescription(r, AQH_Room_GetDescription(newRoom));
AQH_Room_SetDescription(r, roomDescr);
AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED); AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED);
rv=AqHomeHttpService_UnlockStorage(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error unlocking storage");
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL);
}
return AQH_HttpService_CreateRedirectingResponseMsg(sv, protocol, "/rooms/list");
} }
else else {
return AQH_HttpService_CreateResponseMsg(sv, 500, "Internal error", protocol, NULL); AQH_ROOM *r;
r=AQH_Storage_GetRoomByName(sto, roomName);
if (r) {
DBG_ERROR(NULL, "Room %s exists", roomName);
return GWEN_ERROR_FOUND;
}
AQH_Storage_AddRoom(sto, r);
AQH_Storage_AddRuntimeFlags(sto, AQH_STORAGE_RTFLAGS_MODIFIED);
}
rv=AqHomeHttpService_UnlockStorage(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error unlocking storage");
return GWEN_ERROR_IO;
}
return 0;
} }
/* TODO: applyRoom(uh, rq, r, id)
* share code!
*
* check values
*
* if id==0:
* - lookup room
* - add room if not already found
* else
* set room data
*/