Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .github/workflows/auto-release-pr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Auto Release PR

on:
push:
branches: [develop]
workflow_dispatch:

permissions:
contents: read
pull-requests: write

concurrency:
group: auto-release-pr
cancel-in-progress: false

jobs:
create-release-pr:
name: Create Release PR
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Fetch main branch
run: git fetch origin main

- name: Check for existing PR
id: check-pr
run: |
PR_COUNT=$(gh pr list --base main --head develop --state open --json number --jq 'length')
echo "pr_exists=$([[ $PR_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
echo "::notice::Open PRs from develop to main: $PR_COUNT"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Check for differences
id: check-diff
if: steps.check-pr.outputs.pr_exists == 'false'
run: |
DIFF_COUNT=$(git rev-list --count origin/main..origin/develop)
echo "has_changes=$([[ $DIFF_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
echo "commit_count=$DIFF_COUNT" >> $GITHUB_OUTPUT
echo "::notice::Commits ahead of main: $DIFF_COUNT"

- name: Create Release PR
if: steps.check-pr.outputs.pr_exists == 'false' && steps.check-diff.outputs.has_changes == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_COUNT: ${{ steps.check-diff.outputs.commit_count }}
run: |
printf '%s\n' \
"## Automatic Release PR" \
"" \
"This PR was automatically created after changes were pushed to develop." \
"" \
"**Commits:** ${COMMIT_COUNT} new commit(s)" \
"" \
"### Checklist" \
"- [ ] Review all changes" \
"- [ ] Verify CI passes" \
"- [ ] Approve and merge when ready for production" \
> /tmp/pr-body.md

gh pr create \
--base main \
--head develop \
--title "Release: develop -> main" \
--body-file /tmp/pr-body.md
28 changes: 24 additions & 4 deletions prices/prices.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,30 @@ export class PricesService {
private readonly logger = new Logger(this.constructor.name);
private fetchedPrices: PriceQueryObjectArray = {};
private euroPrice: PriceQueryCurrencies = {};
private euroPriceTimestamp: number = 0;
private depsPrice: PriceQueryCurrencies = {};

private static readonly EURO_PRICE_TTL = 60_000; // 60 seconds

constructor(
private readonly positionsService: PositionsService,
private readonly deps: EcosystemDepsService
) {}

private isEuroPriceStale(): boolean {
return !this.euroPrice?.usd || Date.now() - this.euroPriceTimestamp > PricesService.EURO_PRICE_TTL;
}

private async refreshEuroPriceIfStale(): Promise<void> {
if (this.isEuroPriceStale()) {
const fetched = await this.fetchEuroPrice();
if (fetched) {
this.euroPrice = fetched;
this.euroPriceTimestamp = Date.now();
}
}
}

getPrices(): ApiPriceListing {
return Object.values(this.fetchedPrices);
}
Expand Down Expand Up @@ -64,8 +81,8 @@ export class PricesService {
}

async getDepsPrice(): Promise<PriceQueryCurrencies> {
if (!this.depsPrice) this.depsPrice = await this.fetchFromEcosystemDeps(this.getDeps());
if (!this.euroPrice) this.euroPrice = await this.fetchEuroPrice();
if (!this.depsPrice?.usd) this.depsPrice = await this.fetchFromEcosystemDeps(this.getDeps());
await this.refreshEuroPriceIfStale();

return {
usd: Number(this.depsPrice.usd.toFixed(4)),
Expand All @@ -91,7 +108,7 @@ export class PricesService {
}

async getEuroPrice(): Promise<PriceQueryCurrencies> {
if (!this.euroPrice) this.euroPrice = await this.fetchEuroPrice();
await this.refreshEuroPriceIfStale();

return {
usd: Number(this.euroPrice.usd.toFixed(4)),
Expand Down Expand Up @@ -205,7 +222,10 @@ export class PricesService {
this.logger.debug('Updating Prices');

const euroPrice = await this.fetchEuroPrice();
if (euroPrice) this.euroPrice = euroPrice;
if (euroPrice) {
this.euroPrice = euroPrice;
this.euroPriceTimestamp = Date.now();
}

const deps = this.getDeps();
const m = this.getMint();
Expand Down
Loading