Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion GUIDELINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ Detta dokument specificerar reglerna som verktyget tillämpar.
- [ID: UFN.08](#id-ufn08)
- [ID: UFN.09](#id-ufn09)
5. [Område: Mognad](#område-mognad)
- [ID: MOG.01](#id-mod01)
- [ID: MOG.01](#id-mog01)
- [ID: MOG.02](#id-mog02)
6. [Område: API Message](#område-api-message)
- [ID: AME.01](#id-ame01)
- [ID: AME.02](#id-ame02)
Expand Down
61 changes: 45 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<!--
SPDX-FileCopyrightText: 2025 diggsweden/rest-api-profil-lint-processor

SPDX-License-Identifier: CC0-1.0
SPDX-License-Identifier: CC0-1.0
-->

# REST API-profil - Lint Processor (RAP-LP)
[![Tag](https://img.shields.io/github/v/tag/diggsweden/rest-api-profil-lint-processor?style=for-the-badge&sort=semver&filter=%21*-*&color=green)](https://github.com/diggsweden/rest-api-profil-lint-processor/tags)

[![Tag](https://img.shields.io/github/v/tag/diggsweden/rest-api-profil-lint-processor?style=for-the-badge&sort=semver&filter=%21*-*&color=green)](https://github.com/diggsweden/rest-api-profil-lint-processor/tags)

[![License: EUPL 1.2](https://img.shields.io/badge/License-European%20Union%20Public%20Licence%201.2-library?style=for-the-badge&&color=lightblue)](LICENSE)
[![REUSE](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.reuse.software%2Fstatus%2Fgithub.com%2Fdiggsweden%2Frest-api-profil-lint-processor&query=status&style=for-the-badge&label=REUSE&color=lightblue)](https://api.reuse.software/info/github.com/diggsweden/rest-api-profil-lint-processor)
Expand Down Expand Up @@ -41,18 +41,21 @@ Verktyget är specifikt utvecklat för att linta OpenAPI-definitioner enligt den
Förutsätter att det finns en `openapi.yaml` att validera i den aktuella katalogen och beroende på hur man önskar att nyttja verktyget måste det finns installerade versioner av `Node.js`,`npm`, `Podman` eller `Docker`.

### NPM

> Notera: Att GitHub Packages (npm) kräver authentisering.<br>
> Konfigurera `.npmrc` mot rätt registry och scope, antingen globalt eller lokalt för enskilda projekt - `@diggsweden:registry=https://npm.pkg.github.com`<br>
> Om du saknar inloggning med GitHub Personal access token (PAT), se [FAQ](#hur-skapar-jag-ett-github-personal-access-token-pat).

> Notera: Att `<version>` byts ut mot önskad version av verktyget, oftast senaste release tag. För mer information se [versioner](#versioner).

#### Installera globalt med npm:

```bash
npm i -g @diggsweden/rest-api-profil-lint-processor@<version>
raplp -f openapi.yaml
```
> Notera: Att en omstart av terminal kan behövas för att `raplp` ska kunna användas som kommando.

> Notera: Att en omstart av terminal kan behövas för att `raplp` ska kunna användas som kommando.

#### Installera lokalt som `npm run` script

Expand All @@ -75,48 +78,60 @@ Lägg till ett [`npm run` script](https://docs.npmjs.com/cli/run-script) i din `
Nu kan du använda `npm run lint-processor`.

### NPX

Kör utan installation och package.json:

```bash
npx @diggsweden/rest-api-profil-lint-processor@<version> -f openapi.yaml
```

> Notera: Att npx laddar ned paketet till en tillfällig cache-mapp om det inte redan finns en version i node_modules/.bin

### Podman

Kör med podman:

```bash
podman run --rm -v $(pwd):/data ghcr.io/diggsweden/rest-api-profil-lint-processor:<version> -f /data/openapi.yaml
```

### Docker

Kör med docker:

```bash
docker run --rm -v $(pwd):/data ghcr.io/diggsweden/rest-api-profil-lint-processor:<version> -f /data/openapi.yaml
```

> Notera: Sökvägar kan hanteras olika beroende på miljö:
>
> - Podman (Linux/macOS/WSL): -v $(pwd):/app/example
> - Docker (PowerShell): -v "${PWD}:/app/example"
> - Docker (CMD): -v %cd%:/app/example

### Bygga från källkod

1. Klona ned projektet, gärna från senaste release tag.
2. Installera alla beroenden:

```bash
npm install
npm start -- -f openapi.yaml
```

> Notera: Att alla kommandon lokalt körs med `npm start --`.

## Versioner
Main-branchen, feature-brancher, pre-release- och testversioner används med reservation för att de kan innehålla funktionalitet som inte är garanterad att den är testad på samma sätt som en stabil version.

Main-branchen, feature-brancher, pre-release- och testversioner används med reservation för att de kan innehålla funktionalitet som inte är garanterad att den är testad på samma sätt som en stabil version.

**Stabila versioner**<br>
[Release](https://github.com/diggsweden/rest-api-profil-lint-processor/releases) ska alltid vara stabil och testad, vilket gör den till den föredragna versionen för att nyttja verktyget.<br>
Dessa versioner är taggade med `vX.X.X` utan något suffix.

**Pre-release- och testversioner**<br>
Pre-release-versioner är taggade med följande suffix:

- alpha → tidig testversion, ofta instabil
- beta → mer testad, men fortfarande pre-release
- rc → nära färdigställande, stabil release candidate
Expand All @@ -125,35 +140,40 @@ Rena testversioner är taggade med `vX.X.X-dev` följt av namnet på den branche
Dessa versioner är byggda för att testa funktionalitet som är under utveckling.

Alla versioner av verktyget hittar du här:

- [Container Image](https://github.com/diggsweden/rest-api-profil-lint-processor/pkgs/container/rest-api-profil-lint-processor)
- [NPM Package](https://github.com/diggsweden/rest-api-profil-lint-processor/pkgs/npm/rest-api-profil-lint-processor)

## Användning

Här beskrivs vilka användningsområden verktyget har med diverse flaggor som kan sättas för att nyttja verktygets funktionalitet.

### Tillgängliga flaggor

| Flagga | Beskrivning | Typ | Standard | Obligatorisk |
|---|---|---|---|---|
| `-f, --file` | Sökväg till OpenAPI-specifikation (YAML/JSON). | string | – | Ja |
| `-c, --categories` | Regelkategorier separerade med kommatecken. Tillgängliga: `UfnRules, SakRules, VerRules, FnsRules, ArqRules, DokRules, AmeRules, ForRules, DotRules, FelRules`. | string | – | Nej |
| `-l, --logError` | Sökväg till fil för felloggning från RAP-LP. Om inte angiven skrivs loggen till stdout. | string | stdout (om ej satt) | Nej |
| `-a, --append` | Append—utökar loggen i befintlig felloggningsfil (om `--logError` används). | boolean | `false` | Nej |
| `-d, --logDiagnostic` | Sökväg till fil för diagnostiseringsinformation från RAP-LP i JSON-format. | string | – | Nej |
| `--dex` | Sökväg till fil för diagnostiseringsinformation från RAP-LP i Excel-format. | string | – | Nej |

| Flagga | Beskrivning | Typ | Standard | Obligatorisk |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------- | ------------ |
| `-f, --file` | Sökväg till OpenAPI-specifikation (YAML/JSON). | string | – | Ja |
| `-c, --categories` | Regelkategorier separerade med kommatecken. Tillgängliga: `UfnRules, SakRules, VerRules, FnsRules, ArqRules, DokRules, AmeRules, ForRules, DotRules, FelRules, MogRules`. | string | – | Nej |
| `-l, --logError` | Sökväg till fil för felloggning från RAP-LP. Om inte angiven skrivs loggen till stdout. | string | stdout (om ej satt) | Nej |
| `-a, --append` | Append—utökar loggen i befintlig felloggningsfil (om `--logError` används). | boolean | `false` | Nej |
| `-d, --logDiagnostic` | Sökväg till fil för diagnostiseringsinformation från RAP-LP i JSON-format. | string | – | Nej |
| `--dex` | Sökväg till fil för diagnostiseringsinformation från RAP-LP i Excel-format. | string | – | Nej |

> Notera: Att `raplp` i alla kommandon nedan ersätts med respektive miljös sätt att köra verktyget (npm, docker eller podman).

### Validering med alla regler

För att validera en openapi-definition med verktyget, lägg till `-f <YAML_FILE>`

```bash
raplp -f openapi.yaml
```

### Validering med utvalda regler

För att validera mot en specifik kategori av regler, lägg till `-c <CategoryName>`.<br>
>Notera: Att du kan lägga till flera regler som en kommaseparerad lista.

> Notera: Att du kan lägga till flera regler som en kommaseparerad lista.

```bash
# Validera mot en specifik regel
Expand All @@ -172,24 +192,30 @@ raplp -f openapi.yaml -c DokRules,AmeRules,SakRules
- FelRules
- FnsRules
- ForRules
- MogRules
- ResRules
- SakRules
- UfnRules
- VerRules

### Validering som skriver felmeddelanden till en valfri loggfil

För att skriva felmeddelanden till en valfri loggfil, lägg till `-l <FILE>`

```bash
raplp -f openapi.yaml -l raplp.log
```

> Notera: Att varje körning skriver över den tidigare loggfilen.

För att lägga till loggning i samma fil, lägg till `-a`

```bash
raplp -f openapi.yaml -l raplp.log -a
```

### Validering som sparar loggdiagnostik i en fil

För att spara loggdiagnostik i en fil, lägg till `-d <FILE>`

```bash
Expand Down Expand Up @@ -217,6 +243,7 @@ raplp -f openapi.yaml --dex <PATH>
```

### Visa information version

För att visa aktuell version av verktyget, lägg till `--version`

```bash
Expand All @@ -230,8 +257,8 @@ raplp --help
```

### Riktlinjer och förklaringar
Vill du veta mer om de specifika reglerna som verktyget tillämpar, se avsnittet [GUIDELINES](GUIDELINES.md) för detaljer.

Vill du veta mer om de specifika reglerna som verktyget tillämpar, se avsnittet [GUIDELINES](GUIDELINES.md) för detaljer.

### Förklaring av översikt för regelutfall

Expand Down Expand Up @@ -285,7 +312,9 @@ Kravet har bedömts ha allvarlighetsgraden Warning eftersom API:et bryter mot et
Om du har frågor, funderingar, buggrapporter etc, vänligen kontakta [Digg - Agency for Digital Government](https://www.digg.se/)

## FAQ

### Hur skapar jag ett GitHub Personal Access Token (PAT)?

1. Gå till GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token → Generate new token (classic).
2. Sätt en beskrivning för ditt token under `Note` och ett utgångsdatum under `Expiration` (ha utgångsdatum!).
3. Select scopes → read:packages
Expand Down Expand Up @@ -329,4 +358,4 @@ Licens: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)

Speciellt tack till

- [Arbetsförmedlingen – The Swedish Public Employment Service](https://arbetsformedlingen.se/)
- [Arbetsförmedlingen – The Swedish Public Employment Service](https://arbetsformedlingen.se/)
1 change: 1 addition & 0 deletions REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ path = [
"images/fns08.png",
"images/fns09.png",
"images/mog01.png",
"images/mog02.png",
"images/res02.png",
"images/res06-1.png",
"images/res06-2.png",
Expand Down
Binary file added images/mog02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
46 changes: 45 additions & 1 deletion src/rulesets/MogRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import { DiagnosticSeverity } from '@stoplight/types';
import { CustomProperties } from '../ruleinterface/CustomProperties.js';
import { BaseRuleset } from './BaseRuleset.js';
import { countEndpoints, endPointsAreValid } from './util/MogRulesUtil.js';

const moduleName: string = 'MogRules.ts';

Expand Down Expand Up @@ -56,4 +57,47 @@ export class Mog01 extends BaseRuleset {
}
}

export default { Mog01 };
export class Mog02 extends BaseRuleset {
static customProperties: CustomProperties = {
område: 'Mognad',
id: 'MOG.02',
};
message = 'Alla API:er BÖR samtidigt designas för att uppnå nivå 3 enligt Richardson Maturity Model. ';
given = '$.paths';
then = [
{
function: (targetVal: any, _opts: string, paths: string[]) => {
if (countEndpoints(targetVal) < 2 || !endPointsAreValid(targetVal)) {
return [
{
message: this.message,
severity: this.severity,
paths: paths,
},
];
}
return [];
},
},
{
function: (targetVal: string, _opts: string, paths: string[]) => {
this.trackRuleExecutionHandler(
JSON.stringify(targetVal, null, 2),
_opts,
paths,
this.severity,
this.constructor.name,
moduleName,
Mog02.customProperties,
);
},
},
];
severity = DiagnosticSeverity.Warning;
constructor() {
super();
super.initializeFormats(['OAS3']);
}
}

export default { Mog01, Mog02 };
17 changes: 17 additions & 0 deletions src/rulesets/util/MogRulesUtil.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-FileCopyrightText: 2025 diggsweden/rest-api-profil-lint-processor
//
// SPDX-License-Identifier: EUPL-1.2

export const countEndpoints = (apiPaths: Record<string, any>): number => {
return Object.keys(apiPaths).length;
};

export const endPointsAreValid = (apiPaths: Record<string, any>): boolean => {
const validHttpMethods = ['get', 'post', 'put', 'delete', 'patch'];
return Object.values(apiPaths).every((methodsObj) => {
const methodKeys = Object.keys(methodsObj).map((method) => method.toLowerCase());
const hasAtLeastTwoMethods = methodKeys.length >= 2;
const hasValidHttpMethod = methodKeys.some((method) => validHttpMethods.includes(method));
return hasAtLeastTwoMethods && hasValidHttpMethod;
});
};
Loading