package io.kaif.model.feed; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.List; import java.util.Optional; import java.util.UUID; import javax.annotation.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import io.kaif.database.DaoOperations; import io.kaif.flake.FlakeId; import io.kaif.model.KaifIdGenerator; @Repository public class FeedAssetDao implements DaoOperations { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Autowired private KaifIdGenerator kaifIdGenerator; private final RowMapper<FeedAsset> feedAssetRowMapper = new RowMapper<FeedAsset>() { @Override public FeedAsset mapRow(ResultSet rs, int rowNum) throws SQLException { return new FeedAsset(UUID.fromString(rs.getString("accountId")), FlakeId.valueOf(rs.getLong("assetId")), FeedAsset.AssetType.fromIndex(rs.getInt("assetType")), rs.getTimestamp("createTime").toInstant(), rs.getBoolean("acked")); } }; @Override public NamedParameterJdbcTemplate namedJdbc() { return namedParameterJdbcTemplate; } public FeedAsset insertFeed(FeedAsset feed) { jdbc().update("" + " INSERT INTO FeedAsset (accountId, assetId, assetType, createTime, acked) " + " VALUES " + questions(5), feed.getAccountId(), feed.getAssetId().value(), feed.getAssetType().getIndex(), Timestamp.from(feed.getCreateTime()), feed.isAcked()); return feed; } public List<FeedAsset> listFeedsDesc(UUID accountId, @Nullable FlakeId startId, int size) { FlakeId startAssetId = Optional.ofNullable(startId).orElse(FlakeId.MAX); return jdbc().query("" + " SELECT * " + " FROM FeedAsset " + " WHERE accountId = ? " + " AND assetId < ? " + " ORDER BY assetId DESC " + " LIMIT ? ", feedAssetRowMapper, accountId, startAssetId.value(), size); } public void acknowledge(UUID accountId, FlakeId assetId) { jdbc().update(" UPDATE FeedAsset SET acked = TRUE WHERE accountId = ? AND assetId = ? ", accountId, assetId.value()); } }