Skip to content

Commit 738ce23

Browse files
authored
Extract nostr service to package (#66)
1 parent be88fef commit 738ce23

56 files changed

Lines changed: 1234 additions & 373 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 32 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
tags: |
4343
ghcr.io/edufeed-org/oer-finder-plugin:latest
4444
45-
oer-backend-lint:
45+
oer-backend:
4646
runs-on: ubuntu-latest
4747

4848
steps:
@@ -56,39 +56,18 @@ jobs:
5656
- run: corepack prepare pnpm@9 --activate
5757

5858
- run: pnpm install --frozen-lockfile
59-
- run: pnpm run lint
6059

61-
oer-backend-tsc:
62-
runs-on: ubuntu-latest
60+
- name: Lint
61+
run: pnpm run lint
6362

64-
steps:
65-
- uses: actions/checkout@v4
63+
- name: Format check
64+
run: pnpm run format --check
6665

67-
- uses: actions/setup-node@v6
68-
with:
69-
node-version: '22'
70-
71-
- run: corepack enable
72-
- run: corepack prepare pnpm@9 --activate
73-
74-
- run: pnpm install --frozen-lockfile
75-
- run: pnpm run type-check
76-
77-
oer-backend-test:
78-
runs-on: ubuntu-latest
79-
steps:
80-
- uses: actions/checkout@v4
81-
82-
- uses: actions/setup-node@v6
83-
with:
84-
node-version: '22'
85-
86-
- run: corepack enable
87-
- run: corepack prepare pnpm@9 --activate
88-
89-
- run: pnpm install --frozen-lockfile
90-
- run: pnpm run test
66+
- name: Type check
67+
run: pnpm run type-check
9168

69+
- name: Test
70+
run: pnpm run test
9271

9372
oer-backend-test-e2e:
9473
runs-on: ubuntu-latest
@@ -128,7 +107,7 @@ jobs:
128107
POSTGRES_QUERY_TIMEOUT: 10000
129108
POSTGRES_STATEMENT_TIMEOUT: 10000
130109

131-
oer-finder-plugin-lint:
110+
oer-finder-plugin:
132111
runs-on: ubuntu-latest
133112

134113
steps:
@@ -142,26 +121,21 @@ jobs:
142121
- run: corepack prepare pnpm@9 --activate
143122

144123
- run: pnpm install --frozen-lockfile
145-
- run: pnpm --filter @edufeed-org/oer-finder-plugin run lint
146-
147-
oer-finder-plugin-tsc:
148-
runs-on: ubuntu-latest
124+
- run: pnpm --filter @edufeed-org/oer-finder-api-client run build
149125

150-
steps:
151-
- uses: actions/checkout@v4
126+
- name: Lint
127+
run: pnpm --filter @edufeed-org/oer-finder-plugin run lint
152128

153-
- uses: actions/setup-node@v6
154-
with:
155-
node-version: '22'
129+
- name: Format check
130+
run: pnpm --filter @edufeed-org/oer-finder-plugin run format --check
156131

157-
- run: corepack enable
158-
- run: corepack prepare pnpm@9 --activate
132+
- name: Type check
133+
run: pnpm --filter @edufeed-org/oer-finder-plugin run type-check
159134

160-
- run: pnpm install --frozen-lockfile
161-
- run: pnpm --filter @edufeed-org/oer-finder-api-client run build
162-
- run: pnpm --filter @edufeed-org/oer-finder-plugin run type-check
135+
- name: Test
136+
run: pnpm --filter @edufeed-org/oer-finder-plugin run test
163137

164-
oer-finder-plugin-test:
138+
oer-nostr:
165139
runs-on: ubuntu-latest
166140

167141
steps:
@@ -175,5 +149,15 @@ jobs:
175149
- run: corepack prepare pnpm@9 --activate
176150

177151
- run: pnpm install --frozen-lockfile
178-
- run: pnpm --filter @edufeed-org/oer-finder-api-client run build
179-
- run: pnpm --filter @edufeed-org/oer-finder-plugin run test
152+
153+
- name: Lint
154+
run: pnpm --filter @edufeed-org/oer-nostr run lint
155+
156+
- name: Format check
157+
run: pnpm --filter @edufeed-org/oer-nostr run format --check
158+
159+
- name: Type check
160+
run: pnpm --filter @edufeed-org/oer-nostr run type-check
161+
162+
- name: Test
163+
run: pnpm --filter @edufeed-org/oer-nostr run test

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ COPY --chown=node:node package.json pnpm-workspace.yaml pnpm-lock.yaml $APP_PATH
4040
COPY --chown=node:node packages/oer-adapter-core $APP_PATH/packages/oer-adapter-core/
4141
COPY --chown=node:node packages/oer-adapter-arasaac $APP_PATH/packages/oer-adapter-arasaac/
4242
COPY --chown=node:node packages/oer-adapter-openverse $APP_PATH/packages/oer-adapter-openverse/
43+
COPY --chown=node:node packages/oer-nostr $APP_PATH/packages/oer-nostr/
4344
RUN pnpm install
4445

4546
COPY --chown=node:node src tsconfig.build.json tsconfig.json $APP_PATH/

package.json

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@
77
"license": "MIT",
88
"scripts": {
99
"build:adapters": "pnpm --filter '@edufeed-org/oer-adapter-*' build",
10-
"build": "pnpm run build:adapters && nest build",
10+
"build:nostr": "pnpm --filter '@edufeed-org/oer-nostr' build",
11+
"build:packages": "pnpm run build:adapters && pnpm run build:nostr",
12+
"build": "pnpm run build:packages && nest build",
1113
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
1214
"start": "pnpm run start:prod",
13-
"start:dev": "pnpm run build:adapters && nest start --watch",
14-
"start:debug": "pnpm run build:adapters && nest start --debug --watch",
15+
"start:dev": "pnpm run build:packages && nest start --watch",
16+
"start:debug": "pnpm run build:packages && nest start --debug --watch",
1517
"start:prod": "pnpm run migration:run:prod && node dist/main",
1618
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17-
"type-check": "pnpm run build:adapters && tsc --noEmit",
18-
"test": "pnpm run build:adapters && NODE_ENV=test jest",
19-
"test:watch": "pnpm run build:adapters && NODE_ENV=test jest --watch",
20-
"test:cov": "pnpm run build:adapters && NODE_ENV=test jest --coverage",
21-
"test:debug": "pnpm run build:adapters && NODE_ENV=test node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
22-
"test:e2e": "pnpm run build:adapters && NODE_ENV=test jest --config ./test/jest-e2e.json --runInBand",
19+
"type-check": "pnpm run build:packages && tsc --noEmit",
20+
"test": "pnpm run build:packages && NODE_ENV=test jest",
21+
"test:watch": "pnpm run build:packages && NODE_ENV=test jest --watch",
22+
"test:cov": "pnpm run build:packages && NODE_ENV=test jest --coverage",
23+
"test:debug": "pnpm run build:packages && NODE_ENV=test node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
24+
"test:e2e": "pnpm run build:packages && NODE_ENV=test jest --config ./test/jest-e2e.json --runInBand",
2325
"migration:generate": "NODE_OPTIONS='-r ts-node/register -r tsconfig-paths/register' typeorm -d src/data-source.ts migration:generate",
2426
"migration:create": "NODE_OPTIONS='-r ts-node/register -r tsconfig-paths/register' typeorm -d src/data-source.ts migration:create",
2527
"migration:run": "NODE_OPTIONS='-r ts-node/register -r tsconfig-paths/register' typeorm -d src/data-source.ts migration:run",
@@ -34,6 +36,7 @@
3436
"@edufeed-org/oer-adapter-arasaac": "workspace:*",
3537
"@edufeed-org/oer-adapter-core": "workspace:*",
3638
"@edufeed-org/oer-adapter-openverse": "workspace:*",
39+
"@edufeed-org/oer-nostr": "workspace:*",
3740
"@nestjs/common": "^11.1.8",
3841
"@nestjs/config": "^4.0.2",
3942
"@nestjs/core": "^11.1.8",

src/nostr/__tests__/event-deletion.service.spec.ts renamed to packages/oer-nostr/__tests__/event-deletion.service.spec.ts

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import { Test, TestingModule } from '@nestjs/testing';
2-
import { getRepositoryToken } from '@nestjs/typeorm';
32
import { Repository } from 'typeorm';
4-
import { EventDeletionService } from '../services/event-deletion.service';
5-
import { OpenEducationalResource } from '../../oer/entities/open-educational-resource.entity';
6-
import { OerSource } from '../../oer/entities/oer-source.entity';
3+
import {
4+
EventDeletionService,
5+
OER_REPOSITORY,
6+
} from '../src/services/event-deletion.service';
7+
import { OER_SOURCE_REPOSITORY } from '../src/services/nostr-event-database.service';
8+
import type {
9+
OerSourceEntity,
10+
OpenEducationalResourceEntity,
11+
} from '../src/types/entities.types';
712
import type { Event } from 'nostr-tools/core';
813
import {
914
EVENT_AMB_KIND,
1015
EVENT_FILE_KIND,
11-
} from '../constants/event-kinds.constants';
12-
import { EventFactory } from '../../../test/fixtures';
13-
import { SOURCE_NAME_NOSTR } from '../../oer/constants';
16+
} from '../src/constants/event-kinds.constants';
17+
import { EventFactory } from '../src/testing';
18+
import { SOURCE_NAME_NOSTR } from '../src/constants/source.constants';
1419

1520
/**
1621
* Represents a Nostr event stored in source_data.
@@ -41,8 +46,8 @@ function createMockOerSource(
4146
eventId: string,
4247
kind: number,
4348
pubkey: string,
44-
overrides: Partial<OerSource> = {},
45-
): OerSource {
49+
overrides: Partial<OerSourceEntity> = {},
50+
): OerSourceEntity {
4651
const eventData: NostrEventData = {
4752
id: eventId,
4853
kind,
@@ -72,15 +77,15 @@ function createMockOerSource(
7277

7378
describe('EventDeletionService', () => {
7479
let service: EventDeletionService;
75-
let oerRepository: Repository<OpenEducationalResource>;
76-
let oerSourceRepository: Repository<OerSource>;
80+
let oerRepository: Repository<OpenEducationalResourceEntity>;
81+
let oerSourceRepository: Repository<OerSourceEntity>;
7782

7883
beforeEach(async () => {
7984
const module: TestingModule = await Test.createTestingModule({
8085
providers: [
8186
EventDeletionService,
8287
{
83-
provide: getRepositoryToken(OpenEducationalResource),
88+
provide: OER_REPOSITORY,
8489
useValue: {
8590
update: jest.fn(),
8691
createQueryBuilder: jest.fn(() => ({
@@ -92,7 +97,7 @@ describe('EventDeletionService', () => {
9297
},
9398
},
9499
{
95-
provide: getRepositoryToken(OerSource),
100+
provide: OER_SOURCE_REPOSITORY,
96101
useValue: {
97102
findOne: jest.fn(),
98103
find: jest.fn().mockResolvedValue([]),
@@ -113,11 +118,10 @@ describe('EventDeletionService', () => {
113118
.compile();
114119

115120
service = module.get<EventDeletionService>(EventDeletionService);
116-
oerRepository = module.get<Repository<OpenEducationalResource>>(
117-
getRepositoryToken(OpenEducationalResource),
118-
);
119-
oerSourceRepository = module.get<Repository<OerSource>>(
120-
getRepositoryToken(OerSource),
121+
oerRepository =
122+
module.get<Repository<OpenEducationalResourceEntity>>(OER_REPOSITORY);
123+
oerSourceRepository = module.get<Repository<OerSourceEntity>>(
124+
OER_SOURCE_REPOSITORY,
121125
);
122126
});
123127

@@ -265,7 +269,9 @@ describe('EventDeletionService', () => {
265269
'event1',
266270
EVENT_AMB_KIND,
267271
'pubkey1',
268-
{ oer_id: 'oer1' },
272+
{
273+
oer_id: 'oer1',
274+
},
269275
);
270276

271277
jest.spyOn(oerSourceRepository, 'findOne').mockResolvedValue(mockSource);
@@ -290,7 +296,9 @@ describe('EventDeletionService', () => {
290296
'file1',
291297
EVENT_FILE_KIND,
292298
'pubkey1',
293-
{ oer_id: 'oer1' },
299+
{
300+
oer_id: 'oer1',
301+
},
294302
);
295303

296304
// Mock OerSource repository to return sources for this file event (for nullifyFileMetadataForEvent)

src/nostr/__tests__/nostr-client.service.spec.ts renamed to packages/oer-nostr/__tests__/nostr-client.service.spec.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { Test, TestingModule } from '@nestjs/testing';
2-
import { ConfigService } from '@nestjs/config';
3-
import { NostrClientService } from '../services/nostr-client.service';
4-
import { NostrEventDatabaseService } from '../services/nostr-event-database.service';
5-
import { EventDeletionService } from '../services/event-deletion.service';
6-
import { OerExtractionService } from '../../oer/services/oer-extraction.service';
2+
import {
3+
NostrClientService,
4+
CONFIG_SERVICE,
5+
} from '../src/services/nostr-client.service';
6+
import { NOSTR_EVENT_DATABASE_SERVICE } from '../src/services/nostr-event-database.service';
7+
import { EVENT_DELETION_SERVICE } from '../src/services/event-deletion.service';
8+
import { OER_EXTRACTION_SERVICE } from '../src/services/oer-extraction.service';
79
import { verifyEvent } from 'nostr-tools/pure';
810

911
// Mock the Relay module to prevent actual connections
@@ -79,19 +81,19 @@ describe('NostrClientService', () => {
7981
providers: [
8082
NostrClientService,
8183
{
82-
provide: NostrEventDatabaseService,
84+
provide: NOSTR_EVENT_DATABASE_SERVICE,
8385
useValue: mockDatabaseService,
8486
},
8587
{
86-
provide: OerExtractionService,
88+
provide: OER_EXTRACTION_SERVICE,
8789
useValue: mockOerService,
8890
},
8991
{
90-
provide: EventDeletionService,
92+
provide: EVENT_DELETION_SERVICE,
9193
useValue: mockEventDeletionService,
9294
},
9395
{
94-
provide: ConfigService,
96+
provide: CONFIG_SERVICE,
9597
useValue: mockConfigService,
9698
},
9799
],

src/nostr/__tests__/nostr-event-database.service.spec.ts renamed to packages/oer-nostr/__tests__/nostr-event-database.service.spec.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import { Test, TestingModule } from '@nestjs/testing';
2-
import { getRepositoryToken } from '@nestjs/typeorm';
32
import { Repository } from 'typeorm';
4-
import { NostrEventDatabaseService } from '../services/nostr-event-database.service';
5-
import { OerSource } from '../../oer/entities/oer-source.entity';
6-
import { EVENT_AMB_KIND } from '../constants/event-kinds.constants';
7-
import { EventFactory } from '../../../test/fixtures';
8-
import { SOURCE_NAME_NOSTR } from '../../oer/constants';
3+
import {
4+
NostrEventDatabaseService,
5+
OER_SOURCE_REPOSITORY,
6+
} from '../src/services/nostr-event-database.service';
7+
import type { OerSourceEntity } from '../src/types/entities.types';
8+
import { EVENT_AMB_KIND } from '../src/constants/event-kinds.constants';
9+
import { EventFactory } from '../src/testing';
10+
import { SOURCE_NAME_NOSTR } from '../src/constants/source.constants';
911

1012
/**
1113
* Creates a mock OerSource for testing.
1214
*/
13-
function createMockOerSource(overrides: Partial<OerSource> = {}): OerSource {
14-
const defaults: OerSource = {
15+
function createMockOerSource(
16+
overrides: Partial<OerSourceEntity> = {},
17+
): OerSourceEntity {
18+
const defaults: OerSourceEntity = {
1519
id: 'test-source-id',
1620
oer_id: null,
1721
oer: null,
@@ -39,7 +43,7 @@ function createMockOerSource(overrides: Partial<OerSource> = {}): OerSource {
3943

4044
describe('NostrEventDatabaseService', () => {
4145
let service: NostrEventDatabaseService;
42-
let mockRepository: jest.Mocked<Repository<OerSource>>;
46+
let mockRepository: jest.Mocked<Repository<OerSourceEntity>>;
4347

4448
beforeEach(async () => {
4549
mockRepository = {
@@ -51,13 +55,13 @@ describe('NostrEventDatabaseService', () => {
5155
count: jest.fn(),
5256
createQueryBuilder: jest.fn(),
5357
update: jest.fn(),
54-
} as unknown as jest.Mocked<Repository<OerSource>>;
58+
} as unknown as jest.Mocked<Repository<OerSourceEntity>>;
5559

5660
const module: TestingModule = await Test.createTestingModule({
5761
providers: [
5862
NostrEventDatabaseService,
5963
{
60-
provide: getRepositoryToken(OerSource),
64+
provide: OER_SOURCE_REPOSITORY,
6165
useValue: mockRepository,
6266
},
6367
],

0 commit comments

Comments
 (0)