Arbeidstilsynet.Brevgenerator.Client 5.2.0

dotnet add package Arbeidstilsynet.Brevgenerator.Client --version 5.2.0
                    
NuGet\Install-Package Arbeidstilsynet.Brevgenerator.Client -Version 5.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Arbeidstilsynet.Brevgenerator.Client" Version="5.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Arbeidstilsynet.Brevgenerator.Client" Version="5.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Arbeidstilsynet.Brevgenerator.Client" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Arbeidstilsynet.Brevgenerator.Client --version 5.2.0
                    
#r "nuget: Arbeidstilsynet.Brevgenerator.Client, 5.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Arbeidstilsynet.Brevgenerator.Client@5.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Arbeidstilsynet.Brevgenerator.Client&version=5.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Arbeidstilsynet.Brevgenerator.Client&version=5.2.0
                    
Install as a Cake Tool

Arbeidstilsynet.Brevgenerator.Client

NuGet-pakke i C# for å konsumere Brevgenerator-API.

Modeller for payload ligger i Arbeidstilsynet.Brevgenerator.Client.Models.

Autentisering må angis eksplisitt av konsumenten. Klienten støtter to moduser:

  • BearerToken – async factory som returnerer et gyldig bearer token (f.eks. Entra ID client credentials). Eneste støttet av nåværende deployet API.
  • ApiKey – async factory som returnerer ApiKey, som sendes i headeren x-api-key. Ble brukt før.

Hvordan installere

dotnet add package Arbeidstilsynet.Brevgenerator.Client

Bruk

Det finnes to måter å opprette klienten på:

Alternativ 1: Dependency Injection med egen ITokenProvider

Implementer ITokenProvider-grensesnittet og registrer klienten i DI-containeren via AddBrevgeneratorClient<T>:

using Arbeidstilsynet.Brevgenerator.Client.DependencyInjection;
using Arbeidstilsynet.Brevgenerator.Client.Ports;

// 1. Implementer ITokenProvider
public class MyTokenProvider : ITokenProvider
{
    public async Task<string> GetToken()
    {
        // Hent token fra f.eks. Entra ID
        return await HentAzureTokenAsync();
    }
}

// 2. Registrer i DI-containeren (f.eks. i Program.cs)
services.AddBrevgeneratorClient<MyTokenProvider>(
    hostEnvironment,
    new BrevgeneratorConfig { AuthMode = AuthMode.BearerToken, BaseUrl = "https://brevgenerator.example.com" }
);

// 3. Injiser IBrevgeneratorClient der du trenger den
public class MyService(IBrevgeneratorClient brevClient)
{
    public async Task<string> GenererBrev(GenererBrevArgs args)
    {
        return await brevClient.GenererBrev(args);
    }
}

Alternativ 2: Opprett klient direkte med en token-funksjon

Bruk CreateBrevgeneratorClient for å opprette klienten uten å sette opp en egen ITokenProvider-klasse eller ServiceCollection. Nyttig i enklere oppsett eller legacy-kode:

using Arbeidstilsynet.Brevgenerator.Client.DependencyInjection;

using var client = Extensions.CreateBrevgeneratorClient(
    hostEnvironment,
    tokenFunc: async () => await HentAzureTokenAsync(),
    new BrevgeneratorConfig { AuthMode = AuthMode.BearerToken, BaseUrl = "https://brevgenerator.example.com" }
);

var result = await client.GenererBrev(payload);

Bygge payload

using Arbeidstilsynet.Brevgenerator.Client.Models;
using Arbeidstilsynet.Brevgenerator.Client.Ports;

var payload = GenererBrevArgsBuilder
    .Create()
    .AddMarkdown(
        "# Sample Markdown content\n## {{ exampleVariable }}",
        new() { { "exampleVariable", "value" } }
    )
    .WithDefaultTemplate(Language.Nynorsk, SignatureVariant.ElektroniskGodkjent)
    .WithDefaultTemplateFields(
        new()
        {
            Dato = "2024",
            SaksbehandlerNavn = "Lorem Ipsum",
            Saksnummer = "2024/1234",
            Virksomhet = new()
            {
                Adresse = "Hei",
                Navn = "Mr Ipsum",
                Postnr = "1234",
                Poststed = "Stedet"
            }
        }
    )
    .WithMetadata(documentTitle: "My document", author: "A. U. Thor")
    .Build();

var result = await client.GenererBrev(payload);

Automatisk retry ved overbelastning

Når APIet er overbelastet svarer det 503 Service Unavailable med en Retry-After-header. Brevgenerering er uten sideeffekter, så klienten prøver slike spørringer automatisk på nytt, og venter minst den serveroppgitte tiden pluss litt tilfeldig jitter slik at flere konsumenter ikke prøver samtidig. Alt annet, inkludert 503 uten gyldig Retry-After, kastes videre til kalleren som før.

Innstilling Standard Beskrivelse
MaxRetryAttempts 2 Antall nye forsøk etter det første. 0 skrur av retry.
MaxRetryAfterDelay 30 sekunder Største Retry-After klienten godtar. Lengre verdier gir 503 til kalleren.
new BrevgeneratorConfig
{
    MaxRetryAttempts = 2,
    MaxRetryAfterDelay = TimeSpan.FromSeconds(30),
}

Bruk overloaden som tar CancellationToken for å avbryte både pågående spørring og venting før nytt forsøk:

var result = await client.GenererBrev(payload, cancellationToken);

Konfigurasjon av Base-URL og IHostEnvironment

Klienten bruker IHostEnvironment for å automatisk velge riktig base-URL basert på miljøet:

Miljø URL
Development http://localhost:4000
Production https://brevgen2-api.arbeidstilsynet.no/
Andre (f.eks. Test, Staging) https://brevgen2-api.dev.arbeidstilsynet.no/

Dersom BaseUrl er satt i BrevgeneratorConfig, vil denne alltid bli brukt — uavhengig av miljø. Miljøbasert URL-oppslag skjer kun når BaseUrl er null eller tom.

// BaseUrl er satt → denne brukes alltid, IHostEnvironment ignoreres
new BrevgeneratorConfig { AuthMode = AuthMode.BearerToken, BaseUrl = "https://min-egen-url.example.com" }

// BaseUrl er null → URL bestemmes av IHostEnvironment
new BrevgeneratorConfig { AuthMode = AuthMode.BearerToken, BaseUrl = null }

Hvordan publisere ny versjon

  1. Oppdater Version i BrevgeneratorClient.csproj med passende nytt semantisk versjonsnummer
  2. Skriv inn dine endringer i CHANGELOG.md
  3. PR og merge til main-branch
  4. Lag Git tag nuget-client-v<x.y.z>
  5. En ny pakke blir bygget og publisert i nuget.org, klar til bruk
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
5.2.0 1,106 8/6/2026
5.1.1 1,609 6/8/2026
5.1.0 3,403 3/26/2026
5.0.1 119 3/24/2026
5.0.0 327 3/24/2026
4.0.0 275 2/16/2026

# Changelog

## 5.2.0

- The client now retries automatically when the API responds `503 Service Unavailable` with a valid
 `Retry-After` header (overload), waiting at least the server-provided delay plus a small random
 jitter. Nothing else is retried.
- New `BrevgeneratorConfig` settings: `MaxRetryAttempts` (default `2`, `0` disables retry) and
 `MaxRetryAfterDelay` (default 30 seconds). Longer `Retry-After` values are not retried; the 503 is
 returned to the caller instead.
- New overload `GenererBrev(GenererBrevArgs payload, CancellationToken cancellationToken)`, which
 cancels both an in-flight request and a pending retry delay. Note: custom implementations or
 hand-written fakes of `IBrevgeneratorClient` must implement the new method.

## 5.1.1

- Updated XML documentation comments to align with the project glossary:
 "flettefelt" is now described as "variabler" (variables), and the document
 template metadata (DefaultTemplateFields / DirektoratTemplateFields) is now
 called "dokumentmalfelt" instead of "flettefelter".

## 5.1.0

- Added `BasicConfig.MergeCss: bool`, which can be set in `WithConversionOptions` to append custom CSS to the template's default CSS instead of replacing it entirely

## 5.0.1

- Fix access level of internal class' constructor

## 5.0.0

- Oppdatert pakkestruktur for å få en bedre forståelse om hva som er `internal` og hva som burde være `public`
- Lagt til støtte for å bruke pakken via DI-extension `ServiceCollection.AddBrevgeneratorClient()`
- DI må nå gjøres med `ServiceProvider.GetRequiredService<IBrevgeneratorClient>()`
- For å opprette klient uten eksisterende DI må den nye hjelpemetoden `Arbeidstilsynet.Brevgenerator.Client.DependencyInjection.Extensions.CreateBrevgeneratorClient()` brukes i stedet for direkte konstruktør

## 4.0.0

- Publiserer nå til `nuget.org` i stedet for Azure DevOps
- Omdøpt pakke fra `AT.Brevgenerator.Klient` til `Arbeidstilsynet.Brevgenerator.Client`
- Omdøpt namespace fra `AT.Brevgenerator.Klient` / `AT.Brevgenerator.Klient.Model` til `Arbeidstilsynet.Brevgenerator.Client` / `Arbeidstilsynet.Brevgenerator.Client.Models`
- Omdøpt `BrevgeneratorKlient` / `IBrevgeneratorKlient` til `BrevgeneratorClient` / `IBrevgeneratorClient`

## 3.3.0

- Lagt til støtte for `ErUnntattOffentlighet` og `UnntattOffentlighetHjemmel` i direktorat-template
- GenererBrevArgsBuilder sjekker nå at `UnntattOffentlighetHjemmel` er definert når `ErUnntattOffentlighet` er `true`

## 3.2.0

Støtte for ny dokument-mal "direktorat" med egen logo og andre felter. Konfigurer med nye metoder i builder `WithDirektoratTemplate` og `WithDirektoratTemplateFields`.

Til forskjell fra "default" template er ingen felter i `DirektoratTemplateFields` påkrevd.

## 3.1.6

- Fiks så `bearerTokenFactory` alltid kalles ved gjenbruk av samme httpClient
- Sett headers på selve request i stedet for å mutere `httpClient.DefaultRequestHeaders`
- Refactor av intern mappestruktur

## 3.1.5

- Fjern logging av payload og forenklet feilhåndtering

## 3.1.4

- Publiserer fra GitHub til public feed `AT.Public.NuGet`

## 3.1.3 - 2025-10-31

Fjernet `Path,Timeout,WaitForFonts` fra PuppeteerPDFOptions. Dette er en breaking change, men disse egenskapene var ikke ment å være tilgjengelige. API schema har blitt oppdatert og forsøk på å bruke disse vil bli stoppet av schema validation.

## 3.1.2 - 2025-10-09

Lagt til ClientId, TenantId og Scope i `BrevgeneratorSecret`

## 3.1.1 - 2025-10-09

Lagt til `AT.Brevgenerator.Klient.Model.BrevgeneratorSecret`

## 3.1.0 - 2025-10-09

Lagt til støtte for `DefaultTemplateFields.TidligereReferanse`

## 3.0.0 - 2025-08-29

Breaking changes:

- Fjernet automatisk uthenting av API Key fra AWS (ApiKeyRetriever og IApiKeyRetriever er fjernet).
- Fjernet AWS-avhengigheter (APIGateway, SimpleSystemsManagement) og forenklet `BrevgeneratorConfig` til kun `ApiUrl`.
- Region og ParameterStoreApiKeyIdName fjernet fra konfigurasjon.
- `AuthMode` må angis eksplisitt i konstruktør.

Nytt:

- Støtte for Bearer token (Entra ID client credentials e.l.) via `bearerTokenFactory`.

Migrering:

- Opprett konfig: `var config = new BrevgeneratorConfig(apiUrl);`
- Konstruer klient:

```cs
new BrevgeneratorKlient(
   config,
   BrevgeneratorKlient.AuthMode.BearerToken,
   bearerTokenFactory: async () => await GetToken()
);
```

eller

```cs
new BrevgeneratorKlient(
  config,
  BrevgeneratorKlient.AuthMode.ApiKey,
  apiKeyFactory: async () => await GetApiKey()
);
```

## 2.3.3 - 2025-04-08

Opprydding i model for å tilsvare API sitt schema:

- Satt de fleste felter i AT.Brevgenerator.Klient.Model.DefaultTemplateFields som required.
- Satt alle felter i AT.Brevgenerator.Klient.Model.Virksomhet som required.
- Forbedret håndtering av initialisering i builder.

## 2.3.2 - 2025-04-02

Fjernt nullability fra AT.Brevgenerator.Klient.Model.GeneratePdfOptions.Dynamic siden det er påkrevd av APIet

## 2.3.1 - 2025-03-28

Fjernet AT.Brevgenerator.Klient.Model.BasicConfig.BodyClass som ikke gjør noe

## 2.3.0 - 2025-03-27

Lagt til støtte for blank template

## 2.2.0 - 2025-01-22

Lagt til støtte for `null` som variabelverdi i forbindelse med truthy logikk

## 2.1.0 - 2025-01-14

Lagt til nye valgfrie felter i default template: DeresDato, DeresReferanse, ErUnntattOffentlighet

## 2.0.0 - 2024-11-29

Endret TargetFramework til net8.0

## 1.1.0 - 2024-10-29

La til signatureVariant Usignert

## 1.0.2 - 2024-10-18

Fiks få med signatureVariant i ArgsBuilder

## 1.0.1 - 2024-10-17

Fiks serialisering av enums

## 1.0.0 - 2024-10-09

Første versjon av pakken