Skip to content

Commit dbc0821

Browse files
authored
feat: search user issues type (#188)
1 parent 390306f commit dbc0821

File tree

13 files changed

+109
-87
lines changed

13 files changed

+109
-87
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,14 @@ const [
9090
octokitUser.events(),
9191
// Search in user commits (1000 results max)
9292
octokitUser.searchCommits(''),
93-
// Search in user issues (1000 results max)
94-
octokitUser.searchIssues(''),
93+
// Search in user issues (all, issue or pr) (1000 results max)
94+
octokitUser.searchIssues('pr', ''),
9595
// Search in user merged pull requests (1000 results max)
9696
octokitUser.searchPullRequests('merged', ''),
9797
// Get entities count
9898
octokitUser.getPullRequestsCount('draft'),
9999
octokitUser.getCommitsCount(),
100-
octokitUser.getIssuesCount(),
100+
octokitUser.getIssuesCount('pr'),
101101
],
102102
// Fetch all these in parallel
103103
{ concurrency: 'unbounded' }

bun.lock

Lines changed: 60 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import type {
2929
UserEventsResult,
3030
UserIssuesCountResult,
3131
UserIssuesSearchResult,
32+
UserIssuesType,
3233
UserOrgsResult,
3334
UserProfileResult,
3435
UserPullRequestsCountResult,
@@ -86,6 +87,7 @@ export type {
8687
UserPullRequestsCountResult,
8788
SortDirection,
8889
IssueState,
90+
UserIssuesType,
8991
};
9092

9193
export * from './layer/errors/api-rate-limit.error.js';

src/layer/api/users.api.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
UserEventsResult,
99
UserIssuesCountResult,
1010
UserIssuesSearchResult,
11+
UserIssuesType,
1112
UserOrgsResult,
1213
UserProfileResult,
1314
UserPullRequestsCountResult,
@@ -36,25 +37,30 @@ export const usersApi = (username: string) => ({
3637
*/
3738
orgs: (): Effect.Effect<UserOrgsResult, LayerErrors, Octokit> =>
3839
tapLayer(Context, ({ getUserOrgs }) => getUserOrgs(username)),
39-
getIssuesCount: (): Effect.Effect<
40-
UserIssuesCountResult,
41-
LayerErrors,
42-
Octokit
43-
> =>
40+
getIssuesCount: (
41+
type: UserIssuesType,
42+
): Effect.Effect<UserIssuesCountResult, LayerErrors, Octokit> =>
4443
tapLayer(Context, ({ getUserIssuesCount }) =>
45-
getUserIssuesCount({ username }),
44+
getUserIssuesCount({ username, type }),
4645
),
4746
/**
4847
* Github documentation:
4948
* https://docs.github.com/en/rest/search/search?apiVersion=2022-11-28#search-issues-and-pull-requests
5049
*/
5150
searchIssues: (
51+
type: UserIssuesType,
5252
query: string,
5353
fetchOnlyFirstPage = false,
5454
concurrency = defaultConcurrency,
5555
): Effect.Effect<UserIssuesSearchResult, LayerErrors, Octokit> =>
5656
tapLayer(Context, ({ searchUserIssues }) =>
57-
searchUserIssues({ username, query, fetchOnlyFirstPage, concurrency }),
57+
searchUserIssues({
58+
username,
59+
type,
60+
query,
61+
fetchOnlyFirstPage,
62+
concurrency,
63+
}),
5864
),
5965
getCommitsCount: (): Effect.Effect<
6066
UserCommitsCountResult,

src/layer/implementation/current-user/search-issues/get-user-issues-count.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ describe('getUserIssuesCount effect', () => {
2020
const count = 2000;
2121
const args: GetUserIssuesCountArgs = {
2222
username: 'cool',
23+
type: 'all',
2324
};
2425

2526
beforeEach(() => {

src/layer/implementation/current-user/search-issues/get-user-issues-count.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { Effect, pipe } from 'effect';
22

33
import type { EffectResultSuccess } from '@types';
44

5+
import type { UserIssuesType } from './search-user-issues.type.js';
56
import { searchUserIssuesPage } from './search-user-issues-page.js';
67

78
export interface GetUserIssuesCountArgs {
89
username: string;
10+
type: UserIssuesType;
911
}
1012

1113
export const getUserIssuesCount = ({ ...args }: GetUserIssuesCountArgs) =>

src/layer/implementation/current-user/search-issues/search-user-issues-page.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ vi.mock('@octokit/core');
2020
describe('searchUserIssuesPage effect', () => {
2121
const args: SearchUserIssuesPageArgs = {
2222
username: 'cool',
23+
type: 'all',
2324
query: '',
2425
page: 1,
2526
perPage: 1,

src/layer/implementation/current-user/search-issues/search-user-issues-page.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
import { getOnePage } from '@implementation/generic';
22
import type { EffectResultSuccess } from '@types';
33

4-
export interface SearchUserIssuesPageArgs {
5-
username: string;
6-
query: string;
4+
import type { SearchUserIssuesArgs } from './search-user-issues.type.js';
5+
6+
export interface SearchUserIssuesPageArgs extends SearchUserIssuesArgs {
77
page: number;
88
perPage: number;
99
}
1010

1111
export const searchUserIssuesPage = ({
1212
query,
1313
username,
14+
type,
1415
page,
1516
perPage,
16-
}: SearchUserIssuesPageArgs) =>
17-
getOnePage('search-user-issues-page', 'GET /search/issues', {
18-
q: `type:issue involves:${username} ${query}`,
17+
}: SearchUserIssuesPageArgs) => {
18+
const typeQuery = type === 'all' ? '' : `type:${type}`;
19+
20+
return getOnePage('search-user-issues-page', 'GET /search/issues', {
21+
q: `${typeQuery} involves:${username} ${query}`,
1922
page,
2023
per_page: perPage,
2124
advanced_search: 'true',
2225
});
26+
};
2327

2428
export type SearchUserIssuesPageItems = EffectResultSuccess<
2529
typeof searchUserIssuesPage

src/layer/implementation/current-user/search-issues/search-user-issues.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import {
99
} from '@tests/mock-data';
1010
import { octokitMock } from '@tests/mocks';
1111

12-
import type { SearchUserIssuesArgs } from './search-user-issues.js';
12+
import type { SearchUserIssuesAggregatorArgs } from './search-user-issues.js';
1313

1414
vi.mock('@octokit/core');
1515

1616
describe('searchUserIssues effect', () => {
17-
const args: SearchUserIssuesArgs = {
17+
const args: SearchUserIssuesAggregatorArgs = {
1818
username: 'cool',
19+
type: 'all',
1920
query: '',
2021
};
2122

src/layer/implementation/current-user/search-issues/search-user-issues.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ import { Effect, pipe } from 'effect';
33
import { getAllSearchPages } from '@implementation/generic';
44
import type { EffectResultSuccess } from '@types';
55

6+
import type { SearchUserIssuesArgs } from './search-user-issues.type.js';
67
import { searchUserIssuesPage } from './search-user-issues-page.js';
78

8-
export interface SearchUserIssuesArgs {
9-
username: string;
10-
query: string;
9+
export interface SearchUserIssuesAggregatorArgs extends SearchUserIssuesArgs {
1110
fetchOnlyFirstPage?: boolean;
1211
concurrency?: number;
1312
}
1413

15-
const getPage = (args: SearchUserIssuesArgs) => (page: number) =>
14+
const getPage = (args: SearchUserIssuesAggregatorArgs) => (page: number) =>
1615
searchUserIssuesPage({
1716
...args,
1817
page,
@@ -22,7 +21,7 @@ const getPage = (args: SearchUserIssuesArgs) => (page: number) =>
2221
export const searchUserIssues = ({
2322
fetchOnlyFirstPage,
2423
...args
25-
}: SearchUserIssuesArgs) =>
24+
}: SearchUserIssuesAggregatorArgs) =>
2625
pipe(
2726
Effect.gen(function* () {
2827
if (fetchOnlyFirstPage === true) {

0 commit comments

Comments
 (0)