package com.mailserver.service; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; /** * The message exactly as received or appended (table message_sources). IMAP serves it as BODY[]; a message without * one gets its MIME text built once ({@link com.mailserver.imap.MimeSource}). A changed draft loses it. */ @Component public class MessageSources { private final DatabaseClient db; public MessageSources(DatabaseClient db) { this.db = db; } public Mono get(Long messageId) { return db.sql("SELECT raw FROM message_sources WHERE message_id = :id") .bind("id", messageId) .map(row -> row.get("raw", byte[].class)) .one(); } public Mono put(Long messageId, byte[] raw) { return db.sql("INSERT INTO message_sources (message_id, raw) VALUES (:id, :raw) " + "ON CONFLICT (message_id) DO UPDATE SET raw = EXCLUDED.raw") .bind("id", messageId) .bind("raw", raw) .then(); } public Mono remove(Long messageId) { return db.sql("DELETE FROM message_sources WHERE message_id = :id").bind("id", messageId).then(); } }