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

feat: add alimentation simulator #748

Merged
merged 32 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
75c0dc5
feat: add alimentation simulator
desoindx Nov 8, 2024
420773a
add values
desoindx Nov 8, 2024
0a26ac6
add category
desoindx Nov 12, 2024
fde27cb
finish simulator
desoindx Nov 13, 2024
f5c70e4
translation
desoindx Nov 13, 2024
c666352
feat: share
desoindx Nov 14, 2024
c61e5ea
first part review
desoindx Nov 14, 2024
ba5f646
second part review
desoindx Nov 14, 2024
b48ea09
update npm
desoindx Nov 14, 2024
1bbd57b
chore: update packages
desoindx Nov 15, 2024
c62bfad
add matomo
desoindx Nov 18, 2024
99a9634
add integration
desoindx Nov 19, 2024
8b2b508
next15
desoindx Nov 20, 2024
c2b5b4d
Merge branch 'chore/npm' into feat/alimentation
desoindx Nov 20, 2024
fba86a8
Merge remote-tracking branch 'origin/develop' into feat/alimentation
desoindx Nov 20, 2024
89992d6
update news
desoindx Nov 22, 2024
658a751
missing translations
desoindx Nov 25, 2024
535485b
review from Clémence
desoindx Nov 25, 2024
7b6df32
fix: review values from agribalyse
desoindx Nov 19, 2024
084d317
temp
desoindx Nov 25, 2024
b82daae
review from valentin
desoindx Nov 25, 2024
ebeb285
revert acv
desoindx Nov 26, 2024
461199c
fix typo
desoindx Nov 26, 2024
57cb79f
improve accessibility
desoindx Nov 26, 2024
93b9797
Merge branch 'develop' into feat/alimentation
desoindx Nov 28, 2024
08e3997
feat: add images
desoindx Nov 28, 2024
429c4e8
feat: fiches
desoindx Nov 28, 2024
770ea29
feat: add alimentation API
desoindx Nov 25, 2024
e951d59
Merge remote-tracking branch 'origin/develop' into feat/alimentation
desoindx Dec 2, 2024
108c7a5
update packages
desoindx Dec 2, 2024
e3b4953
upate ressources
desoindx Dec 2, 2024
af2a1a1
feat: use proper acv (#754)
desoindx Dec 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
id: lighthouseCheck
with:
device: all
urls: 'http://localhost:3000,http://localhost:3000/outils/comparateur,http://localhost:3000/outils/usagenumerique,http://localhost:3000/outils/livraison,http://localhost:3000/outils/chauffage,http://localhost:3000/outils/transport,http://localhost:3000/outils/fruitsetlegumes,http://localhost:3000/outils/chauffage/pompeachaleur,http://localhost:3000/outils/usagenumerique/visioconference,http://localhost:3000/outils/quiz'
urls: 'http://localhost:3000,http://localhost:3000/outils/comparateur,http://localhost:3000/outils/usagenumerique,http://localhost:3000/outils/livraison,http://localhost:3000/outils/chauffage,http://localhost:3000/outils/transport,http://localhost:3000/outils/fruitsetlegumes,http://localhost:3000/outils/chauffage/pompeachaleur,http://localhost:3000/outils/usagenumerique/visioconference,http://localhost:3000/outils/quiz,http://localhost:3000/outils/alimentation'
outputDirectory: ${{ github.workspace }}/tmp/artifacts
- name: Verify Lighthouse Check results
uses: foo-software/lighthouse-check-status-action@master
Expand Down
185 changes: 185 additions & 0 deletions app/api/v1/alimentation/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
import { NextRequest, NextResponse } from 'next/server'
import { Language } from 'types/equivalent'
import { z } from 'zod'
import { AlimentationCategories, equivalentsByCategory } from 'utils/alimentation'
import { trackAPIRequest } from 'utils/middleware'

const alimentationValidation = z.object({
category: z.nativeEnum(AlimentationCategories),
language: z.enum(['fr', 'en', 'es']).optional(),
})

const names: Record<Language, Record<string, string>> = {
en: {
viandes: 'Meats',
poissons: 'Fish and seafood',
laitier: 'Eggs and dairy products',
cereales: 'Cereals and legumes',
plats: 'Prepared dishes',
encas: 'Snacks',
fruits: 'Fruits and vegetables',
boucherie: 'Butchery',
poissonerie: 'Fishmonger',
traiteur: 'Deli',
fromagerie: 'Cheese shop',
boulangerie: 'Bakery',
epiceriesalee: 'Savory groceries',
epiceriesucree: 'Sweet groceries',
},
fr: {
viandes: 'Viandes',
poissons: 'Poissons et fruits de mer',
laitier: 'Oeufs et produits laitiers',
cereales: 'Céréales et légumineuses',
plats: 'Plats préparés',
encas: 'En-cas',
fruits: 'Fruits et légumes',
boucherie: 'Boucherie',
poissonerie: 'Poissonerie',
traiteur: 'Traiteur',
fromagerie: 'Fromagerie',
boulangerie: 'Boulangerie',
epiceriesalee: 'Épicerie salée',
epiceriesucree: 'Épicerie sucrée',
},
es: {
viandes: 'Carnes',
poissons: 'Pescados y mariscos',
laitier: 'Huevos y productos lácteos',
cereales: 'Cereales y legumbres',
plats: 'Platos preparados',
encas: 'Aperitivos',
fruits: 'Frutas y verduras',
boucherie: 'Carnicería',
poissonerie: 'Pescadería',
traiteur: 'Charcutería',
fromagerie: 'Quesería',
boulangerie: 'Panadería',
epiceriesalee: 'Comestibles salados',
epiceriesucree: 'Comestibles dulces',
},
}

/**
* @swagger
* /alimentation:
* get:
* tags:
* - Alimentation
* summary: Récupérer les données de l'alimentation
* description: Retourne les émissions par kg d'aliments, classé par catégorie
* parameters:
* - in: query
* name: category
* schema:
* type: string
* enum: [group, rayon, popularity]
* description: |-
* Catégorie utilisé pour ranger les aliments :
* - group : Groupe d'aliments (viandes, poissons, produits laitiers...)
* - rayon : Rayons du magasin (épicerie salée, boulangerie, traiteur...)
* - popularity : Popularité (les 10 aliments les plus consommés)
* - in: query
* name: language
* default: fr
* schema:
* type: string
* enum: [fr, en, es]
* description: Langue dans laquelle retourner les noms d'équivalent
* responses:
* 405:
* description: Mauvais type de requete HTTP
* content:
* text/plain:
* schema:
* type: string
* example: Only GET queries are allowed
* 400:
* description: Mauvais paramètres
* content:
* application/json:
* schema:
* type: object
* description: Erreur d'input générée via zod
* 200:
* description: Les émissions de l'alimentation
* content:
* application/json:
* schema:
* type: object
* required:
* - data
* properties:
* warning:
* type: string
* example: La requete n'est pas authentifée.
* data:
* type: array
* items:
* type: object
* required:
* - name
* - slug
* - items
* properties:
* name:
* type: string
* example: Viandes
* slug:
* type: string
* example: viandes
* items:
* type: array
* items:
* type: object
* required:
* - name
* - ecv
* - slug
* properties:
* name:
* type: string
* example: Boeuf
* ecv:
* type: number
* description: l'emission totale en kg de CO₂e
* example: 26.2
* slug:
* type: string
* example: boeuf
*/

export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url)
const inputs = alimentationValidation.safeParse(Object.fromEntries(searchParams))
if (!inputs.success) {
return NextResponse.json(inputs.error, { status: 400 })
}

const hasAPIKey = await trackAPIRequest(req, 'alimentation', JSON.stringify(inputs.data))
const equivalents = equivalentsByCategory[inputs.data.category]
return NextResponse.json(
{
data: equivalents.map(({ name, equivalents }) => ({
name: names[inputs.data.language || 'fr'][name],
slug: name,
items: equivalents.map(({ name, value, slug }) => ({
name,
slug,
ecv: value,
})),
})),
warning: hasAPIKey
? undefined
: `La requete n'est pas authentifée. Nous nous reservons le droit de couper cette API aux utilisateurs anonymes, veuillez nous contacter à ${process.env.NEXT_PUBLIC_CONTACT_EMAIL} pour obtenir une clé d'API gratuite.`,
},
{ status: 200 }
)
}

export async function OPTIONS() {
return NextResponse.json('Success', {
status: 204,
headers: { Allow: 'GET', 'Access-Control-Allow-Headers': 'Authorization' },
})
}
6 changes: 3 additions & 3 deletions app/api/v1/thematiques/ecv/[id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ const categoryValidation = z.object({
* description: |-
* ID ou Slug de la thématique demandée
* - 1 : numerique
* - 2 : repas
* - 2 : alimentation
* - 3 : boisson
* - 4 : transport
* - 5 : habillement
Expand Down Expand Up @@ -169,9 +169,9 @@ export async function GET(req: NextRequest, context: { params: Promise<{ id: str
return NextResponse.json(inputs.error, { status: 400 })
}

const { id, detail } = inputs.data
const { detail } = inputs.data
const id = inputs.data.id === 'repas' ? 'alimentation' : inputs.data.id
const hasAPIKey = await trackAPIRequest(req, 'category', id)

const idNumber = Number.parseInt(id)
const category = Number.isNaN(idNumber)
? categories.find((category) => category.slug === id)
Expand Down
7 changes: 6 additions & 1 deletion next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@ const nextConfig = {
destination: '/outils/comparateur',
permanent: true,
},
{
source: '/outils/repas/:slug*',
destination: '/outils/alimentation/:slug*',
permanent: true,
},
{
source: '/categories/:slug*',
destination: '/:slug*',
Expand Down Expand Up @@ -160,7 +165,7 @@ const nextConfig = {
{ source: '/transport/:slug*', destination: '/outils/transport/:slug*', permanent: true },
{ source: '/fruitsetlegumes/:slug*', destination: '/outils/fruitsetlegumes/:slug*', permanent: true },
{ source: '/numerique/:slug*', destination: '/outils/numerique/:slug*', permanent: true },
{ source: '/repas/:slug*', destination: '/outils/repas/:slug*', permanent: true },
{ source: '/repas/:slug*', destination: '/outils/alimentation/:slug*', permanent: true },
{ source: '/habillement/:slug*', destination: '/outils/habillement/:slug*', permanent: true },
{ source: '/mobilier/:slug*', destination: '/outils/mobilier/:slug*', permanent: true },
{ source: '/electromenager/:slug*', destination: '/outils/electromenager/:slug*', permanent: true },
Expand Down
56 changes: 55 additions & 1 deletion npm/react/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,67 @@ Liste des équivalents à comparer parmis la liste suivante :
- soja : Litre de boisson au soja
- the : Litre de thé
- cafe : Litre de café
- Repas
- Alimentation
- repasavecduboeuf : repas avec du boeuf
- repasvegetarien : repas végétarien
- repasvegetalien : repas végétalien
- repasavecdupoissonblanc : repas avec du poisson blanc
- repasavecdupoissongras : repas avec du poisson gras
- repasavecdupoulet : repas avec du poulet
- boeuf : kg de boeuf
- veau : kg de veau
- porc : kg de porc
- canard : kg de canard
- lapin : kg de lapin
- poulet : kg de poulet
- crevettes : kg de crevettes
- moules : kg de moules
- huitres : kg de huitres
- cabillaud : kg de cabillaud (cru)
- lieu : kg de lieu jaune ou colin (cru)
- dorade : kg de dorade royale
- saumon : kg de saumon ou truite d'élevage (cru)
- thon : kg de thon (cru)
- sardines : kg de sardines
- beurre : kg de beurre
- fromagedure : kg de fromage à pâte dure
- feta : kg de fêta (brebis)
- fromagemolle : kg de fromage à pâte molle
- mozarella : kg de mozarella
- fromagebleu : kg de fromage bleu
- oeuf : kg de oeufs
- matieregrasse : kg de matière grasse végétale
- yaourt : kg de yaourt nature ou yaourt à la grecque
- fromageblanc : kg de fromage blanc 0%
- quinoa : kg de quinoa (français)
- riz : kg de riz
- pates : kg de pâtes (sèches)
- ble : kg de blé
- boulgour : kg de boulgour
- poischiches : kg de pois chiches
- haricotsrouges : kg de haricots rouges
- lentilles : kg de lentilles (blondes, vertes, corail)
- cheeseburger : kg de cheeseburger
- kebab : kg de kebab
- burgerpoulet : kg de burger au poulet
- pizza : kg de pizza quatre fromages
- sushis : kg de sushis ou makis
- burgervegetarien : kg de burger végétarien
- frites : kg de frites (friteuse)
- tofu : kg de tofu nature
- boucheechocolat : kg de rocher au chocolat
- pateatartiner : kg de pâte à tartiner à la noisette
- brownie : kg de brownie au chocolat
- painauchocolat : kg de pain au chocolat ou chocolatine
- cookie : kg de cookie au pépites de chocolat
- madeleine : kg de madeleine
- painauxraisins : kg de pain aux raisins
- chaussonauxpommes : kg de chausson aux pommes
- croissant : kg de croissant au beurre
- paindemie : kg de pain de mie
- bonbons : kg de bonbons gélifiés
- baguette : kg de baguette tradition
- pommedeterre : kg de pomme de terre nouvelle
- Fruits et légumes
- fraise : kg de fraise
- pomme : kg de pomme
Expand Down
2 changes: 1 addition & 1 deletion npm/react/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@incubateur-ademe/impactco2-react",
"version": "1.4.0",
"version": "1.5.0",
"description": "Integrer les ressources d'Impact CO₂",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
Loading
Loading