Skip to content

Commit 19dba0b

Browse files
committed
add job type/schema/resolver
1 parent 36ed90c commit 19dba0b

File tree

5 files changed

+82
-2
lines changed

5 files changed

+82
-2
lines changed

src/lib/resolver.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { MemoryCache } from '@/MemoryCache';
22
import { getResolver as getCommentsResolver } from '@/resolvers/comments';
3+
import { getResolver as getJobsResolver } from '@/resolvers/jobs';
34
import { getResolver as getStoriesResolver } from '@/resolvers/stories';
45
import { getResolver as getStoryAuthorResolver } from '@/resolvers/Story/author';
56
import { getResolver as getCommentCountResolver } from '@/resolvers/Story/commentCount';
@@ -8,15 +9,21 @@ import { getScalarType as getDateScalar } from '@/scalars/Date';
89

910
const storyIds: number[] = [];
1011
const stories: Record<string, any>[] = [];
12+
const jobIds: number[] = [];
13+
const jobs: Record<string, any>[] = [];
1114
const cache = new MemoryCache();
1215

1316
const dateScalar = getDateScalar();
1417

1518
const resolvers = {
1619
query: {
1720
stories: getStoriesResolver(storyIds, stories, cache),
21+
jobs: getJobsResolver(jobIds, jobs, cache),
1822
user: getUserResolver(cache),
1923
},
24+
job: {
25+
author: getStoryAuthorResolver(cache),
26+
},
2027
story: {
2128
author: getStoryAuthorResolver(cache),
2229
comments: getCommentsResolver(cache),
@@ -30,9 +37,13 @@ const resolvers = {
3037
export default {
3138
Date: dateScalar,
3239
Query: {
40+
jobs: resolvers.query.jobs,
3341
stories: resolvers.query.stories,
3442
user: resolvers.query.user,
3543
},
44+
Job: {
45+
author: resolvers.job.author,
46+
},
3647
Story: {
3748
author: resolvers.story.author,
3849
comments: resolvers.story.comments,

src/lib/typedef.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { gql } from 'apollo-server-express';
33
const typeDefs = gql`
44
${require('@/schemas/Comment.graphql')}
55
${require('@/schemas/Date.graphql')}
6+
${require('@/schemas/Job.graphql')}
67
${require('@/schemas/Query.graphql')}
78
${require('@/schemas/Story.graphql')}
89
${require('@/schemas/StoryType.graphql')}

src/resolvers/jobs.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { MemoryCache } from '@/MemoryCache';
2+
import axios from 'axios';
3+
4+
export function getResolver(storyIds, stories, cache: MemoryCache): any {
5+
const result = async (_, { first, skipText }) => {
6+
const kind = 'job';
7+
8+
storyIds.splice(0, storyIds.length);
9+
stories.splice(0, stories.length);
10+
11+
const ids: number[] = [];
12+
const cacheKey = `jobstoryids:${first}-${skipText ? 'skipText' : 'dontSkipText'}`;
13+
14+
if (!cache.has(cacheKey)) {
15+
const resp = await axios.get(`${process.env.HACKERNEWS_API_URL}/jobstories.json?limitToFirst=${first + 5}&orderBy="$key"`);
16+
const data: number[] = resp.data;
17+
18+
cache.put(cacheKey, data, 600);
19+
ids.push(...data);
20+
}
21+
22+
const cacheData = cache.get(cacheKey);
23+
24+
ids.push(...cacheData);
25+
ids.splice(first);
26+
27+
const storyDataPromises = ids
28+
.map(id => {
29+
if (cache.has(`${kind}story:${id}`)) {
30+
return null;
31+
}
32+
33+
return axios.get(`${process.env.HACKERNEWS_API_URL}/item/${id}.json`);
34+
})
35+
.filter(item => item !== null);
36+
37+
(await Promise.all(storyDataPromises))
38+
.map(resp => resp?.data)
39+
.filter(item => item !== null)
40+
.forEach(item => {
41+
cache.put(`${kind}story:${item.id}`, item, 3600);
42+
});
43+
44+
for (const id of ids) {
45+
const storyItem = cache.get(`${kind}story:${id}`);
46+
47+
if (!storyItem.text || !skipText) {
48+
stories.push(storyItem);
49+
}
50+
}
51+
52+
return new Promise(resolve => resolve(stories));
53+
};
54+
55+
return result;
56+
}

src/schemas/Job.graphql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
type Job {
2+
author: User
3+
by: String
4+
id: Int!
5+
score: Int
6+
text: String
7+
time: Date
8+
title: String
9+
type: String
10+
url: String
11+
}

src/schemas/Query.graphql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
type Query {
2-
stories(first: Int!, kind: StoryType!): [Story]
3-
user(id: String!): User
2+
jobs(first: Int!, skipText: Boolean = True): [Job]!
3+
stories(first: Int!, kind: StoryType!): [Story]!
4+
user(id: String!): User
45
}

0 commit comments

Comments
 (0)