Skip to content

Commit

Permalink
Fix/remove gdi deps (#37)
Browse files Browse the repository at this point in the history
* copy of @helsingborg-stad/gdi-api-node

* removed dependency to @helsingborg-stad/gdi-api-node
  • Loading branch information
jlarsson authored Jun 25, 2024
1 parent 5e1fb2b commit b156ac2
Show file tree
Hide file tree
Showing 105 changed files with 1,687 additions and 151 deletions.
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

0 comments on commit b156ac2

Please sign in to comment.