diff --git a/packages/api/src/entity/post.ts b/packages/api/src/entity/post.ts index 3e8bf997e..2890a3af9 100644 --- a/packages/api/src/entity/post.ts +++ b/packages/api/src/entity/post.ts @@ -19,8 +19,8 @@ export class Post { @JoinColumn({ name: 'user_id' }) user!: User - @Column('uuid', { array: true, nullable: true }) - libraryItemIds?: string[] | null + @Column('uuid', { array: true }) + libraryItemIds!: string[] @Column('uuid', { array: true, nullable: true }) highlightIds?: string[] | null diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 8b4830ad8..7a128adaa 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -521,7 +521,7 @@ export enum CreatePostErrorCode { export type CreatePostInput = { content: Scalars['String']; highlightIds?: InputMaybe>; - libraryItemIds?: InputMaybe>; + libraryItemIds: Array; thought?: InputMaybe; thumbnail?: InputMaybe; title: Scalars['String']; @@ -2413,7 +2413,7 @@ export type Post = { createdAt: Scalars['Date']; highlights?: Maybe>; id: Scalars['ID']; - libraryItems?: Maybe>; + libraryItems: Array
; ownedByViewer: Scalars['Boolean']; thought?: Maybe; thumbnail?: Maybe; @@ -7064,7 +7064,7 @@ export type PostResolvers; highlights?: Resolver>, ParentType, ContextType>; id?: Resolver; - libraryItems?: Resolver>, ParentType, ContextType>; + libraryItems?: Resolver, ParentType, ContextType>; ownedByViewer?: Resolver; thought?: Resolver, ParentType, ContextType>; thumbnail?: Resolver, ParentType, ContextType>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 0e8c2a93d..ca5744364 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -466,7 +466,7 @@ enum CreatePostErrorCode { input CreatePostInput { content: String! highlightIds: [ID!] - libraryItemIds: [ID!] + libraryItemIds: [ID!]! thought: String thumbnail: String title: String! @@ -1847,7 +1847,7 @@ type Post { createdAt: Date! highlights: [Highlight!] id: ID! - libraryItems: [Article!] + libraryItems: [Article!]! ownedByViewer: Boolean! thought: String thumbnail: String diff --git a/packages/api/src/resolvers/posts/index.ts b/packages/api/src/resolvers/posts/index.ts index 88704bc0c..38326dc1a 100644 --- a/packages/api/src/resolvers/posts/index.ts +++ b/packages/api/src/resolvers/posts/index.ts @@ -125,8 +125,8 @@ export const createPostResolver = authorized< userId: uid, title, content, + libraryItemIds, highlightIds: highlightIds || undefined, - libraryItemIds: libraryItemIds || undefined, thought: thought || undefined, thumbnail: thumbnail || undefined, } @@ -160,7 +160,7 @@ export const updatePostResolver = authorized< thumbnail, } = input - if (!id || title === null || content === null) { + if (!id || title === null || content === null || libraryItemIds === null) { log.error('Invalid args', { id }) return { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index c36cb13e5..3099e9b03 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -3347,7 +3347,7 @@ const schema = gql` ownedByViewer: Boolean! thumbnail: String thought: String - libraryItems: [Article!] + libraryItems: [Article!]! highlights: [Highlight!] createdAt: Date! updatedAt: Date! @@ -3357,7 +3357,7 @@ const schema = gql` title: String! @sanitize(minLength: 1, maxLength: 255) content: String! @sanitize(minLength: 1) thumbnail: String - libraryItemIds: [ID!] + libraryItemIds: [ID!]! highlightIds: [ID!] thought: String } diff --git a/packages/api/test/resolvers/post.test.ts b/packages/api/test/resolvers/post.test.ts index 99e9e51f6..8d9c8f536 100644 --- a/packages/api/test/resolvers/post.test.ts +++ b/packages/api/test/resolvers/post.test.ts @@ -1,5 +1,7 @@ import { expect } from 'chai' +import { LibraryItem } from '../../src/entity/library_item' import { User } from '../../src/entity/user' +import { deleteLibraryItemById } from '../../src/services/library_item' import { createPosts, deletePosts, @@ -7,7 +9,7 @@ import { } from '../../src/services/post' import { findProfile, updateProfile } from '../../src/services/profile' import { deleteUser } from '../../src/services/user' -import { createTestUser } from '../db' +import { createTestLibraryItem, createTestUser } from '../db' import { generateFakeUuid, graphqlRequest, loginAndGetAuthToken } from '../util' describe('Post Resolvers', () => { @@ -53,20 +55,27 @@ describe('Post Resolvers', () => { ` let postIds: Array = [] + let libraryItem: LibraryItem + let libraryItem1: LibraryItem before(async () => { + libraryItem = await createTestLibraryItem(loginUser.id) + libraryItem1 = await createTestLibraryItem(loginUser.id) + const posts = [ { title: 'Post 1', content: 'Content 1', user: loginUser, createdAt: new Date('2021-01-01'), + libraryItemIds: [libraryItem.id], }, { title: 'Post 2', content: 'Content 2', user: loginUser, createdAt: new Date('2021-01-02'), + libraryItemIds: [libraryItem1.id], }, ] const newPosts = await createPosts(loginUser.id, posts) @@ -76,6 +85,9 @@ describe('Post Resolvers', () => { after(async () => { await deletePosts(loginUser.id, postIds) + + await deleteLibraryItemById(libraryItem.id, loginUser.id) + await deleteLibraryItemById(libraryItem1.id, loginUser.id) }) it('should return an error if the args are invalid', async () => { @@ -164,12 +176,16 @@ describe('Post Resolvers', () => { ` let postId: string + let libraryItem: LibraryItem before(async () => { + libraryItem = await createTestLibraryItem(loginUser.id) + const post = { title: 'Post', content: 'Content', user: loginUser, + libraryItemIds: [libraryItem.id], } const newPost = await createPosts(loginUser.id, [post]) @@ -178,6 +194,7 @@ describe('Post Resolvers', () => { after(async () => { await deletePosts(loginUser.id, [postId]) + await deleteLibraryItemById(libraryItem.id, loginUser.id) }) it('should return an error if the args are invalid', async () => { @@ -266,10 +283,13 @@ describe('Post Resolvers', () => { ` it('should create a post', async () => { + const libraryItem = await createTestLibraryItem(loginUser.id) + const response = await graphqlRequest(mutation, authToken, { input: { title: 'Post', content: 'Content', + libraryItemIds: [libraryItem.id], }, }) @@ -286,6 +306,7 @@ describe('Post Resolvers', () => { expect(profile?.private).to.be.false await deletePosts(loginUser.id, [postId]) + await deleteLibraryItemById(libraryItem.id, loginUser.id) }) }) @@ -308,12 +329,16 @@ describe('Post Resolvers', () => { ` let postId: string + let libraryItem: LibraryItem before(async () => { + libraryItem = await createTestLibraryItem(loginUser.id) + const post = { title: 'Post', content: 'Content', user: loginUser, + libraryItemIds: [libraryItem.id], } const newPost = await createPosts(loginUser.id, [post]) @@ -322,6 +347,7 @@ describe('Post Resolvers', () => { after(async () => { await deletePosts(loginUser.id, [postId]) + await deleteLibraryItemById(libraryItem.id, loginUser.id) }) it('should return an error if the args are invalid', async () => { @@ -399,18 +425,27 @@ describe('Post Resolvers', () => { ` let postId: string + let libraryItem: LibraryItem before(async () => { + libraryItem = await createTestLibraryItem(loginUser.id) + const post = { title: 'Post', content: 'Content', user: loginUser, + libraryItemIds: [libraryItem.id], } const newPost = await createPosts(loginUser.id, [post]) postId = newPost[0].id }) + after(async () => { + await deletePosts(loginUser.id, [postId]) + await deleteLibraryItemById(libraryItem.id, loginUser.id) + }) + it('should return an error if the args are invalid', async () => { const response = await graphqlRequest(mutation, authToken, { id: '', diff --git a/packages/db/migrations/0183.do.post.sql b/packages/db/migrations/0183.do.post.sql index a5e410761..d8b30ba33 100755 --- a/packages/db/migrations/0183.do.post.sql +++ b/packages/db/migrations/0183.do.post.sql @@ -7,7 +7,7 @@ BEGIN; CREATE TABLE omnivore.post ( id UUID PRIMARY KEY DEFAULT uuid_generate_v1mc(), user_id UUID NOT NULL REFERENCES omnivore.user(id) ON DELETE CASCADE, - library_item_ids UUID[], + library_item_ids UUID[] NOT NULL, highlight_ids UUID[], title TEXT NOT NULL, content TEXT NOT NULL, -- generated from template