Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Udefinerte felter i response istedenfor tomme lister eller tomme verdier #1355

Closed
prange opened this issue Oct 29, 2024 · 10 comments
Closed
Assignees
Labels
bug Something isn't working

Comments

@prange
Copy link

prange commented Oct 29, 2024

Description

Ved kall til /serviceowner/dialogs er inneholder returobjektet ikke items når ingen dialoger er funnet. Forventningen min er at det er en tom liste da typen PaginatedListOfSearchDialogSO ikke har spesifisert at verdien er optional. (se https://docs.altinn.studio/dialogporten/reference/entities/dialog/#search-1)

Reproduction

GET /serviceowner/dialogs?externalReference=xyz

Expected behavior

Alle felter er satt i objektet slik det er definert i datatypen, enten med tomme lister eller evt null.

@MagnusSandgren
Copy link
Collaborator

I dag purger vi alle felter som er null eller tomme fra responsen uavhengig av om de er nullable i responsmodellen eller ikke. Det ble gjort i sin tid for å lette trafikken, men kan definitivt skape forvirring og gjøre terskelen for å bruke DP høyere.

Foreslår å kun fjerne felter fra responsen dersom feltet på responsmodellen er nullable.

@elsand
Copy link
Member

elsand commented Oct 31, 2024

Enig, vi fjerner IgnoreEmptyCollection filteret.

@MagnusSandgren
Copy link
Collaborator

Jeg tenkte å modifisere IgnoreEmptyCollection filteret til å kun gjelde nullable retur typer, slik at vi har funksjonaliteten dersom vi velger å uttrykke at noen av listene skal være nullable i returmodellene. Men du vil heller fjerne hele filteret @elsand? 🙂

@elsand
Copy link
Member

elsand commented Nov 1, 2024

Hm, hvis vi gjør om en List<T> til å være nullable, gir det da ikke mening å initialisere den til null i stedet for [], slik at den da blir fjernet med Serializer.Options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull som vi allerede bruker? Eller mener du noe annet?

@MagnusSandgren
Copy link
Collaborator

Etter en diskusjon med @elsand og @oskogstad lander vi på å gjøre alle lister nullable i swagger output.

Rasjonale er oppsummert her:

Mitt forsøk på å strukturere tanker:

  1. Null liste gir i utgangspunktet ikke mening: En null liste gir egentlig ikke mening i mitt hode - sett bor i fra i en veldig spesifikk kontekst. Det blir litt som en nullable boolean. Og en sånn en gir kun mening som input i et søk - altså jeg har tatt stilling til det (true/false), eller jeg vil ikke at det skal ha noe utfall i søket mitt (null). Samme for en liste - enten bryr jeg meg om det og sender inn en liste, eller null om jeg ikke vil at søket mitt skal ta hensyn til det. I denne konteksten vil [] og null kunne ha forskjellig betydning - men ikke alltid.
  2. Null og tom output-liste må være ekvivalent: Finnes det scenarier hvor [] og null kan ha forskjellig betydning i en ren output kontekst? Jeg kommer ikke på noe i farten.
  3. Spare trafikk: Dersom 2 holder vann og vi bruker Serializer.Options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull gir det mening å fjerne null - og dermed også tomme lister fra output.
  4. Ikke lyv for sluttbruker: Dersom 3 holder vann må all output ICollection bli nullable. Dekorere alle lister som nullable i swagger?

@prange
Copy link
Author

prange commented Nov 6, 2024

Jeg tror at dersom dere vil spare på bytes som sendes over kabelen er det andre ting en å ta vekk felter som gir mer effekt - f.eks. mulighet for å definere et felt for idempotency, for å redusere antall GETs man må gjøre for å forhindre dobbeltkall.

Punktlisten over resonnerer godt i mitt hode - jeg vil allikevel slå et slag for at null og [] skaper ulik forventning hos klienten: Dersom en liste er nullable er både null, [] og [e1,...] mulige svar som klienten må håndtere. En utvikler må dermed alltid dobbeltsjekke hva forskjellen mellom null og [] er, og skrive kode som håndterer de to casene som samme. - Ikke mye, men mange bekker små...

oskogstad added a commit that referenced this issue Nov 6, 2024
<!--- Provide a general summary of your changes in the Title above -->

## Description

<!--- Describe your changes in detail -->

## Related Issue(s)

- #1355

## Verification

- [ ] **Your** code builds clean without any errors or warnings
- [ ] Manual testing done (required)
- [ ] Relevant automated test added (if you find this hard, leave it and
we'll help out)

## Documentation

- [ ] Documentation is updated (either in `docs`-directory, Altinnpedia
or a separate linked PR in
[altinn-studio-docs.](https://github.com/Altinn/altinn-studio-docs), if
applicable)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Updated API specifications to allow properties to be nullable,
enhancing flexibility in handling optional data.
- Introduced a method to make array-type properties nullable in OpenAPI
document schemas.

- **Bug Fixes**
- Updated serialization logic to include empty collections during data
serialization, affecting the output of serialized data.

- **Tests**
- Enhanced assertion logic in integration tests to require closer
matches for `DateTimeOffset` types.
- Modified dialog retrieval tests to no longer exclude missing members
in assertions, improving accuracy in test validations.
- Refined response handling in dialog search tests for better clarity
and accuracy in expectations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@oskogstad
Copy link
Collaborator

De skal være nullable i tt02 nå

@LeifHelstad
Copy link

LeifHelstad commented Nov 21, 2024

Det er en forskjell, men det praktiske effekten er nok den samme. Med unntak av at empty indikerer at det på et tidspunkt er gjort et valg om at listen skal være tom. "null" betyr at den aldri er satt, men om det er for at man ønker "tom" eller om det er mer "don't care" kan ikke tolkes.

image

Test : Basert på Reproduction steget hadde jeg forventet å ikke få noen treff. altså et "items" på en eller annen måte var tom. Dette må granskes nærmere.

@LeifHelstad
Copy link

LeifHelstad commented Nov 21, 2024

Typo fra min side i første testforsøk. Når jeg nå har fått skrevet externalReference rett så gir søket ingen treff.

Da blir den tomme "items" listen fjernet i sin helhet.
image

Dette i motseting til hvis det er et treff (eller flere)

image

For en mottaker av resultatet uten treff vil nå "items" være fjernet i sin helhet, uavhengig av om vi internt har ansett dem som [] eller null tidligere i kjeden. Det oppfatter jeg som formålet her.

@prange
Copy link
Author

prange commented Dec 4, 2024

Som bruker av APIet ville jeg foretrukket

{
 "items":[],
 "hasNextPage":false,
 "continuationToken":null,
 "orderBy":"createdat_desc,id_desc"
}

Når det ikke er noen treff.
Det er det mest konsistente i mine øyne. Det at det er nullable i schema er en god forbedring, da jeg iallfall er gjort oppmerksom på at items kan være null, men jeg må fortsatt gjøre en vurdering på hva forskjellen mellom null og [] er, og i koden normalisere null og [] til [].

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Development

No branches or pull requests

5 participants