Skip to content

Commit 6246fef

Browse files
Use the query on a page
Refs #3108
1 parent 0348c13 commit 6246fef

File tree

2 files changed

+90
-42
lines changed

2 files changed

+90
-42
lines changed

src/WebApp/request-review-flow/start-page/index.ts

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Effect, pipe } from 'effect'
1+
import { Effect, Option, pipe } from 'effect'
22
import { format } from 'fp-ts-routing'
33
import type * as RT from 'fp-ts/lib/ReaderTask.js'
44
import * as RTE from 'fp-ts/lib/ReaderTaskEither.js'
@@ -7,12 +7,7 @@ import type { SupportedLocale } from '../../../locales/index.ts'
77
import { type GetPreprintTitleEnv, getPreprintTitle } from '../../../preprint.ts'
88
import type { IndeterminatePreprintId } from '../../../Preprints/index.ts'
99
import { EffectToFpts } from '../../../RefactoringUtilities/index.ts'
10-
import {
11-
type GetReviewRequestEnv,
12-
type SaveReviewRequestEnv,
13-
maybeGetReviewRequest,
14-
saveReviewRequest,
15-
} from '../../../review-request.ts'
10+
import { type SaveReviewRequestEnv, saveReviewRequest } from '../../../review-request.ts'
1611
import * as ReviewRequests from '../../../ReviewRequests/index.ts'
1712
import { requestReviewCheckMatch, requestReviewPublishedMatch, requestReviewStartMatch } from '../../../routes.ts'
1813
import { Temporal, Uuid } from '../../../types/index.ts'
@@ -31,10 +26,9 @@ export const requestReviewStart = ({
3126
locale: SupportedLocale
3227
}): RT.ReaderTask<
3328
GetPreprintTitleEnv &
34-
GetReviewRequestEnv &
3529
SaveReviewRequestEnv &
3630
Uuid.GenerateUuidEnv &
37-
EffectToFpts.EffectEnv<ReviewRequests.ReviewRequestCommands>,
31+
EffectToFpts.EffectEnv<ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries>,
3832
LogInResponse | PageResponse | RedirectResponse
3933
> =>
4034
pipe(
@@ -47,11 +41,15 @@ export const requestReviewStart = ({
4741
RTE.map(preprint => preprint.id),
4842
),
4943
),
50-
RTE.bindW('reviewRequest', ({ preprint, user }) => pipe(maybeGetReviewRequest(user.orcid, preprint))),
44+
RTE.bindW('reviewRequest', ({ preprint, user }) =>
45+
EffectToFpts.toReaderTaskEither(
46+
ReviewRequests.findReviewRequestByAPrereviewer({ requesterId: user.orcid, preprintId: preprint }),
47+
),
48+
),
5149
RTE.chainFirstW(({ preprint, reviewRequest, user }) =>
52-
match(reviewRequest)
53-
.with({ status: P.union('incomplete', 'completed') }, () => RTE.of(undefined))
54-
.with(undefined, () =>
50+
Option.match(reviewRequest, {
51+
onSome: () => RTE.of(undefined),
52+
onNone: () =>
5553
pipe(
5654
RTE.rightReaderIO(Uuid.generateUuidIO),
5755
RTE.chainFirstW(id => saveReviewRequest(user.orcid, preprint, { status: 'incomplete', id })),
@@ -68,8 +66,7 @@ export const requestReviewStart = ({
6866
),
6967
),
7068
),
71-
)
72-
.exhaustive(),
69+
}),
7370
),
7471
RTE.matchW(
7572
error =>
@@ -79,18 +76,27 @@ export const requestReviewStart = ({
7976
)
8077
.with({ _tag: 'PreprintIsNotFound' }, 'not-found', () => pageNotFound(locale))
8178
.with(
82-
{ _tag: P.union('PreprintIsUnavailable', 'ReviewRequestWasAlreadyStarted', 'UnableToHandleCommand') },
79+
{
80+
_tag: P.union(
81+
'PreprintIsUnavailable',
82+
'ReviewRequestWasAlreadyStarted',
83+
'UnableToHandleCommand',
84+
'UnableToQuery',
85+
),
86+
},
8387
'unavailable',
8488
() => havingProblemsPage(locale),
8589
)
8690
.exhaustive(),
8791
state =>
8892
match(state)
89-
.with({ reviewRequest: undefined }, state =>
93+
.with({ reviewRequest: { _tag: 'None' } }, state =>
9094
RedirectResponse({ location: format(requestReviewCheckMatch.formatter, { id: state.preprint }) }),
9195
)
92-
.with({ reviewRequest: { status: 'incomplete' } }, state => carryOnPage(state.locale, state.preprint))
93-
.with({ reviewRequest: { status: 'completed' } }, () =>
96+
.with({ reviewRequest: { _tag: 'Some', value: { _tag: 'ReviewRequestPendingPublication' } } }, state =>
97+
carryOnPage(state.locale, state.preprint),
98+
)
99+
.with({ reviewRequest: { _tag: 'Some', value: { _tag: 'PublishedReviewRequest' } } }, () =>
94100
RedirectResponse({ location: format(requestReviewPublishedMatch.formatter, { id: state.preprint }) }),
95101
)
96102
.exhaustive(),

test/WebApp/request-review-flow/request-review-start.test.ts

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as Commands from '../../../src/Commands.ts'
77
import * as ReviewRequests from '../../../src/ReviewRequests/index.ts'
88
import * as StatusCodes from '../../../src/StatusCodes.ts'
99
import * as _ from '../../../src/WebApp/request-review-flow/index.ts'
10-
import type { GetReviewRequestEnv, SaveReviewRequestEnv } from '../../../src/review-request.ts'
10+
import type { SaveReviewRequestEnv } from '../../../src/review-request.ts'
1111
import { requestReviewCheckMatch, requestReviewPublishedMatch, requestReviewStartMatch } from '../../../src/routes.ts'
1212
import * as EffectTest from '../../EffectTest.ts'
1313
import * as fc from '../../fc.ts'
@@ -24,15 +24,19 @@ describe('requestReviewStart', () => {
2424
fc.uuid(),
2525
])('when a request can be started', (preprint, user, preprintTitle, locale, uuid) =>
2626
Effect.gen(function* () {
27-
const runtime = yield* Effect.runtime<ReviewRequests.ReviewRequestCommands>()
28-
const getReviewRequest = jest.fn<GetReviewRequestEnv['getReviewRequest']>(_ => TE.left('not-found'))
27+
const findReviewRequestByAPrereviewer = jest.fn<
28+
(typeof ReviewRequests.ReviewRequestQueries.Service)['findReviewRequestByAPrereviewer']
29+
>(_ => Effect.succeedNone)
30+
const runtime = yield* Effect.provide(
31+
Effect.runtime<ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries>(),
32+
Layer.mock(ReviewRequests.ReviewRequestQueries, { findReviewRequestByAPrereviewer }),
33+
)
2934
const saveReviewRequest = jest.fn<SaveReviewRequestEnv['saveReviewRequest']>(_ => TE.right(undefined))
3035

3136
const actual = yield* Effect.promise(() =>
3237
_.requestReviewStart({ preprint, user, locale })({
3338
generateUuid: () => uuid,
3439
getPreprintTitle: () => TE.right(preprintTitle),
35-
getReviewRequest,
3640
runtime,
3741
saveReviewRequest,
3842
})(),
@@ -43,7 +47,10 @@ describe('requestReviewStart', () => {
4347
status: StatusCodes.SeeOther,
4448
location: format(requestReviewCheckMatch.formatter, { id: preprintTitle.id }),
4549
})
46-
expect(getReviewRequest).toHaveBeenCalledWith(user.orcid, preprintTitle.id as never)
50+
expect(findReviewRequestByAPrereviewer).toHaveBeenCalledWith({
51+
requesterId: user.orcid,
52+
preprintId: preprintTitle.id,
53+
})
4754
expect(saveReviewRequest).toHaveBeenCalledWith(user.orcid, preprintTitle.id as never, {
4855
status: 'incomplete',
4956
id: uuid,
@@ -70,13 +77,14 @@ describe('requestReviewStart', () => {
7077
),
7178
])("when a request can't be started", (preprint, user, preprintTitle, locale, uuid, error) =>
7279
Effect.gen(function* () {
73-
const runtime = yield* Effect.runtime<ReviewRequests.ReviewRequestCommands>()
80+
const runtime = yield* Effect.runtime<
81+
ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries
82+
>()
7483

7584
const actual = yield* Effect.promise(() =>
7685
_.requestReviewStart({ preprint, user, locale })({
7786
generateUuid: () => uuid,
7887
getPreprintTitle: () => TE.right(preprintTitle),
79-
getReviewRequest: () => TE.left('not-found'),
8088
runtime,
8189
saveReviewRequest: () => TE.right(undefined),
8290
})(),
@@ -91,7 +99,14 @@ describe('requestReviewStart', () => {
9199
js: [],
92100
})
93101
}).pipe(
94-
Effect.provide(Layer.mock(ReviewRequests.ReviewRequestCommands, { startReviewRequest: () => error })),
102+
Effect.provide(
103+
Layer.mergeAll(
104+
Layer.mock(ReviewRequests.ReviewRequestCommands, { startReviewRequest: () => error }),
105+
Layer.mock(ReviewRequests.ReviewRequestQueries, {
106+
findReviewRequestByAPrereviewer: () => Effect.succeedNone,
107+
}),
108+
),
109+
),
95110
EffectTest.run,
96111
),
97112
)
@@ -100,19 +115,19 @@ describe('requestReviewStart', () => {
100115
test.prop([
101116
fc.indeterminatePreprintId(),
102117
fc.user(),
103-
fc.completedReviewRequest(),
118+
fc.record({ _tag: fc.constant('PublishedReviewRequest'), id: fc.uuid() }),
104119
fc.preprintTitle({ id: fc.preprintId() }),
105120
fc.supportedLocale(),
106121
])('when a request has already been completed', (preprint, user, reviewRequest, preprintTitle, locale) =>
107122
Effect.gen(function* () {
108-
const runtime = yield* Effect.runtime<ReviewRequests.ReviewRequestCommands>()
109-
const getReviewRequest = jest.fn<GetReviewRequestEnv['getReviewRequest']>(_ => TE.right(reviewRequest))
123+
const runtime = yield* Effect.runtime<
124+
ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries
125+
>()
110126

111127
const actual = yield* Effect.promise(() =>
112128
_.requestReviewStart({ preprint, user, locale })({
113129
generateUuid: shouldNotBeCalled,
114130
getPreprintTitle: () => TE.right(preprintTitle),
115-
getReviewRequest,
116131
runtime,
117132
saveReviewRequest: shouldNotBeCalled,
118133
})(),
@@ -123,26 +138,35 @@ describe('requestReviewStart', () => {
123138
status: StatusCodes.SeeOther,
124139
location: format(requestReviewPublishedMatch.formatter, { id: preprintTitle.id }),
125140
})
126-
expect(getReviewRequest).toHaveBeenCalledWith(user.orcid, preprintTitle.id as never)
127-
}).pipe(Effect.provide(Layer.mock(ReviewRequests.ReviewRequestCommands, {})), EffectTest.run),
141+
}).pipe(
142+
Effect.provide(
143+
Layer.mergeAll(
144+
Layer.mock(ReviewRequests.ReviewRequestCommands, {}),
145+
Layer.mock(ReviewRequests.ReviewRequestQueries, {
146+
findReviewRequestByAPrereviewer: () => Effect.succeedSome(reviewRequest),
147+
}),
148+
),
149+
),
150+
EffectTest.run,
151+
),
128152
)
129153

130154
test.prop([
131155
fc.indeterminatePreprintId(),
132156
fc.user(),
133-
fc.incompleteReviewRequest(),
157+
fc.record({ _tag: fc.constantFrom('ReviewRequestPendingPublication'), id: fc.uuid() }),
134158
fc.preprintTitle({ id: fc.preprintId() }),
135159
fc.supportedLocale(),
136160
])('when a request has already been started', (preprint, user, reviewRequest, preprintTitle, locale) =>
137161
Effect.gen(function* () {
138-
const runtime = yield* Effect.runtime<ReviewRequests.ReviewRequestCommands>()
139-
const getReviewRequest = jest.fn<GetReviewRequestEnv['getReviewRequest']>(_ => TE.right(reviewRequest))
162+
const runtime = yield* Effect.runtime<
163+
ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries
164+
>()
140165

141166
const actual = yield* Effect.promise(() =>
142167
_.requestReviewStart({ preprint, user, locale })({
143168
generateUuid: shouldNotBeCalled,
144169
getPreprintTitle: () => TE.right(preprintTitle),
145-
getReviewRequest,
146170
runtime,
147171
saveReviewRequest: shouldNotBeCalled,
148172
})(),
@@ -158,22 +182,32 @@ describe('requestReviewStart', () => {
158182
skipToLabel: 'main',
159183
js: [],
160184
})
161-
expect(getReviewRequest).toHaveBeenCalledWith(user.orcid, preprintTitle.id as never)
162-
}).pipe(Effect.provide(Layer.mock(ReviewRequests.ReviewRequestCommands, {})), EffectTest.run),
185+
}).pipe(
186+
Effect.provide(
187+
Layer.mergeAll(
188+
Layer.mock(ReviewRequests.ReviewRequestCommands, {}),
189+
Layer.mock(ReviewRequests.ReviewRequestQueries, {
190+
findReviewRequestByAPrereviewer: () => Effect.succeedSome(reviewRequest),
191+
}),
192+
),
193+
),
194+
EffectTest.run,
195+
),
163196
)
164197
})
165198

166199
test.prop([fc.indeterminatePreprintId(), fc.supportedLocale()])(
167200
'when the user is not logged in',
168201
(preprint, locale) =>
169202
Effect.gen(function* () {
170-
const runtime = yield* Effect.runtime<ReviewRequests.ReviewRequestCommands>()
203+
const runtime = yield* Effect.runtime<
204+
ReviewRequests.ReviewRequestCommands | ReviewRequests.ReviewRequestQueries
205+
>()
171206

172207
const actual = yield* Effect.promise(() =>
173208
_.requestReviewStart({ preprint, locale })({
174209
generateUuid: shouldNotBeCalled,
175210
getPreprintTitle: shouldNotBeCalled,
176-
getReviewRequest: shouldNotBeCalled,
177211
runtime,
178212
saveReviewRequest: shouldNotBeCalled,
179213
})(),
@@ -183,6 +217,14 @@ describe('requestReviewStart', () => {
183217
_tag: 'LogInResponse',
184218
location: format(requestReviewStartMatch.formatter, { id: preprint }),
185219
})
186-
}).pipe(Effect.provide(Layer.mock(ReviewRequests.ReviewRequestCommands, {})), EffectTest.run),
220+
}).pipe(
221+
Effect.provide(
222+
Layer.mergeAll(
223+
Layer.mock(ReviewRequests.ReviewRequestCommands, {}),
224+
Layer.mock(ReviewRequests.ReviewRequestQueries, {}),
225+
),
226+
),
227+
EffectTest.run,
228+
),
187229
)
188230
})

0 commit comments

Comments
 (0)