ContentTextFileExportRepository.java

package net.sasasin.sreader.repository;

import static net.sasasin.sreader.jooq.Tables.CONTENT_FULL_TEXT;
import static net.sasasin.sreader.jooq.Tables.CONTENT_HEADER;
import static net.sasasin.sreader.jooq.Tables.CONTENT_TEXT_FILE_EXPORT;

import java.time.OffsetDateTime;
import java.util.List;
import net.sasasin.sreader.domain.ContentTextFileExportTarget;
import org.jooq.DSLContext;
import org.jooq.impl.DSL;
import org.springframework.stereotype.Repository;

@Repository
public class ContentTextFileExportRepository {

  private final DSLContext dsl;

  public ContentTextFileExportRepository(DSLContext dsl) {
    this.dsl = dsl;
  }

  public List<ContentTextFileExportTarget> findUnexported(int limit) {
    return dsl.select(
            CONTENT_HEADER.ID,
            CONTENT_HEADER.URL,
            CONTENT_HEADER.TITLE,
            CONTENT_FULL_TEXT.ID,
            CONTENT_FULL_TEXT.FULL_TEXT)
        .from(CONTENT_HEADER)
        .join(CONTENT_FULL_TEXT)
        .on(CONTENT_FULL_TEXT.CONTENT_HEADER_ID.eq(CONTENT_HEADER.ID))
        .leftJoin(CONTENT_TEXT_FILE_EXPORT)
        .on(CONTENT_TEXT_FILE_EXPORT.CONTENT_HEADER_ID.eq(CONTENT_HEADER.ID))
        .where(CONTENT_TEXT_FILE_EXPORT.CONTENT_HEADER_ID.isNull())
        .and(CONTENT_FULL_TEXT.FULL_TEXT.isNotNull())
        .and(DSL.trim(CONTENT_FULL_TEXT.FULL_TEXT).ne(""))
        .orderBy(CONTENT_HEADER.CREATED_AT.asc())
        .limit(limit)
        .fetch(
            record ->
                new ContentTextFileExportTarget(
                    record.get(CONTENT_HEADER.ID),
                    record.get(CONTENT_HEADER.URL),
                    record.get(CONTENT_HEADER.TITLE),
                    record.get(CONTENT_FULL_TEXT.ID),
                    record.get(CONTENT_FULL_TEXT.FULL_TEXT)));
  }

  public boolean insertExported(
      String contentHeaderId,
      String contentFullTextId,
      String relativePath,
      long fileSizeBytes,
      String fileSha256) {
    OffsetDateTime now = OffsetDateTime.now();
    return dsl.insertInto(CONTENT_TEXT_FILE_EXPORT)
            .set(CONTENT_TEXT_FILE_EXPORT.CONTENT_HEADER_ID, contentHeaderId)
            .set(CONTENT_TEXT_FILE_EXPORT.CONTENT_FULL_TEXT_ID, contentFullTextId)
            .set(CONTENT_TEXT_FILE_EXPORT.RELATIVE_PATH, relativePath)
            .set(CONTENT_TEXT_FILE_EXPORT.FILE_SIZE_BYTES, fileSizeBytes)
            .set(CONTENT_TEXT_FILE_EXPORT.FILE_SHA256, fileSha256)
            .set(CONTENT_TEXT_FILE_EXPORT.EXPORTED_AT, now)
            .set(CONTENT_TEXT_FILE_EXPORT.CREATED_AT, now)
            .set(CONTENT_TEXT_FILE_EXPORT.UPDATED_AT, now)
            .onConflict(CONTENT_TEXT_FILE_EXPORT.CONTENT_HEADER_ID)
            .doNothing()
            .execute()
        == 1;
  }
}