Skip to content

Commit

Permalink
refactor: create a common gql type for update metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
viet nguyen committed May 2, 2023
1 parent ad19787 commit 4b6aeeb
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 36 deletions.
7 changes: 2 additions & 5 deletions src/db/AreaTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ClimbType } from './ClimbTypes.js'
import { ChangeRecordMetadataType } from './ChangeLogType.js'
import { GradeContexts } from '../GradeUtils.js'
import { ExperimentalAuthorType } from './UserTypes.js'
import { AuthorMetadata } from '../types.js'

/**
* Areas are a grouping mechanism in the OpenBeta data model that allow
Expand All @@ -32,7 +33,7 @@ export type AreaType = IAreaProps & {
* See AreaType for the reified version of this object, and always use it
* if you are working with data that exists inside the database.
*/
export interface IAreaProps {
export interface IAreaProps extends AuthorMetadata {
_id: mongoose.Types.ObjectId
/**
* ShortCodes are short, globally uniqe codes that identify significant climbing areas
Expand Down Expand Up @@ -99,10 +100,6 @@ export interface IAreaProps {
_change?: ChangeRecordMetadataType
/** Used to delete an area. See https://www.mongodb.com/docs/manual/core/index-ttl/ */
_deleting?: Date
createdAt?: Date
updatedAt?: Date
updatedBy?: MUUID
createdBy?: MUUID
}

export interface IAreaMetadata {
Expand Down
8 changes: 8 additions & 0 deletions src/db/utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { AuthorMetadata } from '../../types'

export const getAuthorMetadataFromBaseNode = ({ updatedAt, updatedBy, createdAt, createdBy }: AuthorMetadata): AuthorMetadata => ({
updatedAt,
updatedBy,
createdAt,
createdBy
})
8 changes: 1 addition & 7 deletions src/db/utils/jobs/MigrateTagsToMediaCollection.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import sharp from 'sharp'
import { glob } from 'glob'
import { validate as uuidValidate } from 'uuid'
import muuid from 'uuid-mongodb'

import { connectDB, getMediaModel, gracefulExit } from '../../index.js'
import { logger } from '../../../logger.js'
import { MediaObjectType } from '../../MediaMetaType.js'
import { getMediaObjectModel } from '../../MediaObjectSchema.js'
import { MediaType } from '../../MediaTypes.js'

Expand All @@ -19,7 +13,7 @@ const onConnected = async (): Promise<void> => {

let count = 0

const rs = await oldTagModel.aggregate([
await oldTagModel.aggregate([
{
$group: {
_id: '$mediaUrl',
Expand Down
15 changes: 12 additions & 3 deletions src/graphql/history/HistoryFieldResolvers.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { ChangeLogType, BaseChangeRecordType, SupportedCollectionTypes, DocumentKind } from '../../db/ChangeLogType.js'
import { exhaustiveCheck } from '../../utils/helpers.js'
import { AuthorMetadata } from '../../types.js'
import { exhaustiveCheck, getUserNickFromMediaDir } from '../../utils/helpers.js'

/**
* Customize to resolve individual fields
* History schama field resolvers
*/
const resolvers = {
History: {
id: (node: ChangeLogType) => node._id.toString(),
editedBy: (node: ChangeLogType) => node.editedBy.toUUID().toString()
editedBy: (node: ChangeLogType) => node.editedBy.toUUID().toString(),
editedByUser: async (node: ChangeLogType) => (await getUserNickFromMediaDir(node.editedBy.toUUID().toString()))
},

Change: {
Expand Down Expand Up @@ -36,6 +38,13 @@ const resolvers = {
return exhaustiveCheck(node.kind)
}
}
},

AuthorMetadata: {
createdBy: (node: AuthorMetadata) => node?.createdBy?.toUUID().toString(),
updatedBy: (node: AuthorMetadata) => node?.updatedBy?.toUUID().toString(),
createdByUser: async (node: AuthorMetadata) => await getUserNickFromMediaDir(node?.createdBy?.toUUID().toString() ?? ''),
updatedByUser: async (node: AuthorMetadata) => (await getUserNickFromMediaDir(node?.updatedBy?.toUUID().toString() ?? ''))
}
}

Expand Down
15 changes: 6 additions & 9 deletions src/graphql/resolvers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { makeExecutableSchema } from '@graphql-tools/schema'
import { DataSources } from 'apollo-server-core/dist/graphqlOptions'
import muid from 'uuid-mongodb'
import fs from 'fs'
import { gql } from 'apollo-server'
import { DocumentNode } from 'graphql'

import { CommonResolvers, CommonTypeDef } from './common/index.js'
import { HistoryQueries, HistoryFieldResolvers } from '../graphql/history/index.js'
Expand All @@ -17,11 +20,8 @@ import { ClimbMutations } from './climb/index.js'
import { OrganizationMutations, OrganizationQueries } from './organization/index.js'
import TickMutations from './tick/TickMutations.js'
import TickQueries from './tick/TickQueries.js'
import fs from 'fs'

import { gql } from 'apollo-server'
import { DocumentNode } from 'graphql'
import MediaDataSource from '../model/MediaDataSource.js'
import { getAuthorMetadataFromBaseNode } from '../db/utils/index.js'

/**
* It takes a file name as an argument, reads the file, and returns a GraphQL DocumentNode.
Expand Down Expand Up @@ -178,8 +178,7 @@ const resolvers = {
}
: node.content,

createdBy: (node: ClimbGQLQueryType) => node?.createdBy?.toUUID().toString(),
updatedBy: (node: ClimbGQLQueryType) => node?.updatedBy?.toUUID().toString()
authorMetadata: getAuthorMetadataFromBaseNode
},

Area: {
Expand Down Expand Up @@ -237,9 +236,7 @@ const resolvers = {
const { media }: { media: MediaDataSource } = dataSources
return await media.findMediaByAreaId(node.metadata.area_id, node.ancestors)
},

createdBy: (node: AreaType) => node?.createdBy?.toUUID().toString(),
updatedBy: (node: AreaType) => node?.updatedBy?.toUUID().toString()
authorMetadata: getAuthorMetadataFromBaseNode
},

CountByDisciplineType: {
Expand Down
6 changes: 2 additions & 4 deletions src/graphql/schema/Area.gql
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,8 @@ type Area {
totalClimbs: Int!
"Media associated with this area, or its child climbs"
media: [MediaWithTags]
createdAt: Date
createdBy: ID
updatedAt: Date
updatedBy: ID
"Metadata about creation & update of this area"
authorMetadata: AuthorMetadata!
}

type AreaMetadata {
Expand Down
6 changes: 2 additions & 4 deletions src/graphql/schema/Climb.gql
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,8 @@ type Climb {
"The parent area object"
parent: Area!

createdAt: Date
updatedAt: Date
updatedBy: ID
createdBy: ID
"Metadata about creation & update of this climb"
authorMetadata: AuthorMetadata!
}

type ClimbMetadata {
Expand Down
13 changes: 12 additions & 1 deletion src/graphql/schema/History.gql
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ union Document = Area | Climb | Organization

type History {
id: ID!
editedBy: String!
editedBy: ID!
editedByUser: String
operation: String!
createdAt: Date!
changes: [Change]
Expand All @@ -39,3 +40,13 @@ type Query {
getAreaHistory(filter: AreaHistoryFilter): [History]
getOrganizationHistory(filter: OrganizationHistoryFilter): [History]
}

"""Author metadata"""
type AuthorMetadata {
createdAt: Date!
createdBy: ID!
createdByUser: String
updatedAt: Date!
updatedBy: ID!
updatedByUser: String
}
8 changes: 5 additions & 3 deletions src/model/MediaDataSource.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { MongoDataSource } from 'apollo-datasource-mongodb'
import muid, { MUUID } from 'uuid-mongodb'

import { getMediaModel, getMediaObjectModel } from '../db/index.js'
import { getMediaObjectModel } from '../db/index.js'
import { MediaType, MediaByUsers, TagsLeaderboardType, MediaWithTags, AllTimeTagStats } from '../db/MediaTypes.js'

export default class MediaDataSourcmnee extends MongoDataSource<MediaType> {
tagModel = getMediaModel()
mediaObjectModel = getMediaObjectModel()

/**
* A reusable list of fields for '$group' aggregation
*/
mediaObjectGroupByFields = {
mediaUrl: '$mediaUrl',
userUuid: '$userUuid',
Expand Down Expand Up @@ -289,7 +291,7 @@ export default class MediaDataSourcmnee extends MongoDataSource<MediaType> {
{
$unset: ['_id']
}
])
], { readPreference: 'secondaryPreferred' })

if (rs?.length !== 1) throw new Error('Unexpected leaderboard query error')

Expand Down
7 changes: 7 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,10 @@ export interface Context {
export interface ContextWithAuth extends Context {
user: AuthUserType
}

export interface AuthorMetadata {
updatedAt?: Date
updatedBy?: MUUID
createdAt?: Date
createdBy?: MUUID
}

0 comments on commit 4b6aeeb

Please sign in to comment.