1.0.2 • Published 12 months ago

@occupop/lib-auth v1.0.2

Weekly downloads
-
License
-
Repository
-
Last release
12 months ago

Package @occupop/lib-auth

This package is intended to be used with @occupop/lib-container providing context function for GraphQL (or Express middleware) where AuthUser (or ScopedUser) gets validated and signed to container.

This implementation refers to https://www.apollographql.com/docs/apollo-server/data/context!

NPM registry token required!

Install

# Yarn
yarn add @occupop/lib-auth

# NPM
npm install @occupop/lib-auth

# Bun
bun add @occupop/lib-auth

Env Setup

ENV variables required

JWT_SECRET=randomTokenProvidedByAuthService

Register

import {
    makeGraphqlServer, graphqlMiddleware, graphqlStandalone
} from '@occupop/lib-graphql'
import { resolvers } from './app/resolvers'
//... all other imports omited... 

export const container = createTypedContainer({
    container: { asFunction: () => container, singleton: true },
    // ...
    // for graphql:
    authContextValueFunction: { asFunction: makeAuthContextValueFunction, singleton: true },
    // for express:
    authContextMiddleware: { asFunction: makeAuthContextMiddleware, singleton: true },
    // ...
})

Note: container need to be self registered/referenced to be possible to context function/middleware register AuthUser and ScopedUser, that is extracted from request headers.

Usage (with graphql)

// server.ts
import { container } from '.container'

const { mongoClient, graphqlServer, graphqlStandalone, authContextValueFunction } = container.cradle

await mongoClient.connect()
console.log('Mongo connected')

const httpPort = process.env.API_PORT || 4000
await await graphqlStandalone(graphqlServer, {
  context: authContextValueFunction,
  listen: { port: httpPort },
})
console.log(`Server listening on http://localhost:${httpPort}`)
// app/resolvers.ts
import { container } from '.container'

export const resolvers: GraphQLResolverMap<{ container: typeof container}> = {
  Query: {
    jobs: (source, { skip, take }, { container }, info) => {
      const { getJobsUseCase } = container.cradle
      return getJobsUseCase(skip, take)
    },
  },
}
// app/use-cases/get-jobs-use-case.ts
import { type Deps } from '.container'

export function makeGetJobsUseCase({ authUser, jobService }: Deps) {
  return (skip = 0, take = 15) => {
    if (!authUser?.hiringCompanyUuid) throw 'not logged'
    if (take > 100) take = 100
    return jobService.getJobs(authUser.hiringCompanyUuid, skip, take)
  }
}

Usage (with express)

// server.ts
import { container } from '.container'

const { mongoClient, httpServer, appRouter, authContextMiddleware } = container.cradle

await mongoClient.connect()
console.log('Mongo connected')

const httpPort = process.env.API_PORT || 4000
httpServer.use(authContextMiddleware)
httpServer.use(appRouter)
await httpServer.listen(httpPort, () => {
    console.log(`Http listening on http://localhost:${httpPort}`)
})
// ...
// app/router.ts
export function makeAppRouter({ httpRouter }: Deps) {
    return httpRouter
        //...
        .get('/jobs', (req, res) => {
            const { getJobsUseCase } = req.container.cradle
            res.json(getJobsUseCase(req.query.skip, req.query.take))
        })
        //...
}
// app/use-cases/get-jobs-use-case.ts
import { type Deps } from '.container'

export function makeGetJobsUseCase({ authUser, jobService }: Deps) {
    return (skip = 0, take = 15) => {
        if (!authUser?.hiringCompanyUuid) throw 'not logged'
        if (take > 100) take = 100
        return jobService.getJobs(authUser.hiringCompanyUuid, skip, take)
    }
}
1.0.2

12 months ago

1.0.1

12 months ago

1.0.0

12 months ago