//SPDX-FileCopyrightText: 2024 Yury Gubich //SPDX-License-Identifier: GPL-3.0-or-later #include "updateasset.h" #include #include "server/server.h" #include "server/session.h" #include "database/exceptions.h" Handler::UpdateAsset::UpdateAsset (const std::shared_ptr& server): Handler("updateAsset", Request::Method::post), server(server) {} void Handler::UpdateAsset::handle (Request& request) { std::string access = request.getAuthorizationToken(); if (access.empty()) return error(request, Response::Status::unauthorized); if (access.size() != 32) return error(request, Response::Status::badRequest); std::shared_ptr srv = server.lock(); if (!srv) return error(request, Response::Status::internalError); std::map form = request.getForm(); std::map::const_iterator itr = form.find("id"); if (itr == form.end()) return error(request, Response::Status::badRequest); DB::Asset asset; asset.id = std::stoul(itr->second); itr = form.find("currency"); if (itr == form.end()) return error(request, Response::Status::badRequest); asset.currency = std::stoul(itr->second); //TODO validate the currency itr = form.find("title"); if (itr == form.end()) return error(request, Response::Status::badRequest); asset.title = itr->second; itr = form.find("icon"); if (itr == form.end()) return error(request, Response::Status::badRequest); asset.icon = itr->second; try { itr = form.find("color"); if (itr != form.end()) asset.color = std::stoul(itr->second); } catch (const std::exception& e) { std::cerr << "Insignificant error parsing color during asset addition: " << e.what() << std::endl; } try { Session& session = srv->getSession(access); asset.owner = session.owner; srv->getDatabase()->updateAsset(asset); Response& res = request.createResponse(Response::Status::ok); res.send(); session.assetChanged(asset); } catch (const DB::NoSession& e) { return error(request, Response::Status::unauthorized); } catch (const std::exception& e) { std::cerr << "Exception on " << path << ":\n\t" << e.what() << std::endl; return error(request, Response::Status::internalError); } catch (...) { std::cerr << "Unknown exception on " << path << std::endl; return error(request, Response::Status::internalError); } }