Skip to content

Commit 6cb801f

Browse files
authored
Merge pull request velopert#156 from velopert/feature/ads-banner
Feature/ads banner
2 parents 0db8162 + cd02c01 commit 6cb801f

File tree

3 files changed

+105
-5
lines changed

3 files changed

+105
-5
lines changed

src/graphql/ad.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { IResolvers, gql } from 'apollo-server-koa';
2+
import { ApolloContext } from '../app';
3+
import adService from '../services/adService';
4+
5+
export const typeDef = gql`
6+
type Ad {
7+
id: ID!
8+
title: String!
9+
body: String!
10+
image: String!
11+
type: String!
12+
start_date: Date!
13+
end_date: Date!
14+
is_disabled: Boolean!
15+
url: String!
16+
}
17+
extend type Query {
18+
bannerAds(writer_username: String!): [Ad!]!
19+
}
20+
`;
21+
22+
export const resolvers: IResolvers<any, ApolloContext> = {
23+
Query: {
24+
bannerAds: async (_, { writer_username }: BannerAdsArgs) => {
25+
return await adService.getBannerTypeAdList(writer_username);
26+
},
27+
},
28+
};
29+
30+
type BannerAdsArgs = {
31+
writer_username: string;
32+
};

src/graphql/schema.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as user from './user';
44
import * as comment from './comment';
55
import * as series from './series';
66
import * as tag from './tag';
7+
import * as ad from './ad';
78
import { gql, IResolvers, makeExecutableSchema } from 'apollo-server-koa';
89

910
const typeDef = gql`
@@ -19,21 +20,30 @@ const typeDef = gql`
1920

2021
const resolvers: IResolvers = {
2122
Query: {
22-
_version: () => '1.0'
23+
_version: () => '1.0',
2324
},
24-
Mutation: {}
25+
Mutation: {},
2526
};
2627

2728
const schema = makeExecutableSchema({
28-
typeDefs: [typeDef, user.typeDef, post.typeDef, comment.typeDef, series.typeDef, tag.typeDef],
29+
typeDefs: [
30+
typeDef,
31+
user.typeDef,
32+
post.typeDef,
33+
comment.typeDef,
34+
series.typeDef,
35+
tag.typeDef,
36+
ad.typeDef,
37+
],
2938
resolvers: merge(
3039
resolvers,
3140
user.resolvers,
3241
post.resolvers,
3342
comment.resolvers,
3443
series.resolvers,
35-
tag.resolvers
36-
)
44+
tag.resolvers,
45+
ad.resolvers
46+
),
3747
});
3848

3949
export default schema;

src/services/adService.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import Axios, { AxiosResponse } from 'axios';
2+
3+
const { API_V3_HOST } = process.env;
4+
5+
if (!API_V3_HOST) {
6+
throw new Error('API_V3_HOST ENV is required');
7+
}
8+
9+
const adService = {
10+
async getBannerTypeAdList(writerUsername: string) {
11+
const GET_AD_LIST = `
12+
query ads {
13+
ads(input: {writer_username: "${writerUsername}", limit: 2, type: "banner" }) {
14+
id
15+
title
16+
body
17+
image
18+
url
19+
}
20+
}
21+
`;
22+
23+
const endpoint =
24+
process.env.NODE_ENV === 'development'
25+
? `http://${API_V3_HOST}/graphql`
26+
: `https://${API_V3_HOST}/graphql`;
27+
28+
const { data } = await Axios.post<AxiosResponse<GetAdListResponse>>(
29+
endpoint,
30+
{
31+
operationName: 'ads',
32+
query: GET_AD_LIST,
33+
},
34+
{
35+
headers: {
36+
'Content-Type': 'application/json',
37+
},
38+
}
39+
);
40+
41+
return data.data.ads;
42+
},
43+
};
44+
45+
export default adService;
46+
47+
type GetAdListResponse = {
48+
ads: {
49+
id: string;
50+
type: string;
51+
url: string;
52+
start_date: Date;
53+
end_date: Date;
54+
title: string;
55+
body: string;
56+
image: string;
57+
};
58+
};

0 commit comments

Comments
 (0)