Skip to content

Commit

Permalink
feat: add request from nextjs (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
rgomezcasas authored Jun 11, 2024
1 parent 5ff0c18 commit f0ea57e
Show file tree
Hide file tree
Showing 8 changed files with 448 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/silent-flies-search.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@codelytv/criteria-from-next-request": major
---

add from next request
23 changes: 23 additions & 0 deletions packages/criteria-from-next-request/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<p align="center">
<a href="https://codely.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://codely.com/logo/codely_logo-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://codely.com/logo/codely_logo-light.svg">
<img alt="Codely logo" src="https://codely.com/logo/codely_logo.svg">
</picture>
</a>
</p>

<h1 align="center">
Criteria from Next.js Request
</h1>

<p align="center">
<a href="https://github.com/CodelyTV"><img src="https://img.shields.io/badge/Codely-OS-green.svg?style=flat-square" alt="codely.com"/></a>
</p>

## 📥 Installation

```sh
npm i @codelytv/criteria-from-next-request
```
22 changes: 22 additions & 0 deletions packages/criteria-from-next-request/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "@codelytv/criteria-from-next-request",
"version": "0.0.1",
"description": "",
"keywords": [],
"author": "Codely (https://codely.com)",
"license": "MIT",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"test": "node --import tsx --test test/*.test.ts",
"build": "tsc --build --verbose tsconfig.json"
},
"dependencies": {
"@codelytv/criteria": "workspace:^",
"@codelytv/criteria-from-url": "workspace:^",
"next": ">=13.0.0"
},
"devDependencies": {
"@codelytv/criteria-test-mother": "workspace:^"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { Criteria, FiltersPrimitives } from "@codelytv/criteria";
import { CriteriaFromUrlConverter } from "@codelytv/criteria-from-url";
import { NextRequest } from "next/server";

export class CriteriaFromNextRequestConverter {
private readonly urlConverter: CriteriaFromUrlConverter;

constructor() {
this.urlConverter = new CriteriaFromUrlConverter();
}

public toCriteria(request: NextRequest): Criteria {
const url = new URL(request.url);

return this.urlConverter.toCriteria(url);
}

public toFiltersPrimitives(request: NextRequest): FiltersPrimitives[] {
const url = new URL(request.url);

return this.urlConverter.toFiltersPrimitives(url);
}
}
1 change: 1 addition & 0 deletions packages/criteria-from-next-request/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./CriteriaFromNextRequestConverter";
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import assert from "node:assert";
import { describe, it } from "node:test";

import { CriteriaMother } from "@codelytv/criteria-test-mother";
import { NextRequest } from "next/server";

import { CriteriaFromNextRequestConverter } from "../src/CriteriaFromNextRequestConverter";

describe("CriteriaFromNextRequestConverter should", () => {
const converter = new CriteriaFromNextRequestConverter();

it("Converts a url with one filter", () => {
const url = new URL(
"http://localhost:3000/api/users?filters[0][field]=name&filters[0][operator]=CONTAINS&filters[0][value]=Javi",
);
const request = new NextRequest(url);

const expectedCriteria = CriteriaMother.withOneFilter("name", "CONTAINS", "Javi");

assert.deepEqual(converter.toCriteria(request), expectedCriteria);
});

it("Converts a url with multiple filters", () => {
const url = new URL(
"http://localhost:3000/api/users?filters[0][field]=name&filters[0][operator]=CONTAINS&filters[0][value]=Javi&filters[1][field]=email&filters[1][operator]=CONTAINS&filters[1][value]=gmail",
);
const request = new NextRequest(url);

const expectedCriteria = CriteriaMother.create({
filters: [
{
field: "name",
operator: "CONTAINS",
value: "Javi",
},
{
field: "email",
operator: "CONTAINS",
value: "gmail",
},
],
orderBy: null,
orderType: null,
pageSize: null,
pageNumber: null,
});

assert.deepEqual(converter.toCriteria(request), expectedCriteria);
});

it("Converts a url with multiple filters order and pagination", () => {
const url = new URL(
"http://localhost:3000/api/users" +
"?filters[0][field]=name&filters[0][operator]=CONTAINS&filters[0][value]=Javi" +
"&filters[1][field]=email&filters[1][operator]=CONTAINS&filters[1][value]=gmail",
);
const request = new NextRequest(url);

const expectedCriteria = CriteriaMother.create({
filters: [
{
field: "name",
operator: "CONTAINS",
value: "Javi",
},
{
field: "email",
operator: "CONTAINS",
value: "gmail",
},
],
orderBy: null,
orderType: null,
pageSize: null,
pageNumber: null,
});

assert.deepEqual(converter.toCriteria(request), expectedCriteria);
});

it("Converts a url with multiple filters order and pagination", () => {
const url = new URL(
"http://localhost:3000/api/users" +
"?filters[0][field]=name&filters[0][operator]=CONTAINS&filters[0][value]=Javi" +
"&filters[1][field]=email&filters[1][operator]=CONTAINS&filters[1][value]=gmail" +
"&orderBy=name&order=ASC" +
"&pageSize=10&pageNumber=2",
);
const request = new NextRequest(url);

const expectedCriteria = CriteriaMother.create({
filters: [
{
field: "name",
operator: "CONTAINS",
value: "Javi",
},
{
field: "email",
operator: "CONTAINS",
value: "gmail",
},
],
orderBy: "name",
orderType: "ASC",
pageSize: 10,
pageNumber: 2,
});

assert.deepEqual(converter.toCriteria(request), expectedCriteria);
});
});
7 changes: 7 additions & 0 deletions packages/criteria-from-next-request/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "dist"
},
"include": ["src/**/*"],
}
Loading

0 comments on commit f0ea57e

Please sign in to comment.