Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/remove gdi deps #37

Merged
merged 2 commits into from
Jun 25, 2024
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
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,22 @@
},
"license": "MIT",
"dependencies": {
"@helsingborg-stad/gdi-api-node": "^1.0.10",
"@graphql-tools/schema": "^10.0.4",
"@koa/cors": "^3.4.1",
"@sendgrid/mail": "^7.7.0",
"@types/pdfkit": "^0.13.4",
"@types/qrcode": "^1.5.5",
"@types/xlsx": "^0.0.36",
"JSONStream": "^1.3.5",
"ajv": "^8.12.0",
"debug": "^4.3.4",
"debug": "^4.3.5",
"dotenv": "^16.0.2",
"email-validator": "^2.0.4",
"fastq": "^1.15.0",
"graphql": "^16.6.0",
"graphql-tools": "^8.3.6",
"handlebars": "^4.7.8",
"http-errors": "^2.0.0",
"http-status-codes": "^2.2.0",
"jsonwebtoken": "^9.0.0",
"koa": "^2.13.4",
Expand Down Expand Up @@ -56,6 +57,7 @@
"node": "18"
},
"devDependencies": {
"@types/debug": "^4.1.12",
"@types/eslint": "^8.44.1",
"@types/jest": "^29.0.3",
"@types/jsonwebtoken": "^8.5.9",
Expand Down
2 changes: 1 addition & 1 deletion src/advert-field-config/config-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import HttpStatusCodes from 'http-status-codes'
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import { advertFieldConfigGqlSchema } from './config.gql.schema'
import type { Services } from '../types'
import { normalizeRoles } from '../login'
import { advertFieldConfigAdapter } from './mappers'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createAdvertFieldConfigGqlModule = ({
settings,
Expand Down
2 changes: 1 addition & 1 deletion src/adverts/adverts-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import { advertsGqlSchema } from './adverts.gql.schema'
import {
mapAdvertMutationResultToAdvertWithMetaMutationResult,
Expand All @@ -7,6 +6,7 @@ import {
} from './mappers'
import { createAdvertMutations } from './advert-mutations'
import type { Services } from '../types'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createAdvertsGqlModule = (
services: Pick<
Expand Down
2 changes: 1 addition & 1 deletion src/adverts/repository/fs/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import { join } from 'path'
import type { AdvertsRepository } from '../../types'
import { createFsAdvertsRepository } from './fs-adverts-repository'
import type { StartupLog } from '../../../types'
import { getEnv } from '../../../lib/gdi-api-node'

export const tryCreateFsAdvertsRepositoryFromEnv = (
startupLog: StartupLog
Expand Down
2 changes: 1 addition & 1 deletion src/adverts/repository/mongo/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import type { AdvertsRepository } from '../../types'
import type { MongoAdvert } from './types'
import { createMongoAdvertsRepository } from './mongo-db-adverts-repository'
import { createMongoConnection } from '../../../mongodb-utils'
import type { MongoConnectionOptions } from '../../../mongodb-utils/types'
import type { StartupLog } from '../../../types'
import { getEnv } from '../../../lib/gdi-api-node'

export const createAndConfigureMongoAdvertsRepository = ({
uri,
Expand Down
2 changes: 1 addition & 1 deletion src/api-keys/api-key-user-module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import type { IncomingHttpHeaders } from 'http'
import { apiKeysAdapter } from './api-keys-adapter'
import type { SettingsService } from '../settings/types'
import { makeUser } from '../login'
import type { ApplicationModule } from '../lib/gdi-api-node'

/** Given (Koa) headers, extract bearer token */
const getApiKeySecretFromAuthorizationHeader = (
Expand Down
2 changes: 1 addition & 1 deletion src/api-keys/api-keys-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import HttpStatusCodes from 'http-status-codes'
import type { Services } from '../types'
import { apiKeysGqlSchema } from './api-keys.gql.schema'
import { normalizeRoles } from '../login'
import { apiKeysAdapter } from '.'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createApiKeysGqlModule = ({
settings,
Expand Down
2 changes: 1 addition & 1 deletion src/api-keys/request-validation.spec.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import request from 'supertest'
import HttpStatusCodes from 'http-status-codes'
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import type { ApiKey } from './types'
import { apiKeysAdapter } from './api-keys-adapter'
import type { LoginPolicy } from '../login-policies/types'
import type { Services } from '../types'
import { requireHaffaUser } from '../login/require-haffa-user'
import type { End2EndTestConfig, End2EndTestContext } from '../test-utils'
import { end2endTest } from '../test-utils'
import type { ApplicationModule } from '../lib/gdi-api-node'

describe('user access validation', () => {
interface TestCase {
Expand Down
2 changes: 1 addition & 1 deletion src/categories/categories-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import HttpStatusCodes from 'http-status-codes'
import type { Services } from '../types'
import { categoriesGqlSchema } from './categories.gql.schema'
import { normalizeRoles } from '../login'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createCategoriesGqlModule = ({
adverts,
Expand Down
2 changes: 1 addition & 1 deletion src/content/content-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import HttpStatusCodes from 'http-status-codes'
import type { Services } from '../types'
import { contentGqlSchema } from './content.gql.schema'
import { normalizeRoles } from '../login'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createContentGqlModule = ({
content,
Expand Down
2 changes: 1 addition & 1 deletion src/content/mongo/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import { getEnv } from '../../lib/gdi-api-node'
import type { Services, StartupLog } from '../../types'
import type { ContentRepository } from '../types'
import { createMongoContentConnection } from './connection'
Expand Down
14 changes: 7 additions & 7 deletions src/create-app.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
import cors from '@koa/cors'
import bodyparser from 'koa-bodyparser'
import type { Application } from '@helsingborg-stad/gdi-api-node'
import {
createApplication,
healthCheckModule,
jwtUserModule,
swaggerModule,
} from '@helsingborg-stad/gdi-api-node'
import type { Services } from './types'
import { graphQLModule } from './haffa/haffa-module'
import { loginModule } from './login/login-module'
Expand All @@ -18,6 +11,13 @@ import { guestUserModule } from './guest'
import { snapshotModule } from './snapshot/snapshot-module'
import { socialPreviewModule } from './social-preview/social-preview-module'
import { advertLabelModule } from './labels/advertLabelModule'
import type { Application } from './lib/gdi-api-node'
import {
createApplication,
healthCheckModule,
jwtUserModule,
swaggerModule,
} from './lib/gdi-api-node'

/** Create fully packaged web application, given dependencies */
export const createApp = ({
Expand Down
2 changes: 1 addition & 1 deletion src/events/events-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import HttpStatusCodes from 'http-status-codes'
import type { Services } from '../types'
import { normalizeRoles } from '../login'
import { eventsGqlSchema } from './events.gql.schema'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createEventsGqlModule = ({
eventLog,
Expand Down
2 changes: 1 addition & 1 deletion src/events/mongo-event-log/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import type { StartupLog } from '../../types'
import { createMongoEventsConnection } from './connection'
import type { EventLogService } from '../types'
import { createMongoEventLogService } from './mongo-event-log-service'
import { getEnv } from '../../lib/gdi-api-node'

export const tryCreateMongoEventLogFromEnv = (
startupLog: StartupLog
Expand Down
2 changes: 1 addition & 1 deletion src/files/fs-files-service/fs-files-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { join, relative } from 'path'
import { mkdirp } from 'mkdirp'
import { readFile, writeFile, unlink } from 'fs/promises'
import send from 'koa-send'
import type { ApplicationContext } from '@helsingborg-stad/gdi-api-node'
import ms from 'ms'
import type { FilesService } from '../types'
import { generateFileId, tryConvertDataUriToImageBuffer } from '../utils'
import { tryConvertUrlToDataUrlForLocalUrlsHelper } from '../utils/image-utils'
import type { ApplicationContext } from '../../lib/gdi-api-node'

// max-age in ms header for transmitted files
const SEND_MAX_AGE = ms('30 days')
Expand Down
2 changes: 1 addition & 1 deletion src/files/fs-files-service/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import { join } from 'path'
import type { FilesService } from '../types'
import { createFsFilesService } from './fs-files-service'
import type { StartupLog } from '../../types'
import { getEnv } from '../../lib/gdi-api-node'

export const tryCreateFsFilesServiceFromEnv = (
startupLog: StartupLog
Expand Down
2 changes: 1 addition & 1 deletion src/files/minio-files-service/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import type { FilesService } from '../types'
import { createMinioFilesService } from './minio-files-service'
import type { StartupLog } from '../../types'
import { getEnv } from '../../lib/gdi-api-node'

export const tryCreateMinioFilesServiceFromEnv = (
startupLog: StartupLog
Expand Down
2 changes: 1 addition & 1 deletion src/files/minio-files-service/minio-files-service.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Client } from 'minio'
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import mime from 'mime-types'
import ms from 'ms'
import type { FilesService } from '../types'
import { generateFileId, tryConvertDataUriToImageBuffer } from '../utils'
import { tryConvertUrlToDataUrlForLocalUrlsHelper } from '../utils/image-utils'
import type { ApplicationModule } from '../../lib/gdi-api-node'

const SEND_MAX_AGE = ms('30 days')
interface MinioConfig {
Expand Down
2 changes: 1 addition & 1 deletion src/files/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import type { ApplicationModule } from '../lib/gdi-api-node'

export interface FilesService {
tryConvertDataUrlToUrl: (dataUrl: string) => Promise<string | null>
Expand Down
2 changes: 1 addition & 1 deletion src/git-revision-module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import { readFile } from 'fs/promises'
import { join } from 'path'
import type { ApplicationModule } from './lib/gdi-api-node'

// Small module that exposes contents of 'git_revision.txt' to a response header
export const gitRevisionModule = (): ApplicationModule => {
Expand Down
2 changes: 1 addition & 1 deletion src/guest/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import type { ApplicationModule } from '../lib/gdi-api-node'
import type { UserMapper } from '../users/types'

export const guestUserModule =
Expand Down
4 changes: 2 additions & 2 deletions src/haffa/haffa-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import type { EntityResolverMap } from '@helsingborg-stad/gdi-api-node/graphql'
import type { Services } from '../types'
import { createAdvertsGqlModule } from '../adverts/adverts-gql-module'
import { createProfileGqlModule } from '../profile/profile-gql-module'
Expand All @@ -19,6 +17,8 @@ import { createLocationsGqlModule } from '../locations/locations-gql-module'
import { createUserMapperGqlModule } from '../users'
import { createSmsTemplatesGqlModule } from '../notifications/templates/sms-templates/sms-templates-gql-module'
import { createSyslogGqlModule } from '../syslog/syslog-gql-module'
import type { GraphQLModule } from '../lib/gdi-api-node'
import type { EntityResolverMap } from '../lib/gdi-api-node/graphql'

export const createStandardGqlModule = (): GraphQLModule => ({
schema: haffaGqlSchema,
Expand Down
7 changes: 2 additions & 5 deletions src/haffa/haffa-module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import type { ApplicationContext } from '@helsingborg-stad/gdi-api-node'
import {
makeGqlEndpoint,
makeGqlMiddleware,
} from '@helsingborg-stad/gdi-api-node'
import { requireHaffaUser } from '../login/require-haffa-user'
import type { Services } from '../types'
import { createHaffaGqlModule } from './haffa-gql-module'
import type { ApplicationContext } from '../lib/gdi-api-node'
import { makeGqlEndpoint, makeGqlMiddleware } from '../lib/gdi-api-node'

export const graphQLModule =
(services: Services) =>
Expand Down
2 changes: 1 addition & 1 deletion src/jobs/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { getEnv } from '@helsingborg-stad/gdi-api-node'
import type {
JobExcecutorService,
JobParameters,
Expand All @@ -8,6 +7,7 @@ import type {
import { tasks } from './tasks'
import type { SyslogEntry, SyslogUserData } from '../syslog/types'
import { Severity } from '../syslog/types'
import { getEnv } from '../lib/gdi-api-node'

export const createJobExecutorService = (
taskRepository: TaskList,
Expand Down
2 changes: 1 addition & 1 deletion src/jobs/jobs-gql-module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { GraphQLModule } from '@helsingborg-stad/gdi-api-node'
import HttpStatusCodes from 'http-status-codes'
import type { Services } from '../types'
import { jobsGqlSchema } from './jobs.gql.schema'
import { normalizeRoles } from '../login'
import type { GraphQLModule } from '../lib/gdi-api-node'

export const createJobsGqlModule = (services: Services): GraphQLModule => ({
schema: jobsGqlSchema,
Expand Down
2 changes: 1 addition & 1 deletion src/labels/advertLabelModule.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import HttpStatusCodes from 'http-status-codes'
import type { ApplicationModule } from '@helsingborg-stad/gdi-api-node'
import PDFDocument from 'pdfkit'
import QRCode from 'qrcode'
import type { Services } from '../types'
Expand All @@ -8,6 +7,7 @@ import type { Advert } from '../adverts/types'
import { optionsAdapter } from '../options'
import { createLabelFooter, transformLabelOptions } from './mappers'
import { requireHaffaUser } from '../login/require-haffa-user'
import type { ApplicationModule } from '../lib/gdi-api-node'

export const advertLabelModule =
({ adverts, settings, userMapper }: Services): ApplicationModule =>
Expand Down
13 changes: 13 additions & 0 deletions src/lib/gdi-api-node/__tests/404-not-found.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { StatusCodes } from 'http-status-codes'
import request from 'supertest'
import { createTestApp } from './test-utils'


describe('GET /missing/resource', () => {
it('gives 404 not found', () => createTestApp()
.run(async server => {
const { status } = await request(server)
.post('/missing/resource')
expect(status).toBe(StatusCodes.NOT_FOUND)
}))
})
26 changes: 26 additions & 0 deletions src/lib/gdi-api-node/__tests/api-operation.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { StatusCodes } from 'http-status-codes'
import request from 'supertest'
import { createTestApp, registerTestApi } from './test-utils'

describe('POST /api/v1/test-operation', () => {
it('works just fine', () => createTestApp()
.use(registerTestApi({
testOperation: async (ctx) => {
const { request: { body: { query } } } = ctx as any
ctx.body = {
id: '1234',
answer: `Please google "${query}"`,
}
},
}))
.run(async server => {
const { status, body } = await request(server)
.post('/api/v1/test-operation')
.send({ query: 'what time is it?' })
expect(status).toBe(StatusCodes.OK)
expect(body).toMatchObject({
id: '1234',
answer: 'Please google "what time is it?"',
})
}))
})
34 changes: 34 additions & 0 deletions src/lib/gdi-api-node/__tests/extend.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { StatusCodes } from 'http-status-codes'
import request from 'supertest'
import { createTestApp } from './test-utils'

describe('POST /api/v1/test-operation', () => {
it('can be extended with downstream middleware', () => createTestApp()
.use(({ extend }) => {
extend({
// we extend by composing in additional middleware that should be combined
// with subsequent koa api handlers
compose: mv => (ctx, next) => {
ctx.downstreamMessage = 'hello downstream'
return mv(ctx, next)
},
})
})
.use(({ registerKoaApi }) => registerKoaApi({
testOperation: async (ctx) => {
ctx.body = {
id: '1234',
answer: ctx.downstreamMessage,
}
},
}))
.run(async server => {
const { status, body } = await request(server)
.post('/api/v1/test-operation')
.send({ query: '?' })
expect(status).toBe(StatusCodes.OK)
expect(body).toMatchObject({
answer: 'hello downstream',
})
}))
})
Loading
Loading