From 53a85c0843bc8ea43dad09f183ff922a2a26d1ba Mon Sep 17 00:00:00 2001 From: marc0olo Date: Sat, 22 Aug 2026 00:10:31 +0200 Subject: [PATCH] chore: normalise line endings to lf and enforce it Line endings differed per file and per repository, and an edit made on Windows - or by any tool that normalises newlines - silently rewrote a whole file. That turned a 29 line README change into a 273 line diff and a 101 line change to BaseCache.java into a 459 line diff, which makes a review impossible and a commit look far riskier than it is. Three parts, because none of them is sufficient alone: .gitattributes normalises on `git add`, so a contributor core.autocrlf setting cannot put CRLF into the index. Extensions are listed explicitly rather than relying on `text=auto` alone: event-processor-contract has had a `* text=auto eol=lf` rule since its line ending PR and still carried a CRLF .gitignore and a mixed README, so the heuristic is not something to depend on. Batch files keep CRLF, cmd.exe wants it. `git add --renormalize .`, in this commit, for the files already committed. Adding the attributes does not retroact - that is exactly how the two files above kept their CRLF for years. A CI check, which is the actual guarantee: `git ls-files --eol` reports what is in the index, so anything that slips past the attributes fails the build with the offending files listed. .editorconfig is there so an editor does not fight the attributes in the working tree. Verified per repository with `git diff --cached --ignore-cr-at-eol --stat`: apart from the files this commit adds, nothing changed but line endings. Co-Authored-By: Claude Opus 5 --- .editorconfig | 10 + .gitattributes | 66 +++ .github/workflows/validate.yml | 19 + .gitignore | 2 +- README.md | 8 +- .../avro/shared/realtime/notification.avsc | 60 +- .../avro/shared/realtime/realtime_event.avsc | 84 +-- .../com/kryptokrauts/shared/BaseCache.java | 556 +++++++++--------- .../com/kryptokrauts/shared/BaseMapper.java | 254 ++++---- .../shared/RandomNumberHolder.java | 14 +- .../EntityNotYetAvailableException.java | 22 +- .../contract/exception/RetryException.java | 32 +- .../contract/exception/StacktraceParser.java | 48 +- .../AvroDeserializationFailureHandler.java | 102 ++-- .../AvroSerializationFailureHandler.java | 100 ++-- .../shared/dao/common/AssetBaseEntity.java | 92 +-- .../dao/common/CollectionAuditEntity.java | 88 +-- .../shared/dao/common/CollectionBaseView.java | 100 ++-- .../shared/dao/common/ExchangeRateEntity.java | 42 +- .../shared/dao/common/MarketConfigEntity.java | 132 ++--- .../shared/dao/common/ProfileBaseView.java | 66 +-- .../dao/common/SupportedAssetsEntity.java | 42 +- .../shared/dao/embeddables/Price.java | 72 +-- .../dao/realtime/AuctionBaseEntity.java | 84 +-- .../dao/realtime/BuyofferBaseEntity.java | 94 +-- .../dao/realtime/ListingBaseEntity.java | 76 +-- .../dao/realtime/NotificationEntity.java | 112 ++-- .../dao/realtime/OpenListingBaseEntity.java | 62 +- .../shared/dao/realtime/TaskEntity.java | 130 ++-- .../shared/dao/realtime/TransferEntity.java | 58 +- .../kryptokrauts/shared/enums/MarketType.java | 18 +- .../shared/enums/NotificationContext.java | 12 +- .../shared/enums/NotificationType.java | 30 +- .../kryptokrauts/shared/enums/TaskType.java | 18 +- .../kryptokrauts/shared/model/_BaseModel.java | 50 +- .../shared/model/common/_Account.java | 62 +- .../shared/model/common/_Asset.java | 76 +-- .../model/common/_BlacklistMetadata.java | 50 +- .../shared/model/common/_Collection.java | 88 +-- .../shared/model/common/_MarketConfig.java | 58 +- .../shared/model/common/_PriceInfo.java | 106 ++-- .../shared/model/realtime/_Notification.java | 62 +- .../shared/model/realtime/_Task.java | 66 +-- .../_AuctionOutbidNotification.java | 62 +- .../_ListingSoldNotification.java | 48 +- .../notification/_OfferNotification.java | 70 +-- .../_RoyaltyDecreasedNotification.java | 40 +- .../_RoyaltyReceivedNotification.java | 52 +- .../notification/_TransferNotification.java | 54 +- .../realtime/task/_AuctionEndClaimNFTs.java | 54 +- .../realtime/task/_AuctionEndZeroBids.java | 54 +- .../model/realtime/task/_InvalidListing.java | 54 +- .../model/realtime/task/_InvalidOffer.java | 54 +- .../service/NotificationTransformService.java | 360 ++++++------ .../shared/service/TaskTransformService.java | 202 +++---- 55 files changed, 2261 insertions(+), 2166 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/validate.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f2297eb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# Keeps editors from reintroducing CRLF. The enforcement is .gitattributes plus the CI +# check; this is so a contributor's working tree does not fight it in the first place. +root = true + +[*] +end_of_line = lf +charset = utf-8 + +[*.{bat,cmd}] +end_of_line = crlf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6e7bb60 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,66 @@ +# Line endings are LF in the repository and in the working tree, on every platform. +# Git applies this on `git add`, so a contributor's core.autocrlf setting cannot put CRLF +# into the index. Adding this file does not fix what is already committed - that needs +# `git add --renormalize .` once, which is what the commit introducing this file did. +# +# The extensions are listed explicitly rather than relying on `text=auto` alone: auto +# detection is a heuristic, and this repository had files keep their CRLF for years despite +# a `* text=auto eol=lf` rule. The CI check is the actual guarantee. + +* text=auto eol=lf + +# source and config +*.java text eol=lf +*.kt text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.js text eol=lf +*.jsx text eol=lf +*.mjs text eol=lf +*.cjs text eol=lf +*.json text eol=lf +*.jsonc text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.xml text eol=lf +*.sql text eol=lf +*.avsc text eol=lf +*.md text eol=lf +*.txt text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.html text eol=lf +*.properties text eol=lf +*.sh text eol=lf +*.env text eol=lf +Dockerfile text eol=lf +Makefile text eol=lf + +# read by cmd.exe, which wants CRLF +*.bat text eol=crlf +*.cmd text eol=crlf + +# never converted, never diffed +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.webp binary +*.svg text eol=lf +*.woff binary +*.woff2 binary +*.ttf binary +*.otf binary +*.eot binary +*.pdf binary +*.zip binary +*.gz binary +*.tar binary +*.jar binary +*.wasm binary +*.glb binary +*.gltf binary +*.mp4 binary +*.webm binary +*.avro binary diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 0000000..54d1225 --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,19 @@ +name: validate +on: + push: + workflow_dispatch: + +jobs: + line-endings: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check line endings + run: | + # .gitattributes normalises on add; this catches anything that slipped past it, + # including files committed before the rule existed. Fix with: + # git add --renormalize . && git commit + if git ls-files --eol | grep -E '^i/(crlf|mixed)'; then + echo '::error::the files listed above have CRLF or mixed line endings in the index' + exit 1 + fi diff --git a/.gitignore b/.gitignore index 1ee6c38..6927e56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -.lh/ +.lh/ .classpath \ No newline at end of file diff --git a/README.md b/README.md index a576447..d824688 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Event processor contract shared -Git submodule for shared files of event-processor-contract implementation. - -- parent pom +# Event processor contract shared +Git submodule for shared files of event-processor-contract implementation. + +- parent pom - common AVRO schemata \ No newline at end of file diff --git a/src/main/avro/shared/realtime/notification.avsc b/src/main/avro/shared/realtime/notification.avsc index d6647ea..0b36f92 100644 --- a/src/main/avro/shared/realtime/notification.avsc +++ b/src/main/avro/shared/realtime/notification.avsc @@ -1,31 +1,31 @@ -{ - "type": "record", - "name": "notification", - "namespace": "contracts", - "fields": [ - { - "name": "id", - "type": "long" - }, - { - "name": "blocknum", - "type": "long" - }, - { - "name": "block_timestamp", - "type": "long" - }, - { - "name": "account", - "type": "string" - }, - { - "name": "context", - "type": "string" - }, - { - "name": "data", - "type": "string" - } - ] +{ + "type": "record", + "name": "notification", + "namespace": "contracts", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "blocknum", + "type": "long" + }, + { + "name": "block_timestamp", + "type": "long" + }, + { + "name": "account", + "type": "string" + }, + { + "name": "context", + "type": "string" + }, + { + "name": "data", + "type": "string" + } + ] } \ No newline at end of file diff --git a/src/main/avro/shared/realtime/realtime_event.avsc b/src/main/avro/shared/realtime/realtime_event.avsc index 771b291..2f5b57c 100644 --- a/src/main/avro/shared/realtime/realtime_event.avsc +++ b/src/main/avro/shared/realtime/realtime_event.avsc @@ -1,43 +1,43 @@ -{ - "type": "record", - "name": "realtime_event", - "namespace": "contracts", - "fields": [ - { - "name": "blocknum", - "type": "long" - }, - { - "name": "block_timestamp", - "type": "long" - }, - { - "name": "global_sequence", - "type": "long" - }, - { - "name": "asset_id", - "type": ["null","long"] - }, - { - "name": "template_id", - "type": ["null","long"] - }, - { - "name": "collection_id", - "type": "string" - }, - { - "name": "context", - "type": "string" - }, - { - "name": "type", - "type": "string" - }, - { - "name": "data", - "type": ["null","string"] - } - ] +{ + "type": "record", + "name": "realtime_event", + "namespace": "contracts", + "fields": [ + { + "name": "blocknum", + "type": "long" + }, + { + "name": "block_timestamp", + "type": "long" + }, + { + "name": "global_sequence", + "type": "long" + }, + { + "name": "asset_id", + "type": ["null","long"] + }, + { + "name": "template_id", + "type": ["null","long"] + }, + { + "name": "collection_id", + "type": "string" + }, + { + "name": "context", + "type": "string" + }, + { + "name": "type", + "type": "string" + }, + { + "name": "data", + "type": ["null","string"] + } + ] } \ No newline at end of file diff --git a/src/main/java/com/kryptokrauts/shared/BaseCache.java b/src/main/java/com/kryptokrauts/shared/BaseCache.java index 9733567..7d77dad 100644 --- a/src/main/java/com/kryptokrauts/shared/BaseCache.java +++ b/src/main/java/com/kryptokrauts/shared/BaseCache.java @@ -1,278 +1,278 @@ -package com.kryptokrauts.shared; - -import com.kryptokrauts.shared.dao.common.CollectionAuditEntity; -import com.kryptokrauts.shared.dao.common.ExchangeRateEntity; -import com.kryptokrauts.shared.dao.common.MarketConfigEntity; -import com.kryptokrauts.shared.dao.common.ProfileBaseView; -import com.kryptokrauts.shared.dao.common.SupportedAssetsEntity; -import com.kryptokrauts.shared.model.common._Account; -import com.kryptokrauts.shared.model.common._BlacklistMetadata; -import com.kryptokrauts.shared.model.common._MarketConfig; -import io.quarkus.runtime.StartupEvent; -import io.quarkus.scheduler.Scheduled; -import jakarta.enterprise.context.control.ActivateRequestContext; -import jakarta.enterprise.event.Observes; -import jakarta.inject.Singleton; -import jakarta.transaction.Transactional; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import org.jboss.logging.Logger; - -@Singleton -public class BaseCache { - - protected static final Logger logger = Logger.getLogger(BaseCache.class); - - private static Map profileCache = new HashMap<>(); - - private static Map exchangeRateCache; - - private static _MarketConfig marketConfigCache; - - private static Map collectionShieldedCache = new HashMap<>(); - - private static Map collectionBlacklistedCache = new HashMap<>(); - - private static Map supportedAssetsCache = new HashMap<>(); - - public static _MarketConfig getMarketConfigCache() { - return marketConfigCache; - } - - public static Map getExchangeRateCache() { - return exchangeRateCache; - } - - public static Boolean isShielded(String collectionId) { - return collectionShieldedCache.containsKey(collectionId); - } - - public static Boolean isBlacklisted(String collectionId) { - return collectionBlacklistedCache.containsKey(collectionId); - } - - public static _Account getAccountFromCache(String account) { - return profileCache.containsKey(account) ? profileCache.get(account) : null; - } - - public static Integer getTokenPrecision(String token) { - if (!supportedAssetsCache.containsKey(token)) { - SupportedAssetsEntity supportedAssets = - SupportedAssetsEntity.find("token = ?1", token).firstResult(); - supportedAssetsCache.put(token, supportedAssets.getPrecision()); - } - return supportedAssetsCache.get(token); - } - - /*- - * fill every cache once at startup. - * - * @Scheduled(every = ...) does not fire at boot, it fires one interval later, so without this - * every cache is empty for that first interval after each deploy. What that costs depends on the - * cache, and the two groups below are treated differently for that reason. - * - * The market config and the exchange rates are dereferenced without a null check in - * BaseMapper.buildPriceInfo, and both start as null rather than empty. So until they are filled, - * every response carrying a price fails with a NullPointerException - for ten minutes in the case - * of the exchange rates and, with cache.refresh.market_config = P1d, for up to a day in the case - * of the market config. Those two are required: failing to start is better than starting a - * service that reports itself healthy and answers every priced request with a 500. - * - * The rest degrade instead of failing - a missing profile costs a KYC badge, see - * kryptokrauts/event-processor-contract#11, a missing shielded list costs an icon - and the - * scheduled refresh retries within the hour. Those are filled best effort, so a database that is - * briefly unreachable at boot does not take the service down over a badge. - * - * The request context is activated for the same reason the scheduled methods have one - the reads - * below need a Hibernate session. - */ - @ActivateRequestContext - void populateCachesAtStartup(@Observes StartupEvent event) { - long start = System.currentTimeMillis(); - logger.info("Populating caches at startup"); - - // required, see above: their absence is a NullPointerException and not a degraded value - this.refreshMarketConfigCache(); - this.refreshExchangeRateCache(); - - // best effort: a miss degrades and the scheduled refresh will retry - this.fillSafely("profiles", this::refreshProfileCache); - this.fillSafely("shielded collections", this::refreshShieldedCollectionsCache); - this.fillSafely("blacklisted collections", this::refreshBlacklistedCollectionsCache); - this.fillSafely("supported assets", this::refreshSupportedAssetsCache); - - logger.infof("Populating caches at startup took %s ms", System.currentTimeMillis() - start); - } - - private void fillSafely(String name, Runnable refresh) { - try { - refresh.run(); - } catch (Exception e) { - logger.errorf( - e, "Could not populate the %s cache at startup, the scheduled refresh will retry", name); - } - } - - @Scheduled(every = "{cache.refresh.exchange_rates}") - public void refreshExchangeRate() { - this.refreshExchangeRateCache(); - } - - @Scheduled(every = "{cache.refresh.profiles}") - public void refreshProfiles() { - this.refreshProfileCache(); - } - - @Scheduled(every = "{cache.refresh.shielded_collections}") - public void refreshShieldedCollections() { - this.refreshShieldedCollectionsCache(); - } - - @Scheduled(every = "{cache.refresh.blacklisted_collections}") - public void refreshBlacklistedCollections() { - this.refreshBlacklistedCollectionsCache(); - } - - @Scheduled(every = "{cache.refresh.market_config}") - public void refreshMarketConfig() { - this.refreshMarketConfigCache(); - } - - @Scheduled(every = "{cache.refresh.supported_assets}") - public void refreshSupportedAssets() { - this.refreshSupportedAssetsCache(); - } - - @Transactional - protected void refreshExchangeRateCache() { - long start = System.currentTimeMillis(); - - List exchangeRateList = ExchangeRateEntity.listAll(); - Map tempCache = - exchangeRateList.stream() - .collect( - keepFirst( - "exchange rates", - ExchangeRateEntity::getTokenSymbol, - ExchangeRateEntity::getUsd)); - exchangeRateCache = tempCache; - - logger.infof( - "Refresh of exchange rates cache took %s ms", (System.currentTimeMillis() - start)); - } - - @Transactional - protected void refreshMarketConfigCache() { - long start = System.currentTimeMillis(); - - marketConfigCache = MarketConfigEntity.findLatest().toModel(); - - logger.infof("Refresh of market config cache took %s ms", (System.currentTimeMillis() - start)); - } - - @Transactional - protected void refreshProfileCache() { - long start = System.currentTimeMillis(); - - List profileList = ProfileBaseView.listAll(); - Map tempCache = - profileList.stream() - .collect( - Collectors.toMap( - ProfileBaseView::getAccount, - ProfileBaseView::toModel, - // an account with several rows means the source view returns more than one, - // which is a data problem to fix at the source - see #11. Until then the - // conflict is resolved towards not verified: one of those rows can be a - // revocation, and a kyc badge is a claim about a real person, so showing one - // that is not true is worse than showing none. Either way the whole cache must - // not be lost over a single row - (first, second) -> { - _Account kept = Boolean.TRUE.equals(first.getHasKYC()) ? second : first; - logger.warnf( - "Profile cache: account %s has several rows in" - + " soonmarket_profile_base_v, resolving to hasKYC = %s", - kept.getName(), kept.getHasKYC()); - return kept; - })); - profileCache = tempCache; - - logger.infof("Refresh of profile cache took %s ms", (System.currentTimeMillis() - start)); - } - - @Transactional - protected void refreshShieldedCollectionsCache() { - long start = System.currentTimeMillis(); - - List collectionList = CollectionAuditEntity.getShieldedCollections(); - Map tmpCollectionShieldedCache = new HashMap<>(); - collectionList.forEach(c -> tmpCollectionShieldedCache.put(c.getCollectionId(), true)); - collectionShieldedCache = tmpCollectionShieldedCache; - - logger.infof( - "Refresh of shielded collections took %s ms", (System.currentTimeMillis() - start)); - } - - @Transactional - protected void refreshBlacklistedCollectionsCache() { - long start = System.currentTimeMillis(); - - List collectionList = CollectionAuditEntity.getBlacklistedCollections(); - Map tmpCollectionBlacklistCache = new HashMap<>(); - collectionList.forEach( - c -> - tmpCollectionBlacklistCache.put( - c.getCollectionId(), - _BlacklistMetadata.builder() - .blacklistDate(BaseMapper.mapDate(c.getBlacklistDate())) - .reason(c.getBlacklistReason()) - .actor(c.getBlacklistActor()) - .build())); - collectionBlacklistedCache = tmpCollectionBlacklistCache; - - logger.infof( - "Refresh of blacklisted collections took %s ms", (System.currentTimeMillis() - start)); - } - - @Transactional - protected void refreshSupportedAssetsCache() { - long start = System.currentTimeMillis(); - - List supportedAssets = SupportedAssetsEntity.listAll(); - Map tempCache = - supportedAssets.stream() - .collect( - keepFirst( - "supported assets", - SupportedAssetsEntity::getToken, - SupportedAssetsEntity::getPrecision)); - supportedAssetsCache = tempCache; - - logger.infof("Refresh of supported assets took %s ms", (System.currentTimeMillis() - start)); - } - - /*- - * toMap that survives a duplicate key instead of throwing. - * - * The two argument Collectors.toMap throws IllegalStateException on a duplicate, which fails the - * whole refresh - and since the cache is only assigned on success, the previous contents stay, - * or nothing at all if it never succeeded once. A single duplicated row then costs the entire - * cache rather than one entry. Keeping the first value and warning about it is the better trade: - * one entry may be wrong, the rest keeps working, and the data problem stays visible in the log. - */ - private static Collector> keepFirst( - String cacheName, Function key, Function value) { - BinaryOperator keepFirstAndWarn = - (first, second) -> { - logger.warnf( - "%s cache: duplicate entry, keeping %s and ignoring %s", cacheName, first, second); - return first; - }; - return Collectors.toMap(key, value, keepFirstAndWarn); - } -} +package com.kryptokrauts.shared; + +import com.kryptokrauts.shared.dao.common.CollectionAuditEntity; +import com.kryptokrauts.shared.dao.common.ExchangeRateEntity; +import com.kryptokrauts.shared.dao.common.MarketConfigEntity; +import com.kryptokrauts.shared.dao.common.ProfileBaseView; +import com.kryptokrauts.shared.dao.common.SupportedAssetsEntity; +import com.kryptokrauts.shared.model.common._Account; +import com.kryptokrauts.shared.model.common._BlacklistMetadata; +import com.kryptokrauts.shared.model.common._MarketConfig; +import io.quarkus.runtime.StartupEvent; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Singleton; +import jakarta.transaction.Transactional; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.stream.Collector; +import java.util.stream.Collectors; +import org.jboss.logging.Logger; + +@Singleton +public class BaseCache { + + protected static final Logger logger = Logger.getLogger(BaseCache.class); + + private static Map profileCache = new HashMap<>(); + + private static Map exchangeRateCache; + + private static _MarketConfig marketConfigCache; + + private static Map collectionShieldedCache = new HashMap<>(); + + private static Map collectionBlacklistedCache = new HashMap<>(); + + private static Map supportedAssetsCache = new HashMap<>(); + + public static _MarketConfig getMarketConfigCache() { + return marketConfigCache; + } + + public static Map getExchangeRateCache() { + return exchangeRateCache; + } + + public static Boolean isShielded(String collectionId) { + return collectionShieldedCache.containsKey(collectionId); + } + + public static Boolean isBlacklisted(String collectionId) { + return collectionBlacklistedCache.containsKey(collectionId); + } + + public static _Account getAccountFromCache(String account) { + return profileCache.containsKey(account) ? profileCache.get(account) : null; + } + + public static Integer getTokenPrecision(String token) { + if (!supportedAssetsCache.containsKey(token)) { + SupportedAssetsEntity supportedAssets = + SupportedAssetsEntity.find("token = ?1", token).firstResult(); + supportedAssetsCache.put(token, supportedAssets.getPrecision()); + } + return supportedAssetsCache.get(token); + } + + /*- + * fill every cache once at startup. + * + * @Scheduled(every = ...) does not fire at boot, it fires one interval later, so without this + * every cache is empty for that first interval after each deploy. What that costs depends on the + * cache, and the two groups below are treated differently for that reason. + * + * The market config and the exchange rates are dereferenced without a null check in + * BaseMapper.buildPriceInfo, and both start as null rather than empty. So until they are filled, + * every response carrying a price fails with a NullPointerException - for ten minutes in the case + * of the exchange rates and, with cache.refresh.market_config = P1d, for up to a day in the case + * of the market config. Those two are required: failing to start is better than starting a + * service that reports itself healthy and answers every priced request with a 500. + * + * The rest degrade instead of failing - a missing profile costs a KYC badge, see + * kryptokrauts/event-processor-contract#11, a missing shielded list costs an icon - and the + * scheduled refresh retries within the hour. Those are filled best effort, so a database that is + * briefly unreachable at boot does not take the service down over a badge. + * + * The request context is activated for the same reason the scheduled methods have one - the reads + * below need a Hibernate session. + */ + @ActivateRequestContext + void populateCachesAtStartup(@Observes StartupEvent event) { + long start = System.currentTimeMillis(); + logger.info("Populating caches at startup"); + + // required, see above: their absence is a NullPointerException and not a degraded value + this.refreshMarketConfigCache(); + this.refreshExchangeRateCache(); + + // best effort: a miss degrades and the scheduled refresh will retry + this.fillSafely("profiles", this::refreshProfileCache); + this.fillSafely("shielded collections", this::refreshShieldedCollectionsCache); + this.fillSafely("blacklisted collections", this::refreshBlacklistedCollectionsCache); + this.fillSafely("supported assets", this::refreshSupportedAssetsCache); + + logger.infof("Populating caches at startup took %s ms", System.currentTimeMillis() - start); + } + + private void fillSafely(String name, Runnable refresh) { + try { + refresh.run(); + } catch (Exception e) { + logger.errorf( + e, "Could not populate the %s cache at startup, the scheduled refresh will retry", name); + } + } + + @Scheduled(every = "{cache.refresh.exchange_rates}") + public void refreshExchangeRate() { + this.refreshExchangeRateCache(); + } + + @Scheduled(every = "{cache.refresh.profiles}") + public void refreshProfiles() { + this.refreshProfileCache(); + } + + @Scheduled(every = "{cache.refresh.shielded_collections}") + public void refreshShieldedCollections() { + this.refreshShieldedCollectionsCache(); + } + + @Scheduled(every = "{cache.refresh.blacklisted_collections}") + public void refreshBlacklistedCollections() { + this.refreshBlacklistedCollectionsCache(); + } + + @Scheduled(every = "{cache.refresh.market_config}") + public void refreshMarketConfig() { + this.refreshMarketConfigCache(); + } + + @Scheduled(every = "{cache.refresh.supported_assets}") + public void refreshSupportedAssets() { + this.refreshSupportedAssetsCache(); + } + + @Transactional + protected void refreshExchangeRateCache() { + long start = System.currentTimeMillis(); + + List exchangeRateList = ExchangeRateEntity.listAll(); + Map tempCache = + exchangeRateList.stream() + .collect( + keepFirst( + "exchange rates", + ExchangeRateEntity::getTokenSymbol, + ExchangeRateEntity::getUsd)); + exchangeRateCache = tempCache; + + logger.infof( + "Refresh of exchange rates cache took %s ms", (System.currentTimeMillis() - start)); + } + + @Transactional + protected void refreshMarketConfigCache() { + long start = System.currentTimeMillis(); + + marketConfigCache = MarketConfigEntity.findLatest().toModel(); + + logger.infof("Refresh of market config cache took %s ms", (System.currentTimeMillis() - start)); + } + + @Transactional + protected void refreshProfileCache() { + long start = System.currentTimeMillis(); + + List profileList = ProfileBaseView.listAll(); + Map tempCache = + profileList.stream() + .collect( + Collectors.toMap( + ProfileBaseView::getAccount, + ProfileBaseView::toModel, + // an account with several rows means the source view returns more than one, + // which is a data problem to fix at the source - see #11. Until then the + // conflict is resolved towards not verified: one of those rows can be a + // revocation, and a kyc badge is a claim about a real person, so showing one + // that is not true is worse than showing none. Either way the whole cache must + // not be lost over a single row + (first, second) -> { + _Account kept = Boolean.TRUE.equals(first.getHasKYC()) ? second : first; + logger.warnf( + "Profile cache: account %s has several rows in" + + " soonmarket_profile_base_v, resolving to hasKYC = %s", + kept.getName(), kept.getHasKYC()); + return kept; + })); + profileCache = tempCache; + + logger.infof("Refresh of profile cache took %s ms", (System.currentTimeMillis() - start)); + } + + @Transactional + protected void refreshShieldedCollectionsCache() { + long start = System.currentTimeMillis(); + + List collectionList = CollectionAuditEntity.getShieldedCollections(); + Map tmpCollectionShieldedCache = new HashMap<>(); + collectionList.forEach(c -> tmpCollectionShieldedCache.put(c.getCollectionId(), true)); + collectionShieldedCache = tmpCollectionShieldedCache; + + logger.infof( + "Refresh of shielded collections took %s ms", (System.currentTimeMillis() - start)); + } + + @Transactional + protected void refreshBlacklistedCollectionsCache() { + long start = System.currentTimeMillis(); + + List collectionList = CollectionAuditEntity.getBlacklistedCollections(); + Map tmpCollectionBlacklistCache = new HashMap<>(); + collectionList.forEach( + c -> + tmpCollectionBlacklistCache.put( + c.getCollectionId(), + _BlacklistMetadata.builder() + .blacklistDate(BaseMapper.mapDate(c.getBlacklistDate())) + .reason(c.getBlacklistReason()) + .actor(c.getBlacklistActor()) + .build())); + collectionBlacklistedCache = tmpCollectionBlacklistCache; + + logger.infof( + "Refresh of blacklisted collections took %s ms", (System.currentTimeMillis() - start)); + } + + @Transactional + protected void refreshSupportedAssetsCache() { + long start = System.currentTimeMillis(); + + List supportedAssets = SupportedAssetsEntity.listAll(); + Map tempCache = + supportedAssets.stream() + .collect( + keepFirst( + "supported assets", + SupportedAssetsEntity::getToken, + SupportedAssetsEntity::getPrecision)); + supportedAssetsCache = tempCache; + + logger.infof("Refresh of supported assets took %s ms", (System.currentTimeMillis() - start)); + } + + /*- + * toMap that survives a duplicate key instead of throwing. + * + * The two argument Collectors.toMap throws IllegalStateException on a duplicate, which fails the + * whole refresh - and since the cache is only assigned on success, the previous contents stay, + * or nothing at all if it never succeeded once. A single duplicated row then costs the entire + * cache rather than one entry. Keeping the first value and warning about it is the better trade: + * one entry may be wrong, the rest keeps working, and the data problem stays visible in the log. + */ + private static Collector> keepFirst( + String cacheName, Function key, Function value) { + BinaryOperator keepFirstAndWarn = + (first, second) -> { + logger.warnf( + "%s cache: duplicate entry, keeping %s and ignoring %s", cacheName, first, second); + return first; + }; + return Collectors.toMap(key, value, keepFirstAndWarn); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/BaseMapper.java b/src/main/java/com/kryptokrauts/shared/BaseMapper.java index 474490b..2cb56ed 100644 --- a/src/main/java/com/kryptokrauts/shared/BaseMapper.java +++ b/src/main/java/com/kryptokrauts/shared/BaseMapper.java @@ -1,127 +1,127 @@ -package com.kryptokrauts.shared; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.kryptokrauts.shared.model.common._Account; -import com.kryptokrauts.shared.model.common._PriceInfo; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.Instant; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import org.apache.commons.lang3.StringUtils; - -public class BaseMapper { - - public static final List ACCOUNT_IDENTIFIER = - List.of( - "owner", "seller", "creator", "buyer", "from", "to", "burnedBy", "bidder", "receiver"); - - public static ObjectMapper objectMapper = new ObjectMapper(); - - public static _Account mapAccount(String name) { - if (StringUtils.isNotBlank(name)) { - _Account account = BaseCache.getAccountFromCache(name); - if (account != null) { - return account; - } else { - return _Account.builder().name(name).build(); - } - } - return null; - } - - public static Date mapDate(Long date) { - if (date != null) { - return Date.from(Instant.ofEpochMilli(date)); - } - return null; - } - - public static _PriceInfo buildPriceInfo(String token, Double price, Double royalty) { - return buildPriceInfo(token, price, royalty, null, null); - } - - public static _PriceInfo buildPriceInfo( - String token, Double price, Double royalty, Double makerMarketFee, Double takerMarketFee) { - return buildPriceInfo(token, price, null, royalty, makerMarketFee, takerMarketFee); - } - - public static _PriceInfo buildPriceInfo( - String token, - Double price, - Double priceUSD, - Double royalty, - Double makerMarketFee, - Double takerMarketFee) { - if (StringUtils.isNotBlank(token) && price != null) { - - Double mmf = - makerMarketFee != null ? makerMarketFee : BaseCache.getMarketConfigCache().getMaker_fee(); - Double tmf = - takerMarketFee != null ? takerMarketFee : BaseCache.getMarketConfigCache().getTaker_fee(); - Double marketFee = mmf + tmf; - - String rawPrice = null; - Integer precision = BaseCache.getTokenPrecision(token); - if (precision != null) { - BigDecimal bd = BigDecimal.valueOf(price); - bd = bd.setScale(precision, RoundingMode.HALF_UP); - rawPrice = String.format(Locale.US, "%." + precision + "f %s", bd, token); - } - - Double royaltyPrice = royalty != null ? royalty * price : null; - Double marketFeePrice = marketFee != null ? marketFee * price : null; - - priceUSD = - roundTo( - priceUSD != null - ? priceUSD - : price - * (BaseCache.getExchangeRateCache().containsKey(token) - ? BaseCache.getExchangeRateCache().get(token) - : 0)); - Double royaltyUSD = royalty != null ? roundTo(priceUSD * royalty) : null; - Double marketFeeUSD = marketFee != null ? roundTo(priceUSD * marketFee) : null; - - // seller receives info - Double sellerReceivedPrice = - roundTo( - price * (1 - (royalty != null ? royalty : 0) - (marketFee != null ? marketFee : 0))); - Double sellerReceivedPriceUSD = - roundTo( - priceUSD - - (royaltyUSD != null ? royaltyUSD : 0) - - (marketFeeUSD != null ? marketFeeUSD : 0)); - - return _PriceInfo.builder() - .paymentAsset(token) - .price(price) - .royalty(royalty) - .priceUSD(priceUSD) - .royaltyUSD(royaltyUSD) - .makerMarketFee(mmf) - .takerMarketFee(tmf) - .rawPrice(rawPrice) - .marketFeeUSD(marketFeeUSD) - .sellerReceivedPrice(sellerReceivedPrice) - .sellerReceivedPriceUSD(sellerReceivedPriceUSD) - .royaltyPrice(royaltyPrice) - .marketFeePrice(marketFeePrice) - .build(); - } - return null; - } - - public static Double roundTo(Double value, int decimals) { - return Math.round(value * Math.pow(10, decimals)) / Double.valueOf(Math.pow(10, decimals)); - } - - public static Double roundTo(Double value) { - return roundTo(value, 2); - } - - public static Integer toZero(Integer value) { - return value != null ? value : 0; - } -} +package com.kryptokrauts.shared; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kryptokrauts.shared.model.common._Account; +import com.kryptokrauts.shared.model.common._PriceInfo; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Instant; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import org.apache.commons.lang3.StringUtils; + +public class BaseMapper { + + public static final List ACCOUNT_IDENTIFIER = + List.of( + "owner", "seller", "creator", "buyer", "from", "to", "burnedBy", "bidder", "receiver"); + + public static ObjectMapper objectMapper = new ObjectMapper(); + + public static _Account mapAccount(String name) { + if (StringUtils.isNotBlank(name)) { + _Account account = BaseCache.getAccountFromCache(name); + if (account != null) { + return account; + } else { + return _Account.builder().name(name).build(); + } + } + return null; + } + + public static Date mapDate(Long date) { + if (date != null) { + return Date.from(Instant.ofEpochMilli(date)); + } + return null; + } + + public static _PriceInfo buildPriceInfo(String token, Double price, Double royalty) { + return buildPriceInfo(token, price, royalty, null, null); + } + + public static _PriceInfo buildPriceInfo( + String token, Double price, Double royalty, Double makerMarketFee, Double takerMarketFee) { + return buildPriceInfo(token, price, null, royalty, makerMarketFee, takerMarketFee); + } + + public static _PriceInfo buildPriceInfo( + String token, + Double price, + Double priceUSD, + Double royalty, + Double makerMarketFee, + Double takerMarketFee) { + if (StringUtils.isNotBlank(token) && price != null) { + + Double mmf = + makerMarketFee != null ? makerMarketFee : BaseCache.getMarketConfigCache().getMaker_fee(); + Double tmf = + takerMarketFee != null ? takerMarketFee : BaseCache.getMarketConfigCache().getTaker_fee(); + Double marketFee = mmf + tmf; + + String rawPrice = null; + Integer precision = BaseCache.getTokenPrecision(token); + if (precision != null) { + BigDecimal bd = BigDecimal.valueOf(price); + bd = bd.setScale(precision, RoundingMode.HALF_UP); + rawPrice = String.format(Locale.US, "%." + precision + "f %s", bd, token); + } + + Double royaltyPrice = royalty != null ? royalty * price : null; + Double marketFeePrice = marketFee != null ? marketFee * price : null; + + priceUSD = + roundTo( + priceUSD != null + ? priceUSD + : price + * (BaseCache.getExchangeRateCache().containsKey(token) + ? BaseCache.getExchangeRateCache().get(token) + : 0)); + Double royaltyUSD = royalty != null ? roundTo(priceUSD * royalty) : null; + Double marketFeeUSD = marketFee != null ? roundTo(priceUSD * marketFee) : null; + + // seller receives info + Double sellerReceivedPrice = + roundTo( + price * (1 - (royalty != null ? royalty : 0) - (marketFee != null ? marketFee : 0))); + Double sellerReceivedPriceUSD = + roundTo( + priceUSD + - (royaltyUSD != null ? royaltyUSD : 0) + - (marketFeeUSD != null ? marketFeeUSD : 0)); + + return _PriceInfo.builder() + .paymentAsset(token) + .price(price) + .royalty(royalty) + .priceUSD(priceUSD) + .royaltyUSD(royaltyUSD) + .makerMarketFee(mmf) + .takerMarketFee(tmf) + .rawPrice(rawPrice) + .marketFeeUSD(marketFeeUSD) + .sellerReceivedPrice(sellerReceivedPrice) + .sellerReceivedPriceUSD(sellerReceivedPriceUSD) + .royaltyPrice(royaltyPrice) + .marketFeePrice(marketFeePrice) + .build(); + } + return null; + } + + public static Double roundTo(Double value, int decimals) { + return Math.round(value * Math.pow(10, decimals)) / Double.valueOf(Math.pow(10, decimals)); + } + + public static Double roundTo(Double value) { + return roundTo(value, 2); + } + + public static Integer toZero(Integer value) { + return value != null ? value : 0; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/RandomNumberHolder.java b/src/main/java/com/kryptokrauts/shared/RandomNumberHolder.java index ec8f5ae..4b55201 100644 --- a/src/main/java/com/kryptokrauts/shared/RandomNumberHolder.java +++ b/src/main/java/com/kryptokrauts/shared/RandomNumberHolder.java @@ -1,7 +1,7 @@ -package com.kryptokrauts.shared; - -import java.util.Random; - -public final class RandomNumberHolder { - public static final Random randomNumberGenerator = new Random(); -} +package com.kryptokrauts.shared; + +import java.util.Random; + +public final class RandomNumberHolder { + public static final Random randomNumberGenerator = new Random(); +} diff --git a/src/main/java/com/kryptokrauts/shared/contract/exception/EntityNotYetAvailableException.java b/src/main/java/com/kryptokrauts/shared/contract/exception/EntityNotYetAvailableException.java index 9be791d..f0d17fb 100644 --- a/src/main/java/com/kryptokrauts/shared/contract/exception/EntityNotYetAvailableException.java +++ b/src/main/java/com/kryptokrauts/shared/contract/exception/EntityNotYetAvailableException.java @@ -1,11 +1,11 @@ -package com.kryptokrauts.shared.contract.exception; - -public class EntityNotYetAvailableException extends RuntimeException { - public EntityNotYetAvailableException(String msg) { - super(msg); - } - - public EntityNotYetAvailableException() { - super(); - } -} +package com.kryptokrauts.shared.contract.exception; + +public class EntityNotYetAvailableException extends RuntimeException { + public EntityNotYetAvailableException(String msg) { + super(msg); + } + + public EntityNotYetAvailableException() { + super(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/contract/exception/RetryException.java b/src/main/java/com/kryptokrauts/shared/contract/exception/RetryException.java index aec9627..d7c67d9 100644 --- a/src/main/java/com/kryptokrauts/shared/contract/exception/RetryException.java +++ b/src/main/java/com/kryptokrauts/shared/contract/exception/RetryException.java @@ -1,16 +1,16 @@ -package com.kryptokrauts.shared.contract.exception; - -public class RetryException extends RuntimeException { - - public RetryException(String msg, Exception e) { - super(msg, e); - } - - public RetryException(Exception e) { - super(e); - } - - public RetryException(String msg) { - super(msg); - } -} +package com.kryptokrauts.shared.contract.exception; + +public class RetryException extends RuntimeException { + + public RetryException(String msg, Exception e) { + super(msg, e); + } + + public RetryException(Exception e) { + super(e); + } + + public RetryException(String msg) { + super(msg); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/contract/exception/StacktraceParser.java b/src/main/java/com/kryptokrauts/shared/contract/exception/StacktraceParser.java index 9835e75..75b20b1 100644 --- a/src/main/java/com/kryptokrauts/shared/contract/exception/StacktraceParser.java +++ b/src/main/java/com/kryptokrauts/shared/contract/exception/StacktraceParser.java @@ -1,24 +1,24 @@ -package com.kryptokrauts.shared.contract.exception; - -import java.util.Arrays; -import java.util.stream.Collectors; - -public class StacktraceParser { - - public static String getRelevantLines(Exception ex) { - - String relevantStacktrace = null; - - if (ex.getStackTrace() != null) { - relevantStacktrace = - Arrays.asList(ex.getStackTrace()).stream() - .filter(s -> s.getClassName().contains("kryptokrauts")) - .map( - e -> - String.format( - "%s.%s:%s", e.getClassName(), e.getMethodName(), e.getLineNumber())) - .collect(Collectors.joining("\n")); - } - return relevantStacktrace; - } -} +package com.kryptokrauts.shared.contract.exception; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class StacktraceParser { + + public static String getRelevantLines(Exception ex) { + + String relevantStacktrace = null; + + if (ex.getStackTrace() != null) { + relevantStacktrace = + Arrays.asList(ex.getStackTrace()).stream() + .filter(s -> s.getClassName().contains("kryptokrauts")) + .map( + e -> + String.format( + "%s.%s:%s", e.getClassName(), e.getMethodName(), e.getLineNumber())) + .collect(Collectors.joining("\n")); + } + return relevantStacktrace; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroDeserializationFailureHandler.java b/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroDeserializationFailureHandler.java index 7389697..a6b5ffa 100644 --- a/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroDeserializationFailureHandler.java +++ b/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroDeserializationFailureHandler.java @@ -1,51 +1,51 @@ -package com.kryptokrauts.shared.contract.handlers; - -import io.smallrye.common.annotation.Identifier; -import io.smallrye.mutiny.Uni; -import io.smallrye.reactive.messaging.kafka.DeserializationFailureHandler; -import jakarta.enterprise.context.ApplicationScoped; -import java.time.Duration; -import org.apache.avro.specific.SpecificRecordBase; -import org.apache.kafka.common.header.Headers; -import org.jboss.logging.Logger; - -@ApplicationScoped -@Identifier("avro-deserialization-failure-handler") -public class AvroDeserializationFailureHandler - implements DeserializationFailureHandler { - - protected static final Logger logger = Logger.getLogger(AvroDeserializationFailureHandler.class); - - @Override - public SpecificRecordBase handleDeserializationFailure( - String topic, - boolean isKey, - String deserializer, - byte[] data, - Exception exception, - Headers headers) { - - StringBuffer buffer = new StringBuffer(); - headers.forEach(h -> buffer.append(h.key() + ":" + h.value())); - throw new RuntimeException( - String.format("Error deserializing message of type %s: %s", buffer.toString(), data)); - } - - @Override - public SpecificRecordBase decorateDeserialization( - Uni deserialization, - String topic, - boolean isKey, - String deserializer, - byte[] data, - Headers headers) { - - return deserialization - .onFailure() - .retry() - .withBackOff(Duration.ofSeconds(1)) - .atMost(10) - .await() - .atMost(Duration.ofSeconds(60)); - } -} +package com.kryptokrauts.shared.contract.handlers; + +import io.smallrye.common.annotation.Identifier; +import io.smallrye.mutiny.Uni; +import io.smallrye.reactive.messaging.kafka.DeserializationFailureHandler; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Duration; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.header.Headers; +import org.jboss.logging.Logger; + +@ApplicationScoped +@Identifier("avro-deserialization-failure-handler") +public class AvroDeserializationFailureHandler + implements DeserializationFailureHandler { + + protected static final Logger logger = Logger.getLogger(AvroDeserializationFailureHandler.class); + + @Override + public SpecificRecordBase handleDeserializationFailure( + String topic, + boolean isKey, + String deserializer, + byte[] data, + Exception exception, + Headers headers) { + + StringBuffer buffer = new StringBuffer(); + headers.forEach(h -> buffer.append(h.key() + ":" + h.value())); + throw new RuntimeException( + String.format("Error deserializing message of type %s: %s", buffer.toString(), data)); + } + + @Override + public SpecificRecordBase decorateDeserialization( + Uni deserialization, + String topic, + boolean isKey, + String deserializer, + byte[] data, + Headers headers) { + + return deserialization + .onFailure() + .retry() + .withBackOff(Duration.ofSeconds(1)) + .atMost(10) + .await() + .atMost(Duration.ofSeconds(60)); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroSerializationFailureHandler.java b/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroSerializationFailureHandler.java index b29bcc7..b9add4a 100644 --- a/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroSerializationFailureHandler.java +++ b/src/main/java/com/kryptokrauts/shared/contract/handlers/AvroSerializationFailureHandler.java @@ -1,50 +1,50 @@ -package com.kryptokrauts.shared.contract.handlers; - -import io.smallrye.common.annotation.Identifier; -import io.smallrye.mutiny.Uni; -import io.smallrye.reactive.messaging.kafka.SerializationFailureHandler; -import jakarta.enterprise.context.ApplicationScoped; -import java.time.Duration; -import org.apache.avro.specific.SpecificRecordBase; -import org.apache.kafka.common.header.Headers; -import org.jboss.logging.Logger; - -@ApplicationScoped -@Identifier("avro-serialization-failure-handler") -public class AvroSerializationFailureHandler - implements SerializationFailureHandler { - - protected static final Logger logger = Logger.getLogger(AvroSerializationFailureHandler.class); - - @Override - public byte[] handleSerializationFailure( - String topic, - boolean isKey, - String serializer, - SpecificRecordBase data, - Exception exception, - Headers headers) { - - StringBuffer buffer = new StringBuffer(); - headers.forEach(h -> buffer.append(h.key() + ":" + h.value())); - throw new RuntimeException( - String.format("Error serializing of type %s: %s", buffer.toString(), data)); - } - - @Override - public byte[] decorateSerialization( - Uni serialization, - String topic, - boolean isKey, - String serializer, - SpecificRecordBase data, - Headers headers) { - return serialization - .onFailure() - .retry() - .withBackOff(Duration.ofSeconds(1)) - .atMost(10) - .await() - .atMost(Duration.ofSeconds(60)); - } -} +package com.kryptokrauts.shared.contract.handlers; + +import io.smallrye.common.annotation.Identifier; +import io.smallrye.mutiny.Uni; +import io.smallrye.reactive.messaging.kafka.SerializationFailureHandler; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Duration; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.header.Headers; +import org.jboss.logging.Logger; + +@ApplicationScoped +@Identifier("avro-serialization-failure-handler") +public class AvroSerializationFailureHandler + implements SerializationFailureHandler { + + protected static final Logger logger = Logger.getLogger(AvroSerializationFailureHandler.class); + + @Override + public byte[] handleSerializationFailure( + String topic, + boolean isKey, + String serializer, + SpecificRecordBase data, + Exception exception, + Headers headers) { + + StringBuffer buffer = new StringBuffer(); + headers.forEach(h -> buffer.append(h.key() + ":" + h.value())); + throw new RuntimeException( + String.format("Error serializing of type %s: %s", buffer.toString(), data)); + } + + @Override + public byte[] decorateSerialization( + Uni serialization, + String topic, + boolean isKey, + String serializer, + SpecificRecordBase data, + Headers headers) { + return serialization + .onFailure() + .retry() + .withBackOff(Duration.ofSeconds(1)) + .atMost(10) + .await() + .atMost(Duration.ofSeconds(60)); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/AssetBaseEntity.java b/src/main/java/com/kryptokrauts/shared/dao/common/AssetBaseEntity.java index 2909993..b324843 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/AssetBaseEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/AssetBaseEntity.java @@ -1,46 +1,46 @@ -package com.kryptokrauts.shared.dao.common; - -import com.kryptokrauts.shared.model.common._Asset; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_asset_base_v") -public class AssetBaseEntity extends PanacheEntityBase { - - @Id private Long assetId; - - private String assetName; - - private String assetMediaType; - - private String assetMedia; - - private String assetMediaPreview; - - private Long editionSize; - - private Long serial; - - private String owner; - - public static _Asset toModel(Long assetId) { - AssetBaseEntity asset = AssetBaseEntity.find("assetId = ?1", assetId).firstResult(); - if (asset != null) { - return _Asset.builder() - .assetId(asset.getAssetId()) - .assetMedia(asset.getAssetMedia()) - .assetMediaPreview(asset.getAssetMediaPreview()) - .assetMediaType(asset.getAssetMediaType()) - .assetName(asset.getAssetName()) - .editionSize(asset.getEditionSize()) - .serial(asset.getSerial()) - .build(); - } - return _Asset.builder().build(); - } -} +package com.kryptokrauts.shared.dao.common; + +import com.kryptokrauts.shared.model.common._Asset; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_asset_base_v") +public class AssetBaseEntity extends PanacheEntityBase { + + @Id private Long assetId; + + private String assetName; + + private String assetMediaType; + + private String assetMedia; + + private String assetMediaPreview; + + private Long editionSize; + + private Long serial; + + private String owner; + + public static _Asset toModel(Long assetId) { + AssetBaseEntity asset = AssetBaseEntity.find("assetId = ?1", assetId).firstResult(); + if (asset != null) { + return _Asset.builder() + .assetId(asset.getAssetId()) + .assetMedia(asset.getAssetMedia()) + .assetMediaPreview(asset.getAssetMediaPreview()) + .assetMediaType(asset.getAssetMediaType()) + .assetName(asset.getAssetName()) + .editionSize(asset.getEditionSize()) + .serial(asset.getSerial()) + .build(); + } + return _Asset.builder().build(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/CollectionAuditEntity.java b/src/main/java/com/kryptokrauts/shared/dao/common/CollectionAuditEntity.java index 5fc6440..d3de890 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/CollectionAuditEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/CollectionAuditEntity.java @@ -1,44 +1,44 @@ -package com.kryptokrauts.shared.dao.common; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import io.quarkus.panache.common.Sort; -import io.quarkus.panache.common.Sort.Direction; -import io.quarkus.panache.common.Sort.NullPrecedence; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import java.util.List; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_collection_audit_info_v") -public class CollectionAuditEntity extends PanacheEntityBase { - - @Id private String collectionId; - - private Boolean shielded; - - private Long shieldingDate; - - private Boolean blacklisted; - - private Long blacklistDate; - - private String blacklistReason; - - private String blacklistActor; - - public static List getShieldedCollections() { - return CollectionAuditEntity.find( - "shielded", Sort.by("shieldingDate", Direction.Descending, NullPrecedence.NULLS_LAST)) - .list(); - } - - public static List getBlacklistedCollections() { - return CollectionAuditEntity.find( - "blacklisted", - Sort.by("blacklistDate", Direction.Descending, NullPrecedence.NULLS_LAST)) - .list(); - } -} +package com.kryptokrauts.shared.dao.common; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import io.quarkus.panache.common.Sort; +import io.quarkus.panache.common.Sort.Direction; +import io.quarkus.panache.common.Sort.NullPrecedence; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.util.List; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_collection_audit_info_v") +public class CollectionAuditEntity extends PanacheEntityBase { + + @Id private String collectionId; + + private Boolean shielded; + + private Long shieldingDate; + + private Boolean blacklisted; + + private Long blacklistDate; + + private String blacklistReason; + + private String blacklistActor; + + public static List getShieldedCollections() { + return CollectionAuditEntity.find( + "shielded", Sort.by("shieldingDate", Direction.Descending, NullPrecedence.NULLS_LAST)) + .list(); + } + + public static List getBlacklistedCollections() { + return CollectionAuditEntity.find( + "blacklisted", + Sort.by("blacklistDate", Direction.Descending, NullPrecedence.NULLS_LAST)) + .list(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/CollectionBaseView.java b/src/main/java/com/kryptokrauts/shared/dao/common/CollectionBaseView.java index c9a4858..81f2906 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/CollectionBaseView.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/CollectionBaseView.java @@ -1,50 +1,50 @@ -package com.kryptokrauts.shared.dao.common; - -import com.kryptokrauts.shared.BaseMapper; -import com.kryptokrauts.shared.model.common._Collection; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_collection_base_v") -public class CollectionBaseView extends PanacheEntityBase { - - @Id private String collectionId; - - private String collectionName; - - private String collectionImage; - - private String creator; - - private Boolean shielded; - - private Boolean blacklisted; - - private Double royalty; - - public _Collection toModel() { - return _Collection.builder() - .collectionId(collectionId) - .collectionImage(collectionImage) - .collectionName(collectionName) - .shielded(shielded) - .blacklisted(blacklisted) - .creator(BaseMapper.mapAccount(creator)) - .royalty(royalty) - .build(); - } - - public static _Collection toModel(String collectionId) { - CollectionBaseView collection = - CollectionBaseView.find("collectionId = ?1", collectionId).firstResult(); - if (collection != null) { - return collection.toModel(); - } - return _Collection.builder().build(); - } -} +package com.kryptokrauts.shared.dao.common; + +import com.kryptokrauts.shared.BaseMapper; +import com.kryptokrauts.shared.model.common._Collection; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_collection_base_v") +public class CollectionBaseView extends PanacheEntityBase { + + @Id private String collectionId; + + private String collectionName; + + private String collectionImage; + + private String creator; + + private Boolean shielded; + + private Boolean blacklisted; + + private Double royalty; + + public _Collection toModel() { + return _Collection.builder() + .collectionId(collectionId) + .collectionImage(collectionImage) + .collectionName(collectionName) + .shielded(shielded) + .blacklisted(blacklisted) + .creator(BaseMapper.mapAccount(creator)) + .royalty(royalty) + .build(); + } + + public static _Collection toModel(String collectionId) { + CollectionBaseView collection = + CollectionBaseView.find("collectionId = ?1", collectionId).firstResult(); + if (collection != null) { + return collection.toModel(); + } + return _Collection.builder().build(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/ExchangeRateEntity.java b/src/main/java/com/kryptokrauts/shared/dao/common/ExchangeRateEntity.java index b3c0a20..5b5647a 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/ExchangeRateEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/ExchangeRateEntity.java @@ -1,21 +1,21 @@ -package com.kryptokrauts.shared.dao.common; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_exchange_rate_latest_v") -public class ExchangeRateEntity extends PanacheEntityBase { - - @Id private String tokenSymbol; - - private Double usd; - - public static ExchangeRateEntity findByToken(String token) { - return ExchangeRateEntity.find("tokenSymbol = ?1", token).firstResult(); - } -} +package com.kryptokrauts.shared.dao.common; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_exchange_rate_latest_v") +public class ExchangeRateEntity extends PanacheEntityBase { + + @Id private String tokenSymbol; + + private Double usd; + + public static ExchangeRateEntity findByToken(String token) { + return ExchangeRateEntity.find("tokenSymbol = ?1", token).firstResult(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/MarketConfigEntity.java b/src/main/java/com/kryptokrauts/shared/dao/common/MarketConfigEntity.java index 62b8e3d..14dd850 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/MarketConfigEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/MarketConfigEntity.java @@ -1,66 +1,66 @@ -package com.kryptokrauts.shared.dao.common; - -import com.kryptokrauts.shared.model.common._MarketConfig; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import io.quarkus.panache.common.Sort; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity -@Table(name = "atomicmarket_config") -public class MarketConfigEntity extends PanacheEntityBase { - - @Id private Long id; - - private Long blocknum; - - private Long blockTimestamp; - - private Double makerFee; - - private Double takerFee; - - private String version; - - private Integer auctionMinDurationSeconds; - - private Integer auctionMaxDurationSeconds; - - private Double auctionMinBidIncrease; - - private Integer auctionResetDurationSeconds; - - public Double getMarketFee() { - return makerFee + takerFee; - } - - public static MarketConfigEntity findOrGetNew(String version, Long blocknum) { - MarketConfigEntity entity = - MarketConfigEntity.find("version = ?1 AND blocknum", version, blocknum).firstResult(); - if (entity == null) { - entity = new MarketConfigEntity(); - } - return entity; - } - - public static MarketConfigEntity findLatest() { - return MarketConfigEntity.findAll(Sort.descending("id")).firstResult(); - } - - public _MarketConfig toModel() { - if (this.id != null) { - return _MarketConfig.builder() - .id(this.id) - .maker_fee(this.makerFee) - .taker_fee(this.takerFee) - .auctionMinBidIncrease(this.auctionMinBidIncrease) - .build(); - } - return null; - } -} +package com.kryptokrauts.shared.dao.common; + +import com.kryptokrauts.shared.model.common._MarketConfig; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import io.quarkus.panache.common.Sort; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "atomicmarket_config") +public class MarketConfigEntity extends PanacheEntityBase { + + @Id private Long id; + + private Long blocknum; + + private Long blockTimestamp; + + private Double makerFee; + + private Double takerFee; + + private String version; + + private Integer auctionMinDurationSeconds; + + private Integer auctionMaxDurationSeconds; + + private Double auctionMinBidIncrease; + + private Integer auctionResetDurationSeconds; + + public Double getMarketFee() { + return makerFee + takerFee; + } + + public static MarketConfigEntity findOrGetNew(String version, Long blocknum) { + MarketConfigEntity entity = + MarketConfigEntity.find("version = ?1 AND blocknum", version, blocknum).firstResult(); + if (entity == null) { + entity = new MarketConfigEntity(); + } + return entity; + } + + public static MarketConfigEntity findLatest() { + return MarketConfigEntity.findAll(Sort.descending("id")).firstResult(); + } + + public _MarketConfig toModel() { + if (this.id != null) { + return _MarketConfig.builder() + .id(this.id) + .maker_fee(this.makerFee) + .taker_fee(this.takerFee) + .auctionMinBidIncrease(this.auctionMinBidIncrease) + .build(); + } + return null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/ProfileBaseView.java b/src/main/java/com/kryptokrauts/shared/dao/common/ProfileBaseView.java index 934f21d..32dcf7d 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/ProfileBaseView.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/ProfileBaseView.java @@ -1,33 +1,33 @@ -package com.kryptokrauts.shared.dao.common; - -import com.kryptokrauts.shared.model.common._Account; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import io.quarkus.panache.common.Parameters; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity -@Table(name = "soonmarket_profile_base_v") -public class ProfileBaseView extends PanacheEntityBase { - - @Id private String account; - - private Boolean hasKyc; - - public _Account toModel() { - if (this.account != null) { - return _Account.builder().name(this.account).hasKYC(this.hasKyc).build(); - } - return null; - } - - public static ProfileBaseView findByAccount(String account) { - return ProfileBaseView.find("account = :account", Parameters.with("account", account)) - .firstResult(); - } -} +package com.kryptokrauts.shared.dao.common; + +import com.kryptokrauts.shared.model.common._Account; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import io.quarkus.panache.common.Parameters; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "soonmarket_profile_base_v") +public class ProfileBaseView extends PanacheEntityBase { + + @Id private String account; + + private Boolean hasKyc; + + public _Account toModel() { + if (this.account != null) { + return _Account.builder().name(this.account).hasKYC(this.hasKyc).build(); + } + return null; + } + + public static ProfileBaseView findByAccount(String account) { + return ProfileBaseView.find("account = :account", Parameters.with("account", account)) + .firstResult(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/common/SupportedAssetsEntity.java b/src/main/java/com/kryptokrauts/shared/dao/common/SupportedAssetsEntity.java index 51c74d9..853c529 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/common/SupportedAssetsEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/common/SupportedAssetsEntity.java @@ -1,21 +1,21 @@ -package com.kryptokrauts.shared.dao.common; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "atomicmarket_token") -public class SupportedAssetsEntity extends PanacheEntityBase { - - @Id private String contract; - - @Id private String token; - - private Integer precision; - - private Integer order; -} +package com.kryptokrauts.shared.dao.common; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "atomicmarket_token") +public class SupportedAssetsEntity extends PanacheEntityBase { + + @Id private String contract; + + @Id private String token; + + private Integer precision; + + private Integer order; +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/embeddables/Price.java b/src/main/java/com/kryptokrauts/shared/dao/embeddables/Price.java index eb4e200..1aa2a03 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/embeddables/Price.java +++ b/src/main/java/com/kryptokrauts/shared/dao/embeddables/Price.java @@ -1,36 +1,36 @@ -package com.kryptokrauts.shared.dao.embeddables; - -import com.kryptokrauts.shared.BaseMapper; -import com.kryptokrauts.shared.model.common._PriceInfo; -import io.quarkus.runtime.annotations.RegisterForReflection; -import jakarta.persistence.Column; -import jakarta.persistence.Embeddable; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Embeddable -@RegisterForReflection -public class Price { - - private String token; - - private Double price; - - @Column(insertable = false, updatable = false) - private Double royalty; - - public _PriceInfo toModel() { - if (this.token != null) { - return BaseMapper.buildPriceInfo(this.token, this.price, this.royalty); - } - return null; - } -} +package com.kryptokrauts.shared.dao.embeddables; + +import com.kryptokrauts.shared.BaseMapper; +import com.kryptokrauts.shared.model.common._PriceInfo; +import io.quarkus.runtime.annotations.RegisterForReflection; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Embeddable +@RegisterForReflection +public class Price { + + private String token; + + private Double price; + + @Column(insertable = false, updatable = false) + private Double royalty; + + public _PriceInfo toModel() { + if (this.token != null) { + return BaseMapper.buildPriceInfo(this.token, this.price, this.royalty); + } + return null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/AuctionBaseEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/AuctionBaseEntity.java index 95ee672..bf39798 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/AuctionBaseEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/AuctionBaseEntity.java @@ -1,42 +1,42 @@ -package com.kryptokrauts.shared.dao.realtime; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_auction_base_v") -public class AuctionBaseEntity extends PanacheEntityBase { - - @Id private Long auctionId; - - @Id private Long assetId; - - private String token; - - private Double collectionFee; - - private Double currentBid; - - private Boolean bundle; - - private Integer bundleSize; - - private String collectionId; - - private Integer index; - - private String highestBidder; - - public static AuctionBaseEntity findByAuctionId(Long auctionId) { - return AuctionBaseEntity.find("auctionId = ?1 AND index=1", auctionId).firstResult(); - } - - public static Long findNFTByAuctionId(Long auctionId) { - AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(auctionId); - return auction != null ? auction.getAssetId() : null; - } -} +package com.kryptokrauts.shared.dao.realtime; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_auction_base_v") +public class AuctionBaseEntity extends PanacheEntityBase { + + @Id private Long auctionId; + + @Id private Long assetId; + + private String token; + + private Double collectionFee; + + private Double currentBid; + + private Boolean bundle; + + private Integer bundleSize; + + private String collectionId; + + private Integer index; + + private String highestBidder; + + public static AuctionBaseEntity findByAuctionId(Long auctionId) { + return AuctionBaseEntity.find("auctionId = ?1 AND index=1", auctionId).firstResult(); + } + + public static Long findNFTByAuctionId(Long auctionId) { + AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(auctionId); + return auction != null ? auction.getAssetId() : null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/BuyofferBaseEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/BuyofferBaseEntity.java index 36f0dfc..f411aa7 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/BuyofferBaseEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/BuyofferBaseEntity.java @@ -1,47 +1,47 @@ -package com.kryptokrauts.shared.dao.realtime; - -import com.kryptokrauts.shared.dao.embeddables.Price; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_buyoffer_v") -public class BuyofferBaseEntity extends PanacheEntityBase { - - @Id private Long buyofferId; - - @Id private Long assetId; - - private Boolean bundle; - - private Integer bundleSize; - - private String collectionId; - - // to - private String buyer; - - // from - private String seller; - - private Price price; - - private String memo; - - private String declineMemo; - - private Integer index; - - public static BuyofferBaseEntity findByBuyofferId(Long buyofferId) { - return BuyofferBaseEntity.find("buyofferId = ?1 AND index=1", buyofferId).firstResult(); - } - - public static Long findNFTByBuyofferId(Long buyofferId) { - BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(buyofferId); - return buyoffer != null ? buyoffer.getAssetId() : null; - } -} +package com.kryptokrauts.shared.dao.realtime; + +import com.kryptokrauts.shared.dao.embeddables.Price; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_buyoffer_v") +public class BuyofferBaseEntity extends PanacheEntityBase { + + @Id private Long buyofferId; + + @Id private Long assetId; + + private Boolean bundle; + + private Integer bundleSize; + + private String collectionId; + + // to + private String buyer; + + // from + private String seller; + + private Price price; + + private String memo; + + private String declineMemo; + + private Integer index; + + public static BuyofferBaseEntity findByBuyofferId(Long buyofferId) { + return BuyofferBaseEntity.find("buyofferId = ?1 AND index=1", buyofferId).firstResult(); + } + + public static Long findNFTByBuyofferId(Long buyofferId) { + BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(buyofferId); + return buyoffer != null ? buyoffer.getAssetId() : null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/ListingBaseEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/ListingBaseEntity.java index 0e28c01..66d8678 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/ListingBaseEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/ListingBaseEntity.java @@ -1,38 +1,38 @@ -package com.kryptokrauts.shared.dao.realtime; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "atomicmarket_sale") -public class ListingBaseEntity extends PanacheEntityBase { - - @Id private Long saleId; - - private Long primaryAssetId; - - private Double price; - - private String token; - - private Double collectionFee; - - private Boolean bundle; - - private Integer bundleSize; - - private String collectionId; - - public static ListingBaseEntity findByListingId(Long listingId) { - return ListingBaseEntity.find("saleId = ?1", listingId).firstResult(); - } - - public static Long findNFTBySaleId(Long saleId) { - ListingBaseEntity listing = ListingBaseEntity.findByListingId(saleId); - return listing != null ? listing.getPrimaryAssetId() : null; - } -} +package com.kryptokrauts.shared.dao.realtime; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "atomicmarket_sale") +public class ListingBaseEntity extends PanacheEntityBase { + + @Id private Long saleId; + + private Long primaryAssetId; + + private Double price; + + private String token; + + private Double collectionFee; + + private Boolean bundle; + + private Integer bundleSize; + + private String collectionId; + + public static ListingBaseEntity findByListingId(Long listingId) { + return ListingBaseEntity.find("saleId = ?1", listingId).firstResult(); + } + + public static Long findNFTBySaleId(Long saleId) { + ListingBaseEntity listing = ListingBaseEntity.findByListingId(saleId); + return listing != null ? listing.getPrimaryAssetId() : null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/NotificationEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/NotificationEntity.java index 3caf1e8..bca0a93 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/NotificationEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/NotificationEntity.java @@ -1,56 +1,56 @@ -package com.kryptokrauts.shared.dao.realtime; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity -@Table(name = "soonmarket_notification") -public class NotificationEntity extends PanacheEntityBase { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private Long globalSequence; - - private String actionType; - - private String account; - - private Long blockTimestamp; - - private Long blocknum; - - private Long actionId; - - private Boolean acknowledged; - - private Long acknowledgedDate; - - public static NotificationEntity findById( - Long globalSequence, String actionType, String account) { - return NotificationEntity.find( - "globalSequence = ?1 AND actionType = ?2 AND account =?3", - globalSequence, - actionType, - account) - .firstResult(); - } - - public static NotificationEntity findOrGetNew( - Long globalSequence, String actionType, String account) { - NotificationEntity entity = NotificationEntity.findById(globalSequence, actionType, account); - if (entity == null) { - entity = new NotificationEntity(); - } - return entity; - } -} +package com.kryptokrauts.shared.dao.realtime; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "soonmarket_notification") +public class NotificationEntity extends PanacheEntityBase { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long globalSequence; + + private String actionType; + + private String account; + + private Long blockTimestamp; + + private Long blocknum; + + private Long actionId; + + private Boolean acknowledged; + + private Long acknowledgedDate; + + public static NotificationEntity findById( + Long globalSequence, String actionType, String account) { + return NotificationEntity.find( + "globalSequence = ?1 AND actionType = ?2 AND account =?3", + globalSequence, + actionType, + account) + .firstResult(); + } + + public static NotificationEntity findOrGetNew( + Long globalSequence, String actionType, String account) { + NotificationEntity entity = NotificationEntity.findById(globalSequence, actionType, account); + if (entity == null) { + entity = new NotificationEntity(); + } + return entity; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/OpenListingBaseEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/OpenListingBaseEntity.java index fee9c30..337ff2a 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/OpenListingBaseEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/OpenListingBaseEntity.java @@ -1,31 +1,31 @@ -package com.kryptokrauts.shared.dao.realtime; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "soonmarket_listing_open_v") -public class OpenListingBaseEntity extends PanacheEntityBase { - - @Id private Long listingId; - - private Long assetId; - - private Double listingRoyalty; - - private Boolean bundle; - - private Integer bundleSize; - - private String collectionId; - - private Integer index; - - public static OpenListingBaseEntity findByListingId(Long listingId) { - return OpenListingBaseEntity.find("listingId = ?1 AND index = 1", listingId).firstResult(); - } -} +package com.kryptokrauts.shared.dao.realtime; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "soonmarket_listing_open_v") +public class OpenListingBaseEntity extends PanacheEntityBase { + + @Id private Long listingId; + + private Long assetId; + + private Double listingRoyalty; + + private Boolean bundle; + + private Integer bundleSize; + + private String collectionId; + + private Integer index; + + public static OpenListingBaseEntity findByListingId(Long listingId) { + return OpenListingBaseEntity.find("listingId = ?1 AND index = 1", listingId).firstResult(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/TaskEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/TaskEntity.java index ab87990..5699223 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/TaskEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/TaskEntity.java @@ -1,65 +1,65 @@ -package com.kryptokrauts.shared.dao.realtime; - -import com.kryptokrauts.shared.enums.TaskType; -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.Getter; - -@Getter -@Entity(name = "soonmarket_open_task_v") -public class TaskEntity extends PanacheEntityBase { - - @Id private String id; - - private String account; - - private Long blockTimestamp; - - private Long actionId; - - private String taskType; - - private Boolean bundle; - - private Integer bundleSize; - - private Double price; - - private String token; - - /** asset info */ - private Long assetId; - - private String assetName; - - private String assetMediaType; - - private String assetMedia; - - private String assetMediaPreview; - - private Long editionSize; - - private Long serial; - - /** collection info */ - private String collectionId; - - private String collectionName; - - private String collectionImage; - - private Boolean shielded; - - private Boolean blacklisted; - - public static TaskEntity findById(Long actionId, TaskType actionType, String account) { - return TaskEntity.find( - "actionId = ?1 AND taskType = ?2 AND account =?3", - actionId, - actionType.toString(), - account) - .firstResult(); - } -} +package com.kryptokrauts.shared.dao.realtime; + +import com.kryptokrauts.shared.enums.TaskType; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Getter; + +@Getter +@Entity(name = "soonmarket_open_task_v") +public class TaskEntity extends PanacheEntityBase { + + @Id private String id; + + private String account; + + private Long blockTimestamp; + + private Long actionId; + + private String taskType; + + private Boolean bundle; + + private Integer bundleSize; + + private Double price; + + private String token; + + /** asset info */ + private Long assetId; + + private String assetName; + + private String assetMediaType; + + private String assetMedia; + + private String assetMediaPreview; + + private Long editionSize; + + private Long serial; + + /** collection info */ + private String collectionId; + + private String collectionName; + + private String collectionImage; + + private Boolean shielded; + + private Boolean blacklisted; + + public static TaskEntity findById(Long actionId, TaskType actionType, String account) { + return TaskEntity.find( + "actionId = ?1 AND taskType = ?2 AND account =?3", + actionId, + actionType.toString(), + account) + .firstResult(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/dao/realtime/TransferEntity.java b/src/main/java/com/kryptokrauts/shared/dao/realtime/TransferEntity.java index a0f9892..76f86e7 100644 --- a/src/main/java/com/kryptokrauts/shared/dao/realtime/TransferEntity.java +++ b/src/main/java/com/kryptokrauts/shared/dao/realtime/TransferEntity.java @@ -1,29 +1,29 @@ -package com.kryptokrauts.shared.dao.realtime; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; - -@Getter -@Entity -@Table(name = "atomicassets_transfer") -public class TransferEntity extends PanacheEntityBase { - - @Id private Long transferId; - - private Long primaryAssetId; - - private String sender; - - private String receiver; - - private String collectionId; - - private Boolean bundle; - - public static TransferEntity findByTransferId(Long transferId) { - return TransferEntity.find("transferId = ?1", transferId).firstResult(); - } -} +package com.kryptokrauts.shared.dao.realtime; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "atomicassets_transfer") +public class TransferEntity extends PanacheEntityBase { + + @Id private Long transferId; + + private Long primaryAssetId; + + private String sender; + + private String receiver; + + private String collectionId; + + private Boolean bundle; + + public static TransferEntity findByTransferId(Long transferId) { + return TransferEntity.find("transferId = ?1", transferId).firstResult(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/enums/MarketType.java b/src/main/java/com/kryptokrauts/shared/enums/MarketType.java index e52b596..37ac549 100644 --- a/src/main/java/com/kryptokrauts/shared/enums/MarketType.java +++ b/src/main/java/com/kryptokrauts/shared/enums/MarketType.java @@ -1,9 +1,9 @@ -package com.kryptokrauts.shared.enums; - -public enum MarketType { - auction, - listing, - buyoffer, - otc, - transfer -} +package com.kryptokrauts.shared.enums; + +public enum MarketType { + auction, + listing, + buyoffer, + otc, + transfer +} diff --git a/src/main/java/com/kryptokrauts/shared/enums/NotificationContext.java b/src/main/java/com/kryptokrauts/shared/enums/NotificationContext.java index d41c391..713c03b 100644 --- a/src/main/java/com/kryptokrauts/shared/enums/NotificationContext.java +++ b/src/main/java/com/kryptokrauts/shared/enums/NotificationContext.java @@ -1,6 +1,6 @@ -package com.kryptokrauts.shared.enums; - -public enum NotificationContext { - notification, - task; -} +package com.kryptokrauts.shared.enums; + +public enum NotificationContext { + notification, + task; +} diff --git a/src/main/java/com/kryptokrauts/shared/enums/NotificationType.java b/src/main/java/com/kryptokrauts/shared/enums/NotificationType.java index f028782..58c6976 100644 --- a/src/main/java/com/kryptokrauts/shared/enums/NotificationType.java +++ b/src/main/java/com/kryptokrauts/shared/enums/NotificationType.java @@ -1,15 +1,15 @@ -package com.kryptokrauts.shared.enums; - -public enum NotificationType { - offer_received, - offer_declined, - offer_accepted, - auction_outbid, - nft_received, - royalty_decreased, - royalty_received, - royalty_received_auction, - royalty_received_buyoffer, - royalty_received_listing, - listing_sold -} +package com.kryptokrauts.shared.enums; + +public enum NotificationType { + offer_received, + offer_declined, + offer_accepted, + auction_outbid, + nft_received, + royalty_decreased, + royalty_received, + royalty_received_auction, + royalty_received_buyoffer, + royalty_received_listing, + listing_sold +} diff --git a/src/main/java/com/kryptokrauts/shared/enums/TaskType.java b/src/main/java/com/kryptokrauts/shared/enums/TaskType.java index ea5779b..5f7533a 100644 --- a/src/main/java/com/kryptokrauts/shared/enums/TaskType.java +++ b/src/main/java/com/kryptokrauts/shared/enums/TaskType.java @@ -1,9 +1,9 @@ -package com.kryptokrauts.shared.enums; - -public enum TaskType { - auction_won_claim_nfts, - auction_sold_claim_funds, - auction_end_zero_bids, - invalid_listing, - invalid_offer -} +package com.kryptokrauts.shared.enums; + +public enum TaskType { + auction_won_claim_nfts, + auction_sold_claim_funds, + auction_end_zero_bids, + invalid_listing, + invalid_offer +} diff --git a/src/main/java/com/kryptokrauts/shared/model/_BaseModel.java b/src/main/java/com/kryptokrauts/shared/model/_BaseModel.java index 9e959a8..1134d55 100644 --- a/src/main/java/com/kryptokrauts/shared/model/_BaseModel.java +++ b/src/main/java/com/kryptokrauts/shared/model/_BaseModel.java @@ -1,25 +1,25 @@ -package com.kryptokrauts.shared.model; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.kryptokrauts.shared.RandomNumberHolder; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _BaseModel { - - public static final ObjectMapper objectMapper = new ObjectMapper(); - - private Long uiid; - - public Long getUiid() { - return Math.abs(RandomNumberHolder.randomNumberGenerator.nextLong()); - } -} +package com.kryptokrauts.shared.model; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kryptokrauts.shared.RandomNumberHolder; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _BaseModel { + + public static final ObjectMapper objectMapper = new ObjectMapper(); + + private Long uiid; + + public Long getUiid() { + return Math.abs(RandomNumberHolder.randomNumberGenerator.nextLong()); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_Account.java b/src/main/java/com/kryptokrauts/shared/model/common/_Account.java index 21cf937..7f39288 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_Account.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_Account.java @@ -1,31 +1,31 @@ -package com.kryptokrauts.shared.model.common; - -import com.kryptokrauts.shared.model._BaseModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Getter -@Setter -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class _Account extends _BaseModel { - - private String name; - - private Boolean image; - - private Boolean hasKYC; - - public String getImage() { - if (this.image == null || this.image == false) { - return "https://media.soon.market/images/profile_placeholder.png"; - } - return "https://media.soon.market/images/" + this.name; - } -} +package com.kryptokrauts.shared.model.common; + +import com.kryptokrauts.shared.model._BaseModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class _Account extends _BaseModel { + + private String name; + + private Boolean image; + + private Boolean hasKYC; + + public String getImage() { + if (this.image == null || this.image == false) { + return "https://media.soon.market/images/profile_placeholder.png"; + } + return "https://media.soon.market/images/" + this.name; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_Asset.java b/src/main/java/com/kryptokrauts/shared/model/common/_Asset.java index 7aaebbb..f56548b 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_Asset.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_Asset.java @@ -1,38 +1,38 @@ -package com.kryptokrauts.shared.model.common; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.kryptokrauts.shared.model._BaseModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@JsonPropertyOrder(alphabetic = true) -@Getter -@Setter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _Asset extends _BaseModel { - - private Long assetId; - - private Long templateId; - - private String assetName; - - private String assetMediaType; - - private String assetMedia; - - private String assetMediaPreview; - - private Long editionSize; - - private Long serial; - - private _Account owner; -} +package com.kryptokrauts.shared.model.common; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.kryptokrauts.shared.model._BaseModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@JsonPropertyOrder(alphabetic = true) +@Getter +@Setter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _Asset extends _BaseModel { + + private Long assetId; + + private Long templateId; + + private String assetName; + + private String assetMediaType; + + private String assetMedia; + + private String assetMediaPreview; + + private Long editionSize; + + private Long serial; + + private _Account owner; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_BlacklistMetadata.java b/src/main/java/com/kryptokrauts/shared/model/common/_BlacklistMetadata.java index 91ed373..f6926e5 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_BlacklistMetadata.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_BlacklistMetadata.java @@ -1,25 +1,25 @@ -package com.kryptokrauts.shared.model.common; - -import com.kryptokrauts.shared.model._BaseModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import java.util.Date; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Getter -@Setter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _BlacklistMetadata extends _BaseModel { - - private Date blacklistDate; - - private String reason; - - private String actor; -} +package com.kryptokrauts.shared.model.common; + +import com.kryptokrauts.shared.model._BaseModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _BlacklistMetadata extends _BaseModel { + + private Date blacklistDate; + + private String reason; + + private String actor; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_Collection.java b/src/main/java/com/kryptokrauts/shared/model/common/_Collection.java index c049a1c..d37d6b6 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_Collection.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_Collection.java @@ -1,44 +1,44 @@ -package com.kryptokrauts.shared.model.common; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.kryptokrauts.shared.model._BaseModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@JsonPropertyOrder(alphabetic = true) -@Getter -@Setter -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class _Collection extends _BaseModel { - private String collectionId; - - private String collectionName; - - private String collectionImage; - - // private String category; - - private _Account creator; - - private Double royalty; - - // private Boolean hasKYC; - - private Boolean shielded; - - private Boolean blacklisted; - - public Double getRoyalty() { - if (this.royalty != null) { - return this.royalty * 100; - } - return null; - } -} +package com.kryptokrauts.shared.model.common; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.kryptokrauts.shared.model._BaseModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@JsonPropertyOrder(alphabetic = true) +@Getter +@Setter +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class _Collection extends _BaseModel { + private String collectionId; + + private String collectionName; + + private String collectionImage; + + // private String category; + + private _Account creator; + + private Double royalty; + + // private Boolean hasKYC; + + private Boolean shielded; + + private Boolean blacklisted; + + public Double getRoyalty() { + if (this.royalty != null) { + return this.royalty * 100; + } + return null; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_MarketConfig.java b/src/main/java/com/kryptokrauts/shared/model/common/_MarketConfig.java index 85ee093..e4ebb34 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_MarketConfig.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_MarketConfig.java @@ -1,29 +1,29 @@ -package com.kryptokrauts.shared.model.common; - -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@Builder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _MarketConfig { - - private Long id; - - private Double maker_fee; - - private Double taker_fee; - - private Double auctionMinBidIncrease; - - public Double getMarketFee() { - return this.maker_fee + this.taker_fee; - } -} +package com.kryptokrauts.shared.model.common; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _MarketConfig { + + private Long id; + + private Double maker_fee; + + private Double taker_fee; + + private Double auctionMinBidIncrease; + + public Double getMarketFee() { + return this.maker_fee + this.taker_fee; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/common/_PriceInfo.java b/src/main/java/com/kryptokrauts/shared/model/common/_PriceInfo.java index c1d61c9..383caad 100644 --- a/src/main/java/com/kryptokrauts/shared/model/common/_PriceInfo.java +++ b/src/main/java/com/kryptokrauts/shared/model/common/_PriceInfo.java @@ -1,53 +1,53 @@ -package com.kryptokrauts.shared.model.common; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.kryptokrauts.shared.model._BaseModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@JsonInclude(Include.NON_NULL) -@Getter -@Setter -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public class _PriceInfo extends _BaseModel { - - private String paymentAsset; - - private Double price; - - private Double priceUSD; - - private Double sellerReceivedPrice; - - private Double sellerReceivedPriceUSD; - - private Double royalty; - - private Double royaltyPrice; - - private Double royaltyUSD; - - private Double makerMarketFee; - - private Double takerMarketFee; - - private Double marketFeePrice; - - private Double marketFeeUSD; - - private Double makerMarketFeeUSD; - - private Double takerMarketFeeUSD; - - private String rawPrice; - - private Boolean bundle; -} +package com.kryptokrauts.shared.model.common; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.kryptokrauts.shared.model._BaseModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@JsonInclude(Include.NON_NULL) +@Getter +@Setter +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class _PriceInfo extends _BaseModel { + + private String paymentAsset; + + private Double price; + + private Double priceUSD; + + private Double sellerReceivedPrice; + + private Double sellerReceivedPriceUSD; + + private Double royalty; + + private Double royaltyPrice; + + private Double royaltyUSD; + + private Double makerMarketFee; + + private Double takerMarketFee; + + private Double marketFeePrice; + + private Double marketFeeUSD; + + private Double makerMarketFeeUSD; + + private Double takerMarketFeeUSD; + + private String rawPrice; + + private Boolean bundle; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/_Notification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/_Notification.java index d25bec9..7cc7b8f 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/_Notification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/_Notification.java @@ -1,31 +1,31 @@ -package com.kryptokrauts.shared.model.realtime; - -import com.kryptokrauts.shared.enums.NotificationType; -import com.kryptokrauts.shared.model._BaseModel; -import com.kryptokrauts.shared.model.common._Collection; -import io.quarkus.runtime.annotations.RegisterForReflection; -import java.util.Date; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _Notification extends _BaseModel { - - private Long notificationId; - - private Date receivedDate; - - private boolean acknowlegded; - - private Date acknowlegdedDate; - - private NotificationType type; - - private _Collection collection; -} +package com.kryptokrauts.shared.model.realtime; + +import com.kryptokrauts.shared.enums.NotificationType; +import com.kryptokrauts.shared.model._BaseModel; +import com.kryptokrauts.shared.model.common._Collection; +import io.quarkus.runtime.annotations.RegisterForReflection; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _Notification extends _BaseModel { + + private Long notificationId; + + private Date receivedDate; + + private boolean acknowlegded; + + private Date acknowlegdedDate; + + private NotificationType type; + + private _Collection collection; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/_Task.java b/src/main/java/com/kryptokrauts/shared/model/realtime/_Task.java index db75e98..12bab59 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/_Task.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/_Task.java @@ -1,33 +1,33 @@ -package com.kryptokrauts.shared.model.realtime; - -import com.kryptokrauts.shared.enums.MarketType; -import com.kryptokrauts.shared.model._BaseModel; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._Collection; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Getter -@Setter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public abstract class _Task extends _BaseModel { - - private _Collection collection; - - private _Asset asset; - - private Boolean bundle; - - private Integer bundleSize; - - private String type; - - public abstract MarketType getMarketType(); -} +package com.kryptokrauts.shared.model.realtime; + +import com.kryptokrauts.shared.enums.MarketType; +import com.kryptokrauts.shared.model._BaseModel; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._Collection; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public abstract class _Task extends _BaseModel { + + private _Collection collection; + + private _Asset asset; + + private Boolean bundle; + + private Integer bundleSize; + + private String type; + + public abstract MarketType getMarketType(); +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_AuctionOutbidNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_AuctionOutbidNotification.java index fcde8e6..41a3234 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_AuctionOutbidNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_AuctionOutbidNotification.java @@ -1,31 +1,31 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.common._Account; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Notification; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Getter -@Setter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _AuctionOutbidNotification extends _Notification { - - private Long auctionId; - - private _PriceInfo currentBid; - - private _Asset asset; - - private Integer bundleSize; - - private _Account bidder; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.common._Account; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Notification; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _AuctionOutbidNotification extends _Notification { + + private Long auctionId; + + private _PriceInfo currentBid; + + private _Asset asset; + + private Integer bundleSize; + + private _Account bidder; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_ListingSoldNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_ListingSoldNotification.java index c93449b..d65f6ec 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_ListingSoldNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_ListingSoldNotification.java @@ -1,24 +1,24 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Notification; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _ListingSoldNotification extends _Notification { - - private _Asset asset; - - private _PriceInfo priceInfo; - - private Integer bundleSize; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Notification; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _ListingSoldNotification extends _Notification { + + private _Asset asset; + + private _PriceInfo priceInfo; + + private Integer bundleSize; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_OfferNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_OfferNotification.java index c59bd44..820571b 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_OfferNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_OfferNotification.java @@ -1,35 +1,35 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.common._Account; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Notification; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Getter -@Setter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _OfferNotification extends _Notification { - - private Long buyofferId; - - private _PriceInfo price; - - private _Asset asset; - - private Integer bundleSize; - - private _Account seller; - - private _Account buyer; - - private String message; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.common._Account; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Notification; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _OfferNotification extends _Notification { + + private Long buyofferId; + + private _PriceInfo price; + + private _Asset asset; + + private Integer bundleSize; + + private _Account seller; + + private _Account buyer; + + private String message; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyDecreasedNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyDecreasedNotification.java index 0b024ae..8ba4f03 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyDecreasedNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyDecreasedNotification.java @@ -1,20 +1,20 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.realtime._Notification; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _RoyaltyDecreasedNotification extends _Notification { - - private Double oldValue; - - private Double newValue; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.realtime._Notification; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _RoyaltyDecreasedNotification extends _Notification { + + private Double oldValue; + + private Double newValue; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyReceivedNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyReceivedNotification.java index d1956f5..d83b7f5 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyReceivedNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_RoyaltyReceivedNotification.java @@ -1,26 +1,26 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Notification; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _RoyaltyReceivedNotification extends _Notification { - - private _PriceInfo royaltyAmount; - - private _Asset asset; - - private Boolean bundle; - - private String marketType; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Notification; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _RoyaltyReceivedNotification extends _Notification { + + private _PriceInfo royaltyAmount; + + private _Asset asset; + + private Boolean bundle; + + private String marketType; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_TransferNotification.java b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_TransferNotification.java index 2aeb225..3a5ecf0 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_TransferNotification.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/notification/_TransferNotification.java @@ -1,27 +1,27 @@ -package com.kryptokrauts.shared.model.realtime.notification; - -import com.kryptokrauts.shared.model.common._Account; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.realtime._Notification; - -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _TransferNotification extends _Notification { - - private Long transferId; - - private _Asset asset; - - private _Account from; - - private Boolean bundle; -} +package com.kryptokrauts.shared.model.realtime.notification; + +import com.kryptokrauts.shared.model.common._Account; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.realtime._Notification; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _TransferNotification extends _Notification { + + private Long transferId; + + private _Asset asset; + + private _Account from; + + private Boolean bundle; +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndClaimNFTs.java b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndClaimNFTs.java index f312fdb..5d18d13 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndClaimNFTs.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndClaimNFTs.java @@ -1,27 +1,27 @@ -package com.kryptokrauts.shared.model.realtime.task; - -import com.kryptokrauts.shared.enums.MarketType; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Task; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _AuctionEndClaimNFTs extends _Task { - - private Long auctionId; - - private _PriceInfo winningBid; - - @Override - public MarketType getMarketType() { - return MarketType.auction; - } -} +package com.kryptokrauts.shared.model.realtime.task; + +import com.kryptokrauts.shared.enums.MarketType; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Task; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _AuctionEndClaimNFTs extends _Task { + + private Long auctionId; + + private _PriceInfo winningBid; + + @Override + public MarketType getMarketType() { + return MarketType.auction; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndZeroBids.java b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndZeroBids.java index 2816a6d..e3abe51 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndZeroBids.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_AuctionEndZeroBids.java @@ -1,27 +1,27 @@ -package com.kryptokrauts.shared.model.realtime.task; - -import com.kryptokrauts.shared.enums.MarketType; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Task; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _AuctionEndZeroBids extends _Task { - - private _PriceInfo startingBid; - - private Long auctionId; - - @Override - public MarketType getMarketType() { - return MarketType.auction; - } -} +package com.kryptokrauts.shared.model.realtime.task; + +import com.kryptokrauts.shared.enums.MarketType; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Task; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _AuctionEndZeroBids extends _Task { + + private _PriceInfo startingBid; + + private Long auctionId; + + @Override + public MarketType getMarketType() { + return MarketType.auction; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidListing.java b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidListing.java index 645461e..d76f04b 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidListing.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidListing.java @@ -1,27 +1,27 @@ -package com.kryptokrauts.shared.model.realtime.task; - -import com.kryptokrauts.shared.enums.MarketType; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Task; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _InvalidListing extends _Task { - - private Long listingId; - - private _PriceInfo price; - - @Override - public MarketType getMarketType() { - return MarketType.listing; - } -} +package com.kryptokrauts.shared.model.realtime.task; + +import com.kryptokrauts.shared.enums.MarketType; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Task; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _InvalidListing extends _Task { + + private Long listingId; + + private _PriceInfo price; + + @Override + public MarketType getMarketType() { + return MarketType.listing; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidOffer.java b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidOffer.java index 9b6442a..c79d87c 100644 --- a/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidOffer.java +++ b/src/main/java/com/kryptokrauts/shared/model/realtime/task/_InvalidOffer.java @@ -1,27 +1,27 @@ -package com.kryptokrauts.shared.model.realtime.task; - -import com.kryptokrauts.shared.enums.MarketType; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Task; -import io.quarkus.runtime.annotations.RegisterForReflection; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -@RegisterForReflection -@AllArgsConstructor -@NoArgsConstructor -public class _InvalidOffer extends _Task { - - private Long buyofferId; - - private _PriceInfo price; - - @Override - public MarketType getMarketType() { - return MarketType.buyoffer; - } -} +package com.kryptokrauts.shared.model.realtime.task; + +import com.kryptokrauts.shared.enums.MarketType; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Task; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@RegisterForReflection +@AllArgsConstructor +@NoArgsConstructor +public class _InvalidOffer extends _Task { + + private Long buyofferId; + + private _PriceInfo price; + + @Override + public MarketType getMarketType() { + return MarketType.buyoffer; + } +} diff --git a/src/main/java/com/kryptokrauts/shared/service/NotificationTransformService.java b/src/main/java/com/kryptokrauts/shared/service/NotificationTransformService.java index 1466a1d..856f9c6 100644 --- a/src/main/java/com/kryptokrauts/shared/service/NotificationTransformService.java +++ b/src/main/java/com/kryptokrauts/shared/service/NotificationTransformService.java @@ -1,180 +1,180 @@ -package com.kryptokrauts.shared.service; - -import org.apache.commons.lang3.StringUtils; - -import com.kryptokrauts.shared.BaseMapper; -import com.kryptokrauts.shared.dao.common.AssetBaseEntity; -import com.kryptokrauts.shared.dao.common.CollectionBaseView; -import com.kryptokrauts.shared.dao.realtime.AuctionBaseEntity; -import com.kryptokrauts.shared.dao.realtime.BuyofferBaseEntity; -import com.kryptokrauts.shared.dao.realtime.ListingBaseEntity; -import com.kryptokrauts.shared.dao.realtime.NotificationEntity; -import com.kryptokrauts.shared.dao.realtime.OpenListingBaseEntity; -import com.kryptokrauts.shared.dao.realtime.TransferEntity; -import com.kryptokrauts.shared.enums.NotificationType; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._Collection; -import com.kryptokrauts.shared.model.common._PriceInfo; -import com.kryptokrauts.shared.model.realtime._Notification; -import com.kryptokrauts.shared.model.realtime.notification._AuctionOutbidNotification; -import com.kryptokrauts.shared.model.realtime.notification._ListingSoldNotification; -import com.kryptokrauts.shared.model.realtime.notification._OfferNotification; -import com.kryptokrauts.shared.model.realtime.notification._RoyaltyDecreasedNotification; -import com.kryptokrauts.shared.model.realtime.notification._RoyaltyReceivedNotification; -import com.kryptokrauts.shared.model.realtime.notification._TransferNotification; - -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class NotificationTransformService { - - public _Notification toModel(NotificationEntity entity) { - if (entity.getActionId() != null && StringUtils.isNotBlank(entity.getActionType())) { - return switch (entity.getActionType()) { - case "offer_declined" -> toOfferNotification(entity, true); - case "offer_received" -> toOfferNotification(entity, false); - case "offer_accepted" -> toOfferNotification(entity, false); - case "auction_outbid" -> toAuctionOutbidNotification(entity); - case "nft_received" -> toTransferNotification(entity); - case "royalty_decreased" -> toRoyaltyDecreasedNotification(entity); - case "royalty_received_listing" -> toRoyaltyReceivedNotification(entity, "listing"); - case "royalty_received_buyoffer" -> toRoyaltyReceivedNotification(entity, "buyoffer"); - case "royalty_received_auction" -> toRoyaltyReceivedNotification(entity, "auction"); - case "listing_sold" -> toListingSoldNotification(entity); - default -> null; - }; - } - return null; - } - - private _OfferNotification toOfferNotification( - NotificationEntity entity, boolean useDeclineMemo) { - BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(entity.getActionId()); - return _OfferNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .asset(AssetBaseEntity.toModel(buyoffer.getAssetId())) - .bundleSize(buyoffer.getBundleSize()) - .buyer(BaseMapper.mapAccount(buyoffer.getBuyer())) - .seller(BaseMapper.mapAccount(buyoffer.getSeller())) - .collection(CollectionBaseView.toModel(buyoffer.getCollectionId())) - .notificationId(entity.getId()) - .buyofferId(entity.getActionId()) - .price(buyoffer.getPrice().toModel()) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .type(NotificationType.valueOf(entity.getActionType())) - .message(useDeclineMemo ? buyoffer.getDeclineMemo() : buyoffer.getMemo()) - .build(); - } - - private _TransferNotification toTransferNotification(NotificationEntity entity) { - TransferEntity transfer = TransferEntity.findByTransferId(entity.getActionId()); - return _TransferNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .asset(AssetBaseEntity.toModel(transfer.getPrimaryAssetId())) - .bundle(transfer.getBundle()) - .from(BaseMapper.mapAccount(transfer.getSender())) - .collection(CollectionBaseView.toModel(transfer.getCollectionId())) - .notificationId(entity.getId()) - .transferId(transfer.getTransferId()) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .type(NotificationType.nft_received) - .build(); - } - - private _RoyaltyDecreasedNotification toRoyaltyDecreasedNotification(NotificationEntity entity) { - OpenListingBaseEntity listing = OpenListingBaseEntity.findById(entity.getActionId()); - _Collection collection = CollectionBaseView.toModel(listing.getCollectionId()); - return _RoyaltyDecreasedNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .collection(collection) - .notificationId(entity.getId()) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .oldValue(listing.getListingRoyalty()) - .newValue(collection.getRoyalty()) - .type(NotificationType.royalty_decreased) - .build(); - } - - private _RoyaltyReceivedNotification toRoyaltyReceivedNotification( - NotificationEntity entity, String type) { - _PriceInfo priceInfo = null; - boolean bundle = false; - CollectionBaseView collection = null; - _Asset asset = null; - if ("listing".equals(type)) { - ListingBaseEntity listing = ListingBaseEntity.findByListingId(entity.getActionId()); - priceInfo = - BaseMapper.buildPriceInfo( - listing.getToken(), listing.getPrice(), listing.getCollectionFee()); - bundle = listing.getBundle(); - collection = CollectionBaseView.findById(listing.getCollectionId()); - asset = AssetBaseEntity.toModel(listing.getPrimaryAssetId()); - } else if ("buyoffer".equals(type)) { - BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(entity.getActionId()); - priceInfo = buyoffer.getPrice().toModel(); - bundle = buyoffer.getBundle(); - collection = CollectionBaseView.findById(buyoffer.getCollectionId()); - asset = AssetBaseEntity.toModel(buyoffer.getAssetId()); - } else if ("auction".equals(type)) { - AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(entity.getActionId()); - priceInfo = - BaseMapper.buildPriceInfo( - auction.getToken(), auction.getCurrentBid(), auction.getCollectionFee()); - bundle = auction.getBundle(); - collection = CollectionBaseView.findById(auction.getCollectionId()); - asset = AssetBaseEntity.toModel(auction.getAssetId()); - } - - return _RoyaltyReceivedNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .collection(collection.toModel()) - .asset(asset) - .notificationId(entity.getId()) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .bundle(bundle) - .royaltyAmount(priceInfo) - .type(NotificationType.royalty_received) - .marketType(type) - .build(); - } - - private _ListingSoldNotification toListingSoldNotification(NotificationEntity entity) { - ListingBaseEntity listing = ListingBaseEntity.findByListingId(entity.getActionId()); - return _ListingSoldNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .asset(AssetBaseEntity.toModel(listing.getPrimaryAssetId())) - .bundleSize(listing.getBundleSize()) - .collection(CollectionBaseView.toModel(listing.getCollectionId())) - .notificationId(entity.getId()) - .priceInfo( - BaseMapper.buildPriceInfo( - listing.getToken(), listing.getPrice(), listing.getCollectionFee())) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .type(NotificationType.listing_sold) - .build(); - } - - private _AuctionOutbidNotification toAuctionOutbidNotification(NotificationEntity entity) { - AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(entity.getActionId()); - return _AuctionOutbidNotification.builder() - .acknowlegded(entity.getAcknowledged()) - .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) - .asset(AssetBaseEntity.toModel(auction.getAssetId())) - .bundleSize(auction.getBundleSize()) - .bidder(BaseMapper.mapAccount(auction.getHighestBidder())) - .collection(CollectionBaseView.toModel(auction.getCollectionId())) - .notificationId(entity.getId()) - .auctionId(entity.getActionId()) - .currentBid( - BaseMapper.buildPriceInfo( - auction.getToken(), auction.getCurrentBid(), auction.getCollectionFee())) - .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) - .type(NotificationType.auction_outbid) - .build(); - } -} +package com.kryptokrauts.shared.service; + +import org.apache.commons.lang3.StringUtils; + +import com.kryptokrauts.shared.BaseMapper; +import com.kryptokrauts.shared.dao.common.AssetBaseEntity; +import com.kryptokrauts.shared.dao.common.CollectionBaseView; +import com.kryptokrauts.shared.dao.realtime.AuctionBaseEntity; +import com.kryptokrauts.shared.dao.realtime.BuyofferBaseEntity; +import com.kryptokrauts.shared.dao.realtime.ListingBaseEntity; +import com.kryptokrauts.shared.dao.realtime.NotificationEntity; +import com.kryptokrauts.shared.dao.realtime.OpenListingBaseEntity; +import com.kryptokrauts.shared.dao.realtime.TransferEntity; +import com.kryptokrauts.shared.enums.NotificationType; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._Collection; +import com.kryptokrauts.shared.model.common._PriceInfo; +import com.kryptokrauts.shared.model.realtime._Notification; +import com.kryptokrauts.shared.model.realtime.notification._AuctionOutbidNotification; +import com.kryptokrauts.shared.model.realtime.notification._ListingSoldNotification; +import com.kryptokrauts.shared.model.realtime.notification._OfferNotification; +import com.kryptokrauts.shared.model.realtime.notification._RoyaltyDecreasedNotification; +import com.kryptokrauts.shared.model.realtime.notification._RoyaltyReceivedNotification; +import com.kryptokrauts.shared.model.realtime.notification._TransferNotification; + +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class NotificationTransformService { + + public _Notification toModel(NotificationEntity entity) { + if (entity.getActionId() != null && StringUtils.isNotBlank(entity.getActionType())) { + return switch (entity.getActionType()) { + case "offer_declined" -> toOfferNotification(entity, true); + case "offer_received" -> toOfferNotification(entity, false); + case "offer_accepted" -> toOfferNotification(entity, false); + case "auction_outbid" -> toAuctionOutbidNotification(entity); + case "nft_received" -> toTransferNotification(entity); + case "royalty_decreased" -> toRoyaltyDecreasedNotification(entity); + case "royalty_received_listing" -> toRoyaltyReceivedNotification(entity, "listing"); + case "royalty_received_buyoffer" -> toRoyaltyReceivedNotification(entity, "buyoffer"); + case "royalty_received_auction" -> toRoyaltyReceivedNotification(entity, "auction"); + case "listing_sold" -> toListingSoldNotification(entity); + default -> null; + }; + } + return null; + } + + private _OfferNotification toOfferNotification( + NotificationEntity entity, boolean useDeclineMemo) { + BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(entity.getActionId()); + return _OfferNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .asset(AssetBaseEntity.toModel(buyoffer.getAssetId())) + .bundleSize(buyoffer.getBundleSize()) + .buyer(BaseMapper.mapAccount(buyoffer.getBuyer())) + .seller(BaseMapper.mapAccount(buyoffer.getSeller())) + .collection(CollectionBaseView.toModel(buyoffer.getCollectionId())) + .notificationId(entity.getId()) + .buyofferId(entity.getActionId()) + .price(buyoffer.getPrice().toModel()) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .type(NotificationType.valueOf(entity.getActionType())) + .message(useDeclineMemo ? buyoffer.getDeclineMemo() : buyoffer.getMemo()) + .build(); + } + + private _TransferNotification toTransferNotification(NotificationEntity entity) { + TransferEntity transfer = TransferEntity.findByTransferId(entity.getActionId()); + return _TransferNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .asset(AssetBaseEntity.toModel(transfer.getPrimaryAssetId())) + .bundle(transfer.getBundle()) + .from(BaseMapper.mapAccount(transfer.getSender())) + .collection(CollectionBaseView.toModel(transfer.getCollectionId())) + .notificationId(entity.getId()) + .transferId(transfer.getTransferId()) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .type(NotificationType.nft_received) + .build(); + } + + private _RoyaltyDecreasedNotification toRoyaltyDecreasedNotification(NotificationEntity entity) { + OpenListingBaseEntity listing = OpenListingBaseEntity.findById(entity.getActionId()); + _Collection collection = CollectionBaseView.toModel(listing.getCollectionId()); + return _RoyaltyDecreasedNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .collection(collection) + .notificationId(entity.getId()) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .oldValue(listing.getListingRoyalty()) + .newValue(collection.getRoyalty()) + .type(NotificationType.royalty_decreased) + .build(); + } + + private _RoyaltyReceivedNotification toRoyaltyReceivedNotification( + NotificationEntity entity, String type) { + _PriceInfo priceInfo = null; + boolean bundle = false; + CollectionBaseView collection = null; + _Asset asset = null; + if ("listing".equals(type)) { + ListingBaseEntity listing = ListingBaseEntity.findByListingId(entity.getActionId()); + priceInfo = + BaseMapper.buildPriceInfo( + listing.getToken(), listing.getPrice(), listing.getCollectionFee()); + bundle = listing.getBundle(); + collection = CollectionBaseView.findById(listing.getCollectionId()); + asset = AssetBaseEntity.toModel(listing.getPrimaryAssetId()); + } else if ("buyoffer".equals(type)) { + BuyofferBaseEntity buyoffer = BuyofferBaseEntity.findByBuyofferId(entity.getActionId()); + priceInfo = buyoffer.getPrice().toModel(); + bundle = buyoffer.getBundle(); + collection = CollectionBaseView.findById(buyoffer.getCollectionId()); + asset = AssetBaseEntity.toModel(buyoffer.getAssetId()); + } else if ("auction".equals(type)) { + AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(entity.getActionId()); + priceInfo = + BaseMapper.buildPriceInfo( + auction.getToken(), auction.getCurrentBid(), auction.getCollectionFee()); + bundle = auction.getBundle(); + collection = CollectionBaseView.findById(auction.getCollectionId()); + asset = AssetBaseEntity.toModel(auction.getAssetId()); + } + + return _RoyaltyReceivedNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .collection(collection.toModel()) + .asset(asset) + .notificationId(entity.getId()) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .bundle(bundle) + .royaltyAmount(priceInfo) + .type(NotificationType.royalty_received) + .marketType(type) + .build(); + } + + private _ListingSoldNotification toListingSoldNotification(NotificationEntity entity) { + ListingBaseEntity listing = ListingBaseEntity.findByListingId(entity.getActionId()); + return _ListingSoldNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .asset(AssetBaseEntity.toModel(listing.getPrimaryAssetId())) + .bundleSize(listing.getBundleSize()) + .collection(CollectionBaseView.toModel(listing.getCollectionId())) + .notificationId(entity.getId()) + .priceInfo( + BaseMapper.buildPriceInfo( + listing.getToken(), listing.getPrice(), listing.getCollectionFee())) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .type(NotificationType.listing_sold) + .build(); + } + + private _AuctionOutbidNotification toAuctionOutbidNotification(NotificationEntity entity) { + AuctionBaseEntity auction = AuctionBaseEntity.findByAuctionId(entity.getActionId()); + return _AuctionOutbidNotification.builder() + .acknowlegded(entity.getAcknowledged()) + .acknowlegdedDate(BaseMapper.mapDate(entity.getAcknowledgedDate())) + .asset(AssetBaseEntity.toModel(auction.getAssetId())) + .bundleSize(auction.getBundleSize()) + .bidder(BaseMapper.mapAccount(auction.getHighestBidder())) + .collection(CollectionBaseView.toModel(auction.getCollectionId())) + .notificationId(entity.getId()) + .auctionId(entity.getActionId()) + .currentBid( + BaseMapper.buildPriceInfo( + auction.getToken(), auction.getCurrentBid(), auction.getCollectionFee())) + .receivedDate(BaseMapper.mapDate(entity.getBlockTimestamp())) + .type(NotificationType.auction_outbid) + .build(); + } +} diff --git a/src/main/java/com/kryptokrauts/shared/service/TaskTransformService.java b/src/main/java/com/kryptokrauts/shared/service/TaskTransformService.java index 479ccc8..101f70d 100644 --- a/src/main/java/com/kryptokrauts/shared/service/TaskTransformService.java +++ b/src/main/java/com/kryptokrauts/shared/service/TaskTransformService.java @@ -1,101 +1,101 @@ -package com.kryptokrauts.shared.service; - -import com.kryptokrauts.shared.BaseMapper; -import com.kryptokrauts.shared.dao.realtime.TaskEntity; -import com.kryptokrauts.shared.model.common._Asset; -import com.kryptokrauts.shared.model.common._Collection; -import com.kryptokrauts.shared.model.realtime._Task; -import com.kryptokrauts.shared.model.realtime.task._AuctionEndClaimNFTs; -import com.kryptokrauts.shared.model.realtime.task._AuctionEndZeroBids; -import com.kryptokrauts.shared.model.realtime.task._InvalidListing; -import com.kryptokrauts.shared.model.realtime.task._InvalidOffer; -import jakarta.enterprise.context.ApplicationScoped; -import org.apache.commons.lang3.StringUtils; - -@ApplicationScoped -public class TaskTransformService { - - public _Task toModel(TaskEntity task) { - if (task.getId() != null && StringUtils.isNotBlank(task.getTaskType())) { - return switch (task.getTaskType()) { - case "auction_won_claim_nfts" -> toAuctionEndTask(task); - case "auction_sold_claim_funds" -> toAuctionEndTask(task); - case "auction_end_zero_bids" -> toAuctionZeroBids(task); - case "invalid_listing" -> toInvalidListing(task); - case "invalid_offer" -> toInvalidOffer(task); - default -> null; - }; - } - return null; - } - - private _AuctionEndClaimNFTs toAuctionEndTask(TaskEntity task) { - return _AuctionEndClaimNFTs.builder() - .asset(toAsset(task)) - .auctionId(task.getActionId()) - .bundleSize(task.getBundleSize()) - .bundle(task.getBundle()) - .collection(toCollection(task)) - .type(task.getTaskType()) - .winningBid(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) - .build(); - } - - private _AuctionEndZeroBids toAuctionZeroBids(TaskEntity task) { - return _AuctionEndZeroBids.builder() - .asset(toAsset(task)) - .auctionId(task.getActionId()) - .bundleSize(task.getBundleSize()) - .bundle(task.getBundle()) - .collection(toCollection(task)) - .type(task.getTaskType()) - .startingBid(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) - .build(); - } - - private _InvalidListing toInvalidListing(TaskEntity task) { - return _InvalidListing.builder() - .asset(toAsset(task)) - .listingId(task.getActionId()) - .bundleSize(task.getBundleSize()) - .bundle(task.getBundle()) - .collection(toCollection(task)) - .type(task.getTaskType()) - .price(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) - .build(); - } - - private _InvalidOffer toInvalidOffer(TaskEntity task) { - return _InvalidOffer.builder() - .asset(toAsset(task)) - .buyofferId(task.getActionId()) - .bundleSize(task.getBundleSize()) - .bundle(task.getBundle()) - .collection(toCollection(task)) - .type(task.getTaskType()) - .price(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) - .build(); - } - - private _Collection toCollection(TaskEntity task) { - return _Collection.builder() - .blacklisted(task.getBlacklisted()) - .collectionId(task.getCollectionId()) - .collectionImage(task.getCollectionImage()) - .collectionName(task.getCollectionName()) - .shielded(task.getShielded()) - .build(); - } - - private _Asset toAsset(TaskEntity task) { - return _Asset.builder() - .assetId(task.getAssetId()) - .assetMedia(task.getAssetMedia()) - .assetMediaPreview(task.getAssetMediaPreview()) - .assetMediaType(task.getAssetMediaType()) - .assetName(task.getAssetName()) - .editionSize(task.getEditionSize()) - .serial(task.getSerial()) - .build(); - } -} +package com.kryptokrauts.shared.service; + +import com.kryptokrauts.shared.BaseMapper; +import com.kryptokrauts.shared.dao.realtime.TaskEntity; +import com.kryptokrauts.shared.model.common._Asset; +import com.kryptokrauts.shared.model.common._Collection; +import com.kryptokrauts.shared.model.realtime._Task; +import com.kryptokrauts.shared.model.realtime.task._AuctionEndClaimNFTs; +import com.kryptokrauts.shared.model.realtime.task._AuctionEndZeroBids; +import com.kryptokrauts.shared.model.realtime.task._InvalidListing; +import com.kryptokrauts.shared.model.realtime.task._InvalidOffer; +import jakarta.enterprise.context.ApplicationScoped; +import org.apache.commons.lang3.StringUtils; + +@ApplicationScoped +public class TaskTransformService { + + public _Task toModel(TaskEntity task) { + if (task.getId() != null && StringUtils.isNotBlank(task.getTaskType())) { + return switch (task.getTaskType()) { + case "auction_won_claim_nfts" -> toAuctionEndTask(task); + case "auction_sold_claim_funds" -> toAuctionEndTask(task); + case "auction_end_zero_bids" -> toAuctionZeroBids(task); + case "invalid_listing" -> toInvalidListing(task); + case "invalid_offer" -> toInvalidOffer(task); + default -> null; + }; + } + return null; + } + + private _AuctionEndClaimNFTs toAuctionEndTask(TaskEntity task) { + return _AuctionEndClaimNFTs.builder() + .asset(toAsset(task)) + .auctionId(task.getActionId()) + .bundleSize(task.getBundleSize()) + .bundle(task.getBundle()) + .collection(toCollection(task)) + .type(task.getTaskType()) + .winningBid(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) + .build(); + } + + private _AuctionEndZeroBids toAuctionZeroBids(TaskEntity task) { + return _AuctionEndZeroBids.builder() + .asset(toAsset(task)) + .auctionId(task.getActionId()) + .bundleSize(task.getBundleSize()) + .bundle(task.getBundle()) + .collection(toCollection(task)) + .type(task.getTaskType()) + .startingBid(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) + .build(); + } + + private _InvalidListing toInvalidListing(TaskEntity task) { + return _InvalidListing.builder() + .asset(toAsset(task)) + .listingId(task.getActionId()) + .bundleSize(task.getBundleSize()) + .bundle(task.getBundle()) + .collection(toCollection(task)) + .type(task.getTaskType()) + .price(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) + .build(); + } + + private _InvalidOffer toInvalidOffer(TaskEntity task) { + return _InvalidOffer.builder() + .asset(toAsset(task)) + .buyofferId(task.getActionId()) + .bundleSize(task.getBundleSize()) + .bundle(task.getBundle()) + .collection(toCollection(task)) + .type(task.getTaskType()) + .price(BaseMapper.buildPriceInfo(task.getToken(), task.getPrice(), null)) + .build(); + } + + private _Collection toCollection(TaskEntity task) { + return _Collection.builder() + .blacklisted(task.getBlacklisted()) + .collectionId(task.getCollectionId()) + .collectionImage(task.getCollectionImage()) + .collectionName(task.getCollectionName()) + .shielded(task.getShielded()) + .build(); + } + + private _Asset toAsset(TaskEntity task) { + return _Asset.builder() + .assetId(task.getAssetId()) + .assetMedia(task.getAssetMedia()) + .assetMediaPreview(task.getAssetMediaPreview()) + .assetMediaType(task.getAssetMediaType()) + .assetName(task.getAssetName()) + .editionSize(task.getEditionSize()) + .serial(task.getSerial()) + .build(); + } +}