Skip to content

Commit

Permalink
Merge branch 'develop' into feat/osezchanger
Browse files Browse the repository at this point in the history
  • Loading branch information
desoindx committed Dec 4, 2024
2 parents 357baa5 + b31eb70 commit 7516766
Show file tree
Hide file tree
Showing 328 changed files with 10,397 additions and 829 deletions.
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

0 comments on commit 7516766

Please sign in to comment.