diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/administration_reader.cpp | 2 | ||||
| -rw-r--r-- | src/exporter.cpp | 69 | ||||
| -rw-r--r-- | src/importer.cpp | 13 | ||||
| -rw-r--r-- | src/main_linux.cpp | 6 | ||||
| -rw-r--r-- | src/providers/MailerSend.cpp | 48 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 3 |
7 files changed, 120 insertions, 25 deletions
diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp index 7528711..d790b91 100644 --- a/src/administration_reader.cpp +++ b/src/administration_reader.cpp @@ -182,7 +182,7 @@ bool administration_reader::read_invoice_from_xml(invoice* result, char* buffer, char customer_endpoint_id[50]; xml_get_str_x(root, customer_endpoint_id, 50, "cac:AccountingCustomerParty", "cac:Party", "cbc:EndpointID", 0); if (strops::equals(customer_endpoint_id, "[CONSUMER]")) data.customer.type = contact_type::CONTACT_CONSUMER; - + // Addressee xml_get_str_x(root, data.addressee.name, MAX_LEN_LONG_DESC, "cac:Delivery", "cac:DeliveryParty", "cac:PartyName", "cbc:Name", 0); xml_get_str_x(root, data.addressee.address.address1, MAX_LEN_ADDRESS, "cac:Delivery", "cac:DeliveryLocation", "cac:Address", "cbc:StreetName", 0); diff --git a/src/exporter.cpp b/src/exporter.cpp new file mode 100644 index 0000000..c53b70d --- /dev/null +++ b/src/exporter.cpp @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2025 Aldrik Ramaekers <aldrik.ramaekers@gmail.com> +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include <threads.h> + +#define CPPHTTPLIB_OPENSSL_SUPPORT +#include "httplib.h" +#include "logger.hpp" +#include "strops.hpp" +#include "memops.hpp" +#include "locales.hpp" +#include "exporter.hpp" + +extern exporter::email_provider_impl _mailersend_api_provider; + +exporter::email_provider_impl exporter::get_email_provider_implementation(email_provider provider) +{ + switch(provider) + { + case EMAIL_PROVIDER_MAILERSEND: return _mailersend_api_provider; + default: assert(0); break; + } + + return exporter::email_provider_impl {0}; +} + +static int _send_email_t(void* arg) { + exporter::export_request* request = (exporter::export_request*)arg; + request->status = exporter::status::EXPORT_WAITING_FOR_RESPONSE; + + exporter::email_provider_impl impl = exporter::get_email_provider_implementation(administration::get_email_service().provider); + request->error = impl.send_email(request->sender, request->recipient, request->subject, request->text); + + request->status = exporter::status::EXPORT_DONE; + + return 0; +} + +exporter::export_request* exporter::send_email(char* sender, char* recipient, const char* subject, const char* text) +{ + exporter::export_request* result = (exporter::export_request*)memops::alloc(sizeof(exporter::export_request)); + result->started_at = time(NULL); + result->error = E_ERR_SUCCESS; + result->status = exporter::status::EXPORT_STARTING; + result->sender = sender; + result->recipient = recipient; + result->subject = subject; + result->text = text; + + thrd_t thr; + if (thrd_create(&thr, _send_email_t, result) != thrd_success) { + return 0; + } + + return result; +}
\ No newline at end of file diff --git a/src/importer.cpp b/src/importer.cpp index 45fb16c..3c56062 100644 --- a/src/importer.cpp +++ b/src/importer.cpp @@ -29,8 +29,6 @@ extern importer::ai_provider_impl _chatgpt_api_provider; extern importer::ai_provider_impl _deepseek_api_provider; -extern importer::email_provider_impl _mailersend_api_provider; - importer::ai_provider_impl importer::get_ai_provider_implementation(ai_provider provider) { switch(provider) @@ -43,17 +41,6 @@ importer::ai_provider_impl importer::get_ai_provider_implementation(ai_provider return importer::ai_provider_impl {0}; } -importer::email_provider_impl importer::get_email_provider_implementation(email_provider provider) -{ - switch(provider) - { - case EMAIL_PROVIDER_MAILERSEND: return _mailersend_api_provider; - default: assert(0); break; - } - - return importer::email_provider_impl {0}; -} - static void _batch_query_response_handler(invoice* buffer, char* json) { int alloc_size = 1000; diff --git a/src/main_linux.cpp b/src/main_linux.cpp index e1dd7f6..867073a 100644 --- a/src/main_linux.cpp +++ b/src/main_linux.cpp @@ -74,9 +74,9 @@ int main(int argc, char** argv) ImGui_ImplOpenGL2_Init(); style.FontSizeBase = 18.0f; - io.Fonts->AddFontFromFileTTF("build/Roboto-Regular.ttf"); - ui::fontBold = io.Fonts->AddFontFromFileTTF("build/Roboto-Bold.ttf"); - ui::fontBig = io.Fonts->AddFontFromFileTTF("build/Roboto-Bold.ttf", 30); + io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Regular.ttf"); + ui::fontBold = io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Bold.ttf"); + ui::fontBig = io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Bold.ttf", 30); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); diff --git a/src/providers/MailerSend.cpp b/src/providers/MailerSend.cpp index 961e457..1a633d9 100644 --- a/src/providers/MailerSend.cpp +++ b/src/providers/MailerSend.cpp @@ -14,22 +14,58 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include <threads.h> - #define CPPHTTPLIB_OPENSSL_SUPPORT #include "httplib.h" #include "memops.hpp" #include "strops.hpp" #include "logger.hpp" -#include "importer.hpp" +#include "exporter.hpp" -bool _MailerSend_send_email(char* sender, char* recipients, u32 recipients_count, const char* subject, const char* text) +bool _MailerSend_send_email(char* sender, char* recipient, const char* subject, const char* text) { - return false; + const char *api_key = administration::get_email_service().api_key; + httplib::SSLClient cli("api.mailersend.com", 443); + cli.enable_server_certificate_verification(false); + cli.set_connection_timeout(15, 0); + + size_t body_size = 10000; + char* body = (char*)memops::alloc(body_size); + + const char* json = "{\n" + " \"from\": {\n" + " \"email\": \"%s\",\n" + " \"name\": \"%s\"\n" + " },\n" + " \"to\": [\n" + " {\n" + " \"email\": \"%s\",\n" + " \"name\": \"%s\"\n" + " }\n" + " ],\n" + " \"subject\": \"%s\",\n" + " \"text\": \"%s.\"\n" + "}"; + + strops::format(body, body_size, json, sender, sender, recipient, recipient, subject, text); + + httplib::Headers headers; + headers.insert(std::make_pair("Authorization", std::string("Bearer ") + api_key)); + headers.insert(std::make_pair("Content-Type", "application/json")); + + httplib::Result res = cli.Post("/v1/email", headers, body, "application/json"); + memops::unalloc(body); + + if (!res || (res->status != 200 && res->status != 202)) { + logger::error("Failed to send email."); + return E_ERR_FAILED_REQUEST; + } + + logger::info("Email sent."); + return E_ERR_SUCCESS; } -importer::email_provider_impl _mailersend_api_provider = { +exporter::email_provider_impl _mailersend_api_provider = { "MailerSend", _MailerSend_send_email, };
\ No newline at end of file diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index dc51fd6..6a50c7f 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -22,6 +22,8 @@ #include "memops.hpp" #include "strops.hpp" #include "locales.hpp" +#include "importer.hpp" +#include "exporter.hpp" #include "administration.hpp" #include "administration_writer.hpp" @@ -501,7 +503,7 @@ static void draw_invoice_view() if (ImGui::BeginCombo("##Send", locale::get("ui.sendAs"))) { if (ImGui::Selectable(locale::get("ui.sendAs.email"), false)) { - + exporter::send_email("test@test-vz9dlemj2564kj50.mlsender.net", "aldrikboy@gmail.com", "test", "test 123"); } // if (ImGui::Selectable(locale::get("ui.sendAs.einvoice"), false)) { diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 240e376..fd0d5b9 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -20,6 +20,7 @@ #include "memops.hpp" #include "locales.hpp" #include "importer.hpp" +#include "exporter.hpp" #include "countries.hpp" #include "administration.hpp" #include "administration_writer.hpp" @@ -343,7 +344,7 @@ static void draw_email_service_ui() { char* email_service_names[EMAIL_PROVIDER_END]; for (u32 i = 0; i < EMAIL_PROVIDER_END; i++) { - email_service_names[i] = importer::get_email_provider_implementation((email_provider)i).provider_name; + email_service_names[i] = exporter::get_email_provider_implementation((email_provider)i).provider_name; } if (ImGui::BeginCombo(locale::get("settings.services.email_service.provider"), email_service_names[new_ai_service.provider])) |
