Functional utility library for Enonic XP. This library is intended to house reusable and tested code blocks based on enonic-fp that can be used in every project.
Enonic-wizardry is intended to supplement enonic-fp with common patterns.
We recommend using this library together with the
xp-codegen-plugin Gradle plugin. xp-codegen-plugin will create TypeScript
interfaces
for your content-types. Those interfaces will be very useful together with this library.
npm run build
In this example we have a service that returns an article by the key
as json. Or if something goes wrong, we return
an Internal Server Error instead.
import {fold} from "fp-ts/lib/IOEither";
import {pipe} from "fp-ts/lib/pipeable";
import {Request, Response} from "enonic-types/controller";
import {errorResponse, ok} from "enonic-fp/controller";
import {Article} from "../../site/content-types/article/article"; // 1
import {getContentByIds} from "enonic-wizardry/content";
import {forceArray} from "enonic-fp/array";
export function get(req: Request): Response { // 2
const keys: Array<string> = forceArray(req.params.key); // ["key1", "key2", "key3"]
const program = pipe( // 3
getContentByIds<Article>(keys), // 4
fold( // 5
errorResponse(req), // 7
ok // 8
)
);
return program(); // 9
}
- We import an
interface Article { ... }
generated by xp-codegen-plugin. - We use the imported
Request
andResponse
to control the shape of our controller. - We use the
pipe
function from fp-ts to pipe the result of one function into the next one. - We can use the
getContentByIds
function fromcontent
that query for theContent<Article>
where the id is one of the strings in thekeys
-Array. The return type here isIOEither<EnonicError, ReadonlyArray<Content<Article>>>
- The last thing we usually do in
pipe
is to unpack theIOEither
. This is done withfold(handleError, handleSuccess)
. - The
errorResponse(req: Request)
function returns a new function that can be used as a callback byfold
. This "new function", takes theEnonicError
object as a parameter, and creates a JsonResponse
with the correct status number, based on theerrorKey
of theEnonicError
. - We pass the
ok
function tofold
as the second parameter. Theok
creates aResponse
where thestatus
is200
, and the parameter is thebody
. In this case theReadonlyArray<Content<Article>>
is assigned to thebody
. - We have so far constructed a constant
program
of typeIO<Response>
, but we have not yet performed a single side effect. It's time to perform those side effects, so we run theIO
by calling it, and aResponse
is returned which out controller function can return.
-
getContentByIds
createAll
createAndPublish
deleteAndPublish
modifyAndPublish
applyChangesToData
createMediaFromAttachment
-
runAsSuperUser
runInDraftContext
-
getSubMenuByKey
-
validate