Skip to content

Commit 5d6d231

Browse files
authored
feat: creating and deleting pull requests reviews and comments (#12)
1 parent 9ff212a commit 5d6d231

26 files changed

+987
-89
lines changed

README.md

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,27 @@ const reactRepo: RepoArgs = {
162162
};
163163
const pull = repo.pull(39);
164164

165-
const [details, reviews, comments] = await Effect.runPromise(
165+
const [details, comments, reviews, createdReview, deletedReview] = await Effect.runPromise(
166166
pipe(
167167
Effect.all(
168168
[
169169
// Pull request details
170170
pull.details(),
171-
// Pull request #39 reviews
172-
pull.reviews(),
173171
// All the comments made on the pull request #39
174172
pull.comments(),
173+
// Pull request #39 reviews
174+
pull.reviews.get(),
175+
// Create a review
176+
pull.reviews.create({
177+
event: 'REQUEST_CHANGES',
178+
body: 'I think some points need to be adressed',
179+
comments: [{
180+
path: './src/cool.ts',
181+
body: "Shouldn't this file be renamed",
182+
}],
183+
}),
184+
// Delete review #2
185+
pull.reviews.delete(2);
175186
],
176187
{ concurrency: 'unbounded' }
177188
),
@@ -180,7 +191,7 @@ const [details, reviews, comments] = await Effect.runPromise(
180191
);
181192
```
182193

183-
### 🔶 Pull request reviews
194+
### 🔶 Pull request comments
184195

185196
```typescript
186197
import {
@@ -197,13 +208,23 @@ const reactRepo: RepoArgs = {
197208
const pull = repo.pull(39);
198209
const review = pull.review(2593339077);
199210

200-
const comments = await Effect.runPromise(
201-
pipe(
202-
// Review #2593339077 comments
203-
review.comments(),
204-
Effect.provide(Layer.mergeAll(OctokitLayerLive, LoggerConsoleLive))
205-
)
206-
);
211+
const [details, comments, reviews, createdReview, deletedReview] =
212+
await Effect.runPromise(
213+
pipe(
214+
Effect.all([
215+
// Create a comment in review #2593339077 on pull request #39
216+
review.comments.create({
217+
path: './src',
218+
body: 'cool',
219+
commitId: 'ff',
220+
}),
221+
// Get review #2593339077 comments
222+
review.comments.get(),
223+
// Delete comment #1 in review #2593339077
224+
review.comments.delete(1),
225+
])
226+
)
227+
);
207228
```
208229

209230
### 🔶 Parallelism and resilience

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ sonar.projectName=effect-octokit-layer
55
sonar.sources=.
66

77
sonar.javascript.lcov.reportPaths=./coverage/lcov.info
8-
sonar.exclusions=src/tests/**,src/**/*.test.ts,src/index.ts,src/test.ts,src/**/*.type.ts,src/types/**,src/layer/octokit.layer.ts,src/layer/effects/tap-layer.effect.ts
8+
sonar.exclusions=src/tests/**,src/**/*.test.ts,src/index.ts,src/test.ts,src/**/*.type.ts,src/layer/api/**,src/types/**,src/layer/octokit.layer.ts,src/layer/effects/tap-layer.effect.ts
99
sonar.verbose=false

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Logger, LoggerConsoleLive } from '@dependencies/logger';
22

3+
import type { RepoArgs } from './layer/api/repos/types/repo-args.type.js';
34
import { OctokitLayerLive } from './layer/github/octokit.layer-live.js';
4-
import type { RepoArgs } from './layer/octokit.layer.js';
55
import { OctokitLayer } from './layer/octokit.layer.js';
66

77
export { OctokitLayer, OctokitLayerLive };

src/layer/api/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './orgs.api.js';
2+
export * from './users.api.js';
3+
export * from './repos/repos-issues.api.js';
4+
export * from './repos/pull-requests/pull-requests.js';

src/layer/api/orgs.api.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { defaultConcurrency } from '@constants';
2+
3+
import { tapLayer } from '../effects/tap-layer.effect.js';
4+
import { OctokitLayerContext as Context } from '../octokit.context.js';
5+
6+
export const orgsApi = (owner: string) => ({
7+
repos: (concurrency = defaultConcurrency) =>
8+
tapLayer(Context, ({ getRepositories }) =>
9+
getRepositories({ target: owner, type: 'org', concurrency }),
10+
),
11+
});
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { defaultConcurrency } from '@constants';
2+
import type { PullRequestCommentCreationArgs } from '@implementation';
3+
4+
import { tapLayer } from '../../../effects/tap-layer.effect.js';
5+
import { OctokitLayerContext as Context } from '../../../octokit.context.js';
6+
import type { RepoArgs } from '../types/repo-args.type.js';
7+
8+
type PullRequestsReviewsCommentsApi = RepoArgs & {
9+
pullNumber: number;
10+
reviewId: number;
11+
};
12+
13+
export const pullRequestsReviewsCommentsApi = ({
14+
owner,
15+
name,
16+
pullNumber,
17+
reviewId,
18+
}: PullRequestsReviewsCommentsApi) => ({
19+
create: (
20+
args: Pick<PullRequestCommentCreationArgs, 'body' | 'commitId' | 'path'>,
21+
) =>
22+
tapLayer(Context, ({ createPullRequestComment }) =>
23+
createPullRequestComment({
24+
owner,
25+
repo: name,
26+
pullNumber,
27+
...args,
28+
}),
29+
),
30+
get: (concurrency = defaultConcurrency) =>
31+
tapLayer(Context, ({ getPullRequestReviewComments }) =>
32+
getPullRequestReviewComments({
33+
owner,
34+
repo: name,
35+
pullNumber,
36+
reviewId,
37+
concurrency,
38+
}),
39+
),
40+
delete: (commentId: number) =>
41+
tapLayer(Context, ({ deletePullRequestComment }) =>
42+
deletePullRequestComment({
43+
owner,
44+
repo: name,
45+
commentId,
46+
}),
47+
),
48+
});
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { defaultConcurrency } from '@constants';
2+
import type { PullRequestReviewCreationArgs } from '@implementation';
3+
4+
import { tapLayer } from '../../../effects/tap-layer.effect.js';
5+
import { OctokitLayerContext as Context } from '../../../octokit.context.js';
6+
import type { RepoArgs } from '../types/repo-args.type.js';
7+
import { pullRequestsReviewsCommentsApi } from './pull-requests-reviews-comments.js';
8+
9+
type PullRequestsReviewsApiArgs = RepoArgs & {
10+
pullNumber: number;
11+
};
12+
13+
export const pullRequestsReviewsApi = ({
14+
owner,
15+
name,
16+
pullNumber,
17+
}: PullRequestsReviewsApiArgs) => ({
18+
review: (reviewId: number) => ({
19+
comments: pullRequestsReviewsCommentsApi({
20+
owner,
21+
name,
22+
pullNumber,
23+
reviewId,
24+
}),
25+
}),
26+
reviews: {
27+
create: (
28+
args: Pick<PullRequestReviewCreationArgs, 'body' | 'comments' | 'event'>,
29+
) =>
30+
tapLayer(Context, ({ createPullRequestReview }) =>
31+
createPullRequestReview({
32+
owner,
33+
repo: name,
34+
pullNumber,
35+
...args,
36+
}),
37+
),
38+
get: (concurrency = defaultConcurrency) =>
39+
tapLayer(Context, ({ getPullRequestReviews }) =>
40+
getPullRequestReviews({
41+
owner,
42+
repo: name,
43+
pullNumber,
44+
concurrency,
45+
}),
46+
),
47+
delete: (reviewId: number) =>
48+
tapLayer(Context, ({ deletePullRequestReview }) =>
49+
deletePullRequestReview({
50+
owner,
51+
repo: name,
52+
pullNumber,
53+
reviewId,
54+
}),
55+
),
56+
},
57+
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { defaultConcurrency } from '@constants';
2+
3+
import { tapLayer } from '../../../effects/tap-layer.effect.js';
4+
import { OctokitLayerContext as Context } from '../../../octokit.context.js';
5+
import type { RepoArgs } from '../types/repo-args.type.js';
6+
import { pullRequestsReviewsApi } from './pull-requests-reviews.js';
7+
8+
export const repoPullRequestsApi = ({ owner, name }: RepoArgs) => ({
9+
pulls: (concurrency = defaultConcurrency) =>
10+
tapLayer(Context, ({ getRepoPullRequests }) =>
11+
getRepoPullRequests({ owner, repo: name, concurrency }),
12+
),
13+
pull: (number: number) => ({
14+
details: () =>
15+
tapLayer(Context, ({ getPullRequest }) =>
16+
getPullRequest({ owner, repo: name, number }),
17+
),
18+
comments: (concurrency = defaultConcurrency) =>
19+
tapLayer(Context, ({ getPullRequestComments }) =>
20+
getPullRequestComments({
21+
owner,
22+
repo: name,
23+
pullNumber: number,
24+
concurrency,
25+
}),
26+
),
27+
...pullRequestsReviewsApi({ owner, name, pullNumber: number }),
28+
}),
29+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { defaultConcurrency } from '@constants';
2+
3+
import { tapLayer } from '../../effects/tap-layer.effect.js';
4+
import { OctokitLayerContext as Context } from '../../octokit.context.js';
5+
import type { RepoArgs } from './types/repo-args.type.js';
6+
7+
export const repoIssuesApi = ({ owner, name }: RepoArgs) => ({
8+
issues: (concurrency = defaultConcurrency) =>
9+
tapLayer(Context, ({ getRepoIssues }) =>
10+
getRepoIssues({ owner, repo: name, concurrency }),
11+
),
12+
issue: (number: number) =>
13+
tapLayer(Context, ({ getIssue }) =>
14+
getIssue({ owner, repo: name, number }),
15+
),
16+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface RepoArgs {
2+
owner: string;
3+
name: string;
4+
}

0 commit comments

Comments
 (0)