Skip to content

Commit 17e9c87

Browse files
committed
Needs testing
1 parent 562d583 commit 17e9c87

5 files changed

Lines changed: 160 additions & 53 deletions

File tree

Sources/App/Controllers/Slack/SlackExternalController.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ final class SlackExternalController {
7676
return try Error.with(name: .noMarvelToken)
7777
}
7878

79-
// Get company members
80-
8179
let projectsJSON = try projectsInSlackFormat(request: request, marvelAccessToken: marvelToken)
8280

8381
// Filter on what the user is searching for in the field on Slack
@@ -155,22 +153,32 @@ final class SlackExternalController {
155153

156154
func projectsInSlackFormat(request: Request, marvelAccessToken: String, displayProperty: String = "text") throws -> [JSON] {
157155

158-
let result = try Marvel(droplet: drop).projects(accessToken: marvelAccessToken)
156+
let result = try Marvel(droplet: drop).projectsIncludingCompany(accessToken: marvelAccessToken)
159157

160-
guard let projectsArray = result.data["data"]?["user"]?["projects"]?["edges"]?.array else {
158+
guard var projectsArray = result.data["data"]?["user"]?["projects"]?["edges"]?.array else {
161159
throw Abort.badRequest
162160
}
163161

162+
// Check if users has company projects
163+
if let companyProjectsArray = result.data["data"]?["user"]?["company"]?["projects"]?["edges"]?.array {
164+
projectsArray.append(contentsOf: companyProjectsArray)
165+
}
166+
164167
var projectsNode = [MarvelProject]()
165168
for project in projectsArray{
166169
let project = MarvelProject(with: project["node"])
167170
projectsNode.append(project)
168171
}
169172

173+
// Clear duplicates as company projects might include personal projects...
174+
let filteredProjectsNode = projectsNode.filterDuplicates {
175+
$0.pk == $1.pk
176+
177+
}
170178

171179
// Map to a readable Slack format
172180

173-
let projectsJSON = try projectsNode.map { (project) -> JSON in
181+
let projectsJSON = try filteredProjectsNode.map { (project) -> JSON in
174182

175183
let json = try JSON(node: [
176184
displayProperty: project.name,

Sources/App/Controllers/Slack/SlackProjectsController.swift

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,45 +74,34 @@ final class SlackProjectsController {
7474
return try Error.with(name: .noMarvelToken)
7575
}
7676

77-
let projects = try Marvel(droplet: drop).projects(accessToken: marvelToken)
7877

79-
guard let projectsArray = projects.data["data"]?["user"]?["projects"]?["edges"]?.array else {
80-
return try Error.with(name: .general)
81-
}
82-
83-
var projectsNode = [MarvelProject]()
84-
for project in projectsArray{
85-
let project = MarvelProject(with: project["node"])
86-
projectsNode.append(project)
87-
}
88-
89-
let project = projectsNode.filter { (project) -> Bool in
90-
return project.pk == value
91-
}.first
78+
let projects = try Marvel(droplet: drop).project(pk: value, accessToken: marvelToken)
9279

93-
guard let projectFound = project else {
80+
guard let projectDic = projects.data["data"]?["project"] else {
9481
return try Error.with(name: .general)
9582
}
9683

97-
let collaborators = projectFound.collaborators.flatMap { (collab) -> String? in
84+
let project = MarvelProject(with: projectDic)
85+
86+
let collaborators = project.collaborators.flatMap { (collab) -> String? in
9887
return collab.username
9988
}.joined(separator: ", ")
100-
let collabWord = projectFound.collaborators.count > 1 ? "👧 \(projectFound.collaborators.count) collaborators" : "👧 1 collaborator"
89+
let collabWord = project.collaborators.count > 1 ? "👧 \(project.collaborators.count) collaborators" : "👧 1 collaborator"
10190

10291
return try JSON(node: [
10392
"response_type": "in_channel",
10493
"replace_original": false,
10594
"delete_original": true,
10695
"attachments": [
10796
[
108-
"title": projectFound.name,
109-
"title_link": projectFound.prototypeUrl,
110-
"thumb_url": projectFound.screens.first?.content?.url ?? "",
97+
"title": project.name,
98+
"title_link": project.prototypeUrl,
99+
"thumb_url": project.screens.first?.content?.url ?? "",
111100
"footer": "Marvel Prototyping",
112101
"fields": [
113102
[
114103
"title": "⏱ Last updated",
115-
"value": projectFound.lastModified.since().capitalizingFirstLetter(),
104+
"value": project.lastModified.since().capitalizingFirstLetter(),
116105
"short": true
117106
],
118107
[

Sources/App/Extensions/Array.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// Array.swift
3+
// App
4+
//
5+
// Created by Maxime De Greve on 16/02/2018.
6+
//
7+
8+
import Foundation
9+
10+
extension Array {
11+
12+
func filterDuplicates(includeElement: @escaping (_ lhs: Element, _ rhs: Element) -> Bool) -> [Element] {
13+
14+
var results = [Element]()
15+
16+
forEach { (element) in
17+
18+
let existingElements = results.filter {
19+
return includeElement(element, $0)
20+
}
21+
22+
if existingElements.count == 0 {
23+
results.append(element)
24+
}
25+
}
26+
return results
27+
}
28+
}

Sources/App/Tools/Marvel/GraphQueries.swift

Lines changed: 104 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,42 +42,76 @@ final class GraphQueries {
4242
url
4343
}
4444
45-
query {
46-
user {
47-
projects(first: 40) {
45+
{
46+
user {
47+
company {
48+
projects(first: 40) {
49+
edges {
50+
node {
51+
pk
52+
name
53+
prototypeUrl
54+
lastModified
55+
collaborators {
56+
edges {
57+
node {
58+
pk
59+
username
60+
email
61+
}
62+
}
63+
}
64+
screens(first: 2) {
65+
edges {
66+
node {
67+
name
68+
uuid
69+
modifiedAt
70+
content {
71+
__typename
72+
...image
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}
79+
}
80+
}
81+
projects(first: 40) {
82+
edges {
83+
node {
84+
pk
85+
name
86+
prototypeUrl
87+
lastModified
88+
collaborators {
4889
edges {
4990
node {
5091
pk
92+
username
93+
email
94+
}
95+
}
96+
}
97+
screens(first: 2) {
98+
edges {
99+
node {
51100
name
52-
prototypeUrl
53-
lastModified
54-
collaborators {
55-
edges {
56-
node {
57-
pk
58-
username
59-
email
60-
}
61-
}
62-
}
63-
screens(first: 2) {
64-
edges {
65-
node {
66-
name
67-
uuid
68-
modifiedAt
69-
content {
70-
__typename
71-
... image
72-
}
73-
}
74-
}
101+
uuid
102+
modifiedAt
103+
content {
104+
__typename
105+
...image
75106
}
76107
}
77108
}
78109
}
79110
}
80111
}
112+
}
113+
}
114+
}
81115
"""
82116

83117
static func createProject(name: String) -> String{
@@ -96,6 +130,50 @@ final class GraphQueries {
96130

97131
}
98132

133+
static func project(pk: Int) -> String{
134+
135+
return """
136+
137+
fragment image on ImageScreen {
138+
filename
139+
url
140+
}
141+
142+
query {
143+
project(pk: \(pk) {
144+
pk
145+
name
146+
prototypeUrl
147+
lastModified
148+
collaborators {
149+
edges {
150+
node {
151+
pk
152+
username
153+
email
154+
}
155+
}
156+
}
157+
screens(first: 2) {
158+
edges {
159+
node {
160+
name
161+
uuid
162+
modifiedAt
163+
content {
164+
__typename
165+
...image
166+
}
167+
}
168+
}
169+
}
170+
}
171+
}
172+
173+
"""
174+
175+
}
176+
99177
static func addCollaboratorToProject(email: String, projectPk: Int) -> String{
100178

101179
return """

Sources/App/Tools/Marvel/Marvel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,14 @@ final class Marvel {
9696
return try graphQL(query: GraphQueries.myUser, accessToken: accessToken)
9797
}
9898

99-
func projects(accessToken: String) throws -> Response{
99+
func projectsIncludingCompany(accessToken: String) throws -> Response{
100100
return try graphQL(query: GraphQueries.projects, accessToken: accessToken)
101101
}
102102

103+
func project(pk: Int, accessToken: String) throws -> Response{
104+
return try graphQL(query: GraphQueries.project(pk: pk), accessToken: accessToken)
105+
}
106+
103107
func createProject(name: String, accessToken: String) throws -> Response{
104108
return try graphQL(query: GraphQueries.createProject(name: name), accessToken: accessToken)
105109
}

0 commit comments

Comments
 (0)