Skip to content

Commit d91e250

Browse files
author
Bojan Tomic
committed
Filtering and pagination
1 parent 1566dc7 commit d91e250

File tree

4 files changed

+84
-27
lines changed

4 files changed

+84
-27
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.howtographql.hackernews;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
/**
6+
* Created by bojan.tomic on 7/9/17.
7+
*/
8+
public class LinkFilter {
9+
10+
private String descriptionContains;
11+
private String urlContains;
12+
13+
@JsonProperty("description_contains")
14+
public String getDescriptionContains() {
15+
return descriptionContains;
16+
}
17+
18+
public void setDescriptionContains(String descriptionContains) {
19+
this.descriptionContains = descriptionContains;
20+
}
21+
22+
@JsonProperty("url_contains")
23+
public String getUrlContains() {
24+
return urlContains;
25+
}
26+
27+
public void setUrlContains(String urlContains) {
28+
this.urlContains = urlContains;
29+
}
30+
}

src/main/java/com/howtographql/hackernews/LinkRepository.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package com.howtographql.hackernews;
22

3+
import com.mongodb.client.FindIterable;
34
import com.mongodb.client.MongoCollection;
4-
import com.mongodb.client.model.Filters;
55

66
import org.bson.Document;
7+
import org.bson.conversions.Bson;
78
import org.bson.types.ObjectId;
89

910
import java.util.ArrayList;
1011
import java.util.List;
12+
import java.util.Optional;
1113

14+
import static com.mongodb.client.model.Filters.and;
1215
import static com.mongodb.client.model.Filters.eq;
16+
import static com.mongodb.client.model.Filters.regex;
1317

1418
/**
1519
* Created by bojan.tomic on 7/2/17.
@@ -18,7 +22,7 @@ public class LinkRepository {
1822

1923
private final MongoCollection<Document> links;
2024

21-
public LinkRepository(MongoCollection<Document> links) {
25+
LinkRepository(MongoCollection<Document> links) {
2226
this.links = links;
2327
}
2428

@@ -27,11 +31,12 @@ public Link findById(String id) {
2731
return link(doc);
2832
}
2933

30-
public List<Link> getAllLinks() {
31-
links.deleteOne(Filters.eq("_id", new ObjectId("59592cd33b067a54782a64d5")));
32-
links.deleteOne(Filters.eq("_id", new ObjectId("595932443b067a54782a64d6")));
34+
public List<Link> getAllLinks(LinkFilter filter, int skip, int first) {
35+
Optional<Bson> mongoFilter = Optional.ofNullable(filter).map(this::buildFilter);
36+
3337
List<Link> allLinks = new ArrayList<>();
34-
for (Document doc : links.find()) {
38+
FindIterable<Document> documents = mongoFilter.map(links::find).orElseGet(links::find);
39+
for (Document doc : documents.skip(skip).limit(first)) {
3540
allLinks.add(link(doc));
3641
}
3742
return allLinks;
@@ -44,6 +49,23 @@ public void saveLink(Link link) {
4449
doc.append("postedBy", link.getUserId());
4550
links.insertOne(doc);
4651
}
52+
53+
private Bson buildFilter(LinkFilter filter) {
54+
String descriptionPattern = filter.getDescriptionContains();
55+
String urlPattern = filter.getUrlContains();
56+
Bson descriptionCondition = null;
57+
Bson urlCondition = null;
58+
if (descriptionPattern != null && !descriptionPattern.isEmpty()) {
59+
descriptionCondition = regex("description", ".*" + descriptionPattern + ".*", "i");
60+
}
61+
if (urlPattern != null && !urlPattern.isEmpty()) {
62+
urlCondition = regex("url", ".*" + urlPattern + ".*", "i");
63+
}
64+
if (descriptionCondition != null && urlCondition != null) {
65+
return and(descriptionCondition, urlCondition);
66+
}
67+
return descriptionCondition != null ? descriptionCondition : urlCondition;
68+
}
4769

4870
private Link link(Document doc) {
4971
return new Link(

src/main/java/com/howtographql/hackernews/Query.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public Query(LinkRepository linkRepository) {
1515
this.linkRepository = linkRepository;
1616
}
1717

18-
public List<Link> allLinks() {
19-
return linkRepository.getAllLinks();
18+
public List<Link> allLinks(LinkFilter filter, Number skip, Number first) {
19+
return linkRepository.getAllLinks(filter, skip.intValue(), first.intValue());
2020
}
2121
}

src/main/resources/schema.graphqls

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
1+
schema {
2+
query: Query
3+
mutation: Mutation
4+
}
5+
6+
type Query {
7+
allLinks(filter: LinkFilter, skip: Int = 0, first: Int = 0): [Link]
8+
}
9+
10+
type Mutation {
11+
createLink(url: String!, description: String!): Link
12+
createUser(name: String!, authProvider: AuthData!): User
13+
signinUser(auth: AuthData): SigninPayload
14+
createVote(linkId: ID, userId: ID): Vote
15+
}
16+
117
type Link {
218
id: ID!
319
url: String!
420
description: String
5-
postedBy: User!
21+
postedBy: User
622
}
723

824
type User {
@@ -12,11 +28,6 @@ type User {
1228
password: String
1329
}
1430

15-
input AuthData {
16-
email: String!
17-
password: String!
18-
}
19-
2031
type SigninPayload {
2132
token: String
2233
user: User
@@ -29,20 +40,14 @@ type Vote {
2940
link: Link!
3041
}
3142

32-
scalar DateTime
33-
34-
type Query {
35-
allLinks: [Link]
43+
input AuthData {
44+
email: String!
45+
password: String!
3646
}
3747

38-
type Mutation {
39-
createLink(url: String!, description: String!): Link
40-
createUser(name: String!, authProvider: AuthData!): User
41-
signinUser(auth: AuthData): SigninPayload!
42-
createVote(linkId: ID, userId: ID): Vote
48+
input LinkFilter {
49+
description_contains: String
50+
url_contains: String
4351
}
4452

45-
schema {
46-
query: Query
47-
mutation: Mutation
48-
}
53+
scalar DateTime

0 commit comments

Comments
 (0)