Skip to content

Service

Integration

All commands below are to be executed from the repository root. Only self-contained services might be integrated. Other services are not available thus they need to be scaffolded.

SELF-CONTINED SERVICES

  • Activity (@develit-services/activity)
  • Auth (@develit-services/auth)
  • Bank (@develit-services/bank)
  • Blockchain (@develit-services/blockchain)
  • CurrencyFeed (@develit-services/currencyfeed)
  • Document (@develit-services/document)
  • Ledger (@develit-services/ledger)
  • Notification (@develit-services/notification)
  • RBAC (@develit-services/rbac)
  • Watchdog (@develit-services/watchdog)
  1. Create services/{service-name} directory

  2. Determine the port number. Services are assigned ports alphabetically: the first service uses port 9230, the second uses 9231, and so forth.

  3. Create services/{service-name}/package.json file based on the following pattern:

json
{
  "name": "@services/{service-name}",
  "version": "0.0.0",
  "author": "Develit.io s.r.o.",
  "private": true,
  "type": "module",
  "scripts": {
    "types": "bash typegen.sh",
    "wrangler:generate": "bunx develit wrangler:generate",
    "dev": "wrangler dev --persist-to ../../.wrangler/state --port {port-number} -c ./wrangler.jsonc -c ../../apps/secrets-store/wrangler.jsonc",
    "lint": "biome check",
    "lint:fix": "biome check --fix",
    "test": "vitest",
    "test:cov": "vitest run --coverage",
    "test:unit": "vitest unit fixtures",
    "test:int": "vitest integration",
    "db:init": "wrangler d1 execute {project-name}-{service-name} --local --persist-to ../../.wrangler/state --command=\"SELECT 'Creating database...' AS status;\"",
    "db:generate": "NODE_OPTIONS='--import tsx' drizzle-kit generate",
    "db:migrate": " NODE_OPTIONS='--import tsx' drizzle-kit migrate",
    "db:explore": "NODE_OPTIONS='--import tsx' drizzle-kit studio"
  }
}
  1. Create services/{service-name}/tsconfig.json file based on the following pattern:
json
{
  "extends": "../../tsconfig.base.json",
  "files": [],
  "references": [
    {
      "path": "./tsconfig.app.json"
    }
  ]
}
  1. Create services/{service-name}/tsconfig.app.json file based on the following pattern:
json
{
  "extends": "../../tsconfig.base.json",
  "include": ["src/**/*.ts", "test/**/*.ts"],
  "references": [
    {
      "path": "../../apps/secrets-store/tsconfig.app.json"
    }
  ],
  "compilerOptions": {
    "outDir": "./tsbuild",
    "types": [
      "@cloudflare/vitest-pool-workers",
      "@cloudflare/workers-types",
      "./worker-configuration.d.ts",
      "node"
    ]
  }
}
  1. Create services/{service-name}/typegen.sh file based on the following pattern:
zsh
#!/bin/bash

wrangler types --env-interface {ServiceName}Env --include-runtime false -c ./wrangler.jsonc -c ../../apps/secrets-store/wrangler.jsonc

FILE="worker-configuration.d.ts"

sed -E -i '' 's|Service<([^>]+)>|InstanceType<\1>|g' "$FILE"
  1. Create services/{service-name}/wrangler.ts file based on the following pattern:
ts
import { define{ServiceName}ServiceWrangler } from '@develit-services/{service-name}/wrangler'

export default define{ServiceName}ServiceWrangler({
  project: '{project-name}',
  name: '{service-name}-service',
  envs: {},
})
  1. Extend envs key inside services/{service-name}/wrangler.ts file based on the type.

Database IDs

  • For localhost use random UUID and replace first eight characters with 00000000.
  • For databases that are not yet deployed use nullish UUID (00000000-0000-0000-0000-000000000000).
  1. If the service exports db-schema, crete services/{service-name}/drizzle.config.ts file based on the following pattern:
ts
import { getDrizzleD1Config } from '@develit-io/backend-sdk'

export default getDrizzleD1Config()
  1. Create services/{service-name}/src/index.ts file based on the following pattern:
ts
import { define{ServiceName}Service } from '@develit-services/{service-name}/worker'
import type { WorkerEntrypoint } from 'cloudflare:workers'

const Base{ServiceName}Service: new (
  ctx: ExecutionContext,
  env: {ServiceName}Env,
) => InstanceType<ReturnType<typeof define{ServiceName}Service>> = define{ServiceName}Service()

export default class {ServiceName}Service
  extends Base{ServiceName}Service
  implements WorkerEntrypoint<{ServiceName}Env> {}
  1. If the service exports workflows, add this line at the end of the services/{service-name}/src/index.ts:
ts
export * from '@develit-services/{service-name}/workflows'
  1. If the service exports db-schema, create services/{service-name}/src/database/schema/index.ts file based on the following pattern:
ts
export * from '@develit-services/{service-name}/db-schema'
  1. Extend the paths key of tsconfig.base.json file based on the following pattern:
json
{
  "@services/{service-name}/*": ["./services/{service-name}/*"]
}
  1. If the service exports db-schema, run bun db:generate at services/{service-name}.

  2. Run bun nx sync at the root of the repository.