From 88dc00a44bdbded4a15fb20a70f785d9111f2c84 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 27 Aug 2025 12:18:40 +0200 Subject: [PATCH] chore: datas are ok and sync also --- data/skills/backend.json | 67 ++++++++++++++++-------- data/skills/culture.json | 73 +++++++++++++++++--------- data/skills/data.json | 52 ++++++++++++------- data/skills/design.json | 57 ++++++++++---------- data/skills/devops.json | 104 +++++++++++++++++++++++-------------- data/skills/frontend.json | 62 ++++++++++++++-------- data/skills/mobile.json | 70 +++++++++++++++++-------- data/skills/security.json | 36 ++++++++----- data/skills/testing.json | 27 ++++++---- scripts/sync-skills.ts | 1 + services/skills-service.ts | 47 ++++++++++++----- 11 files changed, 385 insertions(+), 211 deletions(-) diff --git a/data/skills/backend.json b/data/skills/backend.json index 38c2f7c..2f5d9cf 100644 --- a/data/skills/backend.json +++ b/data/skills/backend.json @@ -11,7 +11,8 @@ "https://nodejs.org/", "https://nodejs.org/en/docs/", "https://github.com/nodejs/node" - ] + ], + "importance": "majeure" }, { "id": "python", @@ -22,7 +23,8 @@ "https://www.python.org/", "https://docs.python.org/3/", "https://github.com/python/cpython" - ] + ], + "importance": "majeure" }, { "id": "express", @@ -33,28 +35,32 @@ "https://expressjs.com/", "https://expressjs.com/en/guide/routing.html", "https://github.com/expressjs/express" - ] + ], + "importance": "standard" }, { "id": "golang", "name": "Go", "description": "Langage de programmation développé par Google", "icon": "fab-golang", - "links": ["https://golang.org/", "https://golang.org/doc/"] + "links": ["https://golang.org/", "https://golang.org/doc/"], + "importance": "standard" }, { "id": "rust", "name": "Rust", "description": "Langage de programmation système sûr et performant", "icon": "fab-rust", - "links": ["https://www.rust-lang.org/", "https://doc.rust-lang.org/"] + "links": ["https://www.rust-lang.org/", "https://doc.rust-lang.org/"], + "importance": "standard" }, { "id": "java-spring", "name": "Java Spring", "description": "Framework Java pour applications d'entreprise", "icon": "fab-java", - "links": ["https://spring.io/", "https://docs.spring.io/"] + "links": ["https://spring.io/", "https://docs.spring.io/"], + "importance": "majeure" }, { "id": "csharp-dotnet", @@ -64,56 +70,64 @@ "links": [ "https://dotnet.microsoft.com/", "https://docs.microsoft.com/dotnet/" - ] + ], + "importance": "incontournable" }, { "id": "php-laravel", "name": "PHP Laravel", "description": "Framework PHP moderne pour applications web", "icon": "fab-php", - "links": ["https://laravel.com/", "https://laravel.com/docs"] + "links": ["https://laravel.com/", "https://laravel.com/docs"], + "importance": "standard" }, { "id": "ruby-rails", "name": "Ruby on Rails", "description": "Framework web en Ruby", "icon": "fas-code", - "links": ["https://rubyonrails.org/", "https://guides.rubyonrails.org/"] + "links": ["https://rubyonrails.org/", "https://guides.rubyonrails.org/"], + "importance": "standard" }, { "id": "graphql", "name": "GraphQL", "description": "Langage de requête pour APIs", "icon": "fas-sitemap", - "links": ["https://graphql.org/", "https://graphql.org/learn/"] + "links": ["https://graphql.org/", "https://graphql.org/learn/"], + "importance": "standard" }, { "id": "prisma", "name": "Prisma", "description": "ORM moderne pour Node.js et TypeScript", "icon": "fas-database", - "links": ["https://www.prisma.io/", "https://www.prisma.io/docs"] + "links": ["https://www.prisma.io/", "https://www.prisma.io/docs"], + "importance": "standard" }, { "id": "trpc", "name": "tRPC", "description": "Framework TypeScript pour APIs type-safe", "icon": "fas-plug", - "links": ["https://trpc.io/", "https://trpc.io/docs"] + "links": ["https://trpc.io/", "https://trpc.io/docs"], + "importance": "standard" }, { "id": "nest-js", "name": "NestJS", "description": "Framework Node.js pour applications scalables", "icon": "fas-layers", - "links": ["https://nestjs.com/", "https://docs.nestjs.com/"] + "links": ["https://nestjs.com/", "https://docs.nestjs.com/"], + "importance": "standard" }, { "id": "fastify", "name": "Fastify", "description": "Framework web rapide pour Node.js", "icon": "fas-bolt", - "links": ["https://www.fastify.io/", "https://www.fastify.io/docs/"] + "links": ["https://www.fastify.io/", "https://www.fastify.io/docs/"], + "importance": "standard" }, { "id": "rabbitmq", @@ -123,9 +137,9 @@ "links": [ "https://www.rabbitmq.com/", "https://www.rabbitmq.com/documentation.html" - ] + ], + "importance": "standard" }, - { "id": "semantic-kernel", "name": "Semantic Kernel", @@ -134,7 +148,8 @@ "links": [ "https://github.com/microsoft/semantic-kernel", "https://learn.microsoft.com/en-us/semantic-kernel/" - ] + ], + "importance": "standard" }, { "id": "dotnet-core", @@ -144,7 +159,8 @@ "links": [ "https://dotnet.microsoft.com/", "https://docs.microsoft.com/dotnet/" - ] + ], + "importance": "incontournable" }, { "id": "asp-net-mvc", @@ -154,7 +170,8 @@ "links": [ "https://dotnet.microsoft.com/apps/aspnet/mvc", "https://docs.microsoft.com/aspnet/mvc/" - ] + ], + "importance": "incontournable" }, { "id": "spring-boot", @@ -164,7 +181,8 @@ "links": [ "https://spring.io/projects/spring-boot", "https://docs.spring.io/spring-boot/docs/current/reference/html/" - ] + ], + "importance": "majeure" }, { "id": "kafka-connect", @@ -174,14 +192,19 @@ "links": [ "https://docs.confluent.io/platform/current/connect/index.html", "https://kafka.apache.org/documentation/#connect" - ] + ], + "importance": "majeure" }, { "id": "oas-swagger", "name": "OAS Swagger", "description": "Spécification OpenAPI pour la documentation et la conception d'API RESTful", "icon": "fas-file-code", - "links": ["https://swagger.io/specification/", "https://swagger.io/docs/"] + "links": [ + "https://swagger.io/specification/", + "https://swagger.io/docs/" + ], + "importance": "incontournable" } ] } diff --git a/data/skills/culture.json b/data/skills/culture.json index 0c04875..eb19ff7 100644 --- a/data/skills/culture.json +++ b/data/skills/culture.json @@ -10,7 +10,8 @@ "https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html", "https://martinfowler.com/articles/practical-test-pyramid.html" ], - "icon": "fas-layer-group" + "icon": "fas-layer-group", + "importance": "standard" }, { "id": "ddd", @@ -20,7 +21,8 @@ "https://martinfowler.com/bliki/DomainDrivenDesign.html", "https://www.domainlanguage.com/ddd/" ], - "icon": "fas-sitemap" + "icon": "fas-sitemap", + "importance": "standard" }, { "id": "event-sourcing", @@ -30,7 +32,8 @@ "https://martinfowler.com/eaaDev/EventSourcing.html", "https://eventstore.com/docs/getting-started/" ], - "icon": "fas-history" + "icon": "fas-history", + "importance": "standard" }, { "id": "cqrs", @@ -40,7 +43,8 @@ "https://martinfowler.com/bliki/CQRS.html", "https://docs.microsoft.com/azure/architecture/patterns/cqrs" ], - "icon": "fas-exchange-alt" + "icon": "fas-exchange-alt", + "importance": "standard" }, { "id": "hexagonal-architecture", @@ -50,7 +54,8 @@ "https://alistair.cockburn.us/hexagonal-architecture/", "https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html" ], - "icon": "fas-hexagon" + "icon": "fas-hexagon", + "importance": "standard" }, { "id": "tdd", @@ -60,7 +65,8 @@ "https://martinfowler.com/bliki/TestDrivenDevelopment.html", "https://www.agilealliance.org/glossary/tdd/" ], - "icon": "fas-vial" + "icon": "fas-vial", + "importance": "standard" }, { "id": "bdd", @@ -70,7 +76,8 @@ "https://cucumber.io/docs/bdd/", "https://www.agilealliance.org/glossary/bdd/" ], - "icon": "fas-comments" + "icon": "fas-comments", + "importance": "standard" }, { "id": "pair-programming", @@ -80,7 +87,8 @@ "https://martinfowler.com/bliki/PairProgramming.html", "https://www.agilealliance.org/glossary/pair-programming/" ], - "icon": "fas-users" + "icon": "fas-users", + "importance": "standard" }, { "id": "code-review", @@ -90,7 +98,8 @@ "https://martinfowler.com/articles/code-review.html", "https://github.com/features/code-review" ], - "icon": "fas-search" + "icon": "fas-search", + "importance": "standard" }, { "id": "refactoring", @@ -100,7 +109,8 @@ "https://refactoring.com/", "https://martinfowler.com/books/refactoring.html" ], - "icon": "fas-tools" + "icon": "fas-tools", + "importance": "standard" }, { "id": "design-patterns", @@ -110,7 +120,8 @@ "https://refactoring.guru/design-patterns", "https://www.oodesign.com/" ], - "icon": "fas-puzzle-piece" + "icon": "fas-puzzle-piece", + "importance": "standard" }, { "id": "solid-principles", @@ -120,7 +131,8 @@ "https://en.wikipedia.org/wiki/SOLID", "https://blog.cleancoder.com/uncle-bob/2020/10/18/SolidPrinciples.html" ], - "icon": "fas-cube" + "icon": "fas-cube", + "importance": "standard" }, { "id": "agile", @@ -130,14 +142,19 @@ "https://agilemanifesto.org/", "https://www.agilealliance.org/" ], - "icon": "fas-running" + "icon": "fas-running", + "importance": "standard" }, { "id": "scrum", "name": "Scrum", "description": "Framework agile pour le développement de produits complexes avec des équipes auto-organisées", - "links": ["https://www.scrum.org/", "https://www.scrumguides.org/"], - "icon": "fas-sync" + "links": [ + "https://www.scrum.org/", + "https://www.scrumguides.org/" + ], + "icon": "fas-sync", + "importance": "standard" }, { "id": "kanban", @@ -147,7 +164,8 @@ "https://kanbanize.com/kanban-resources/getting-started/what-is-kanban", "https://www.atlassian.com/agile/kanban" ], - "icon": "fas-columns" + "icon": "fas-columns", + "importance": "standard" }, { "id": "devops-culture", @@ -157,7 +175,8 @@ "https://aws.amazon.com/devops/what-is-devops/", "https://www.atlassian.com/devops" ], - "icon": "fas-handshake" + "icon": "fas-handshake", + "importance": "standard" }, { "id": "continuous-learning", @@ -167,7 +186,8 @@ "https://www.thoughtworks.com/insights/blog/continuous-learning-software-development", "https://martinfowler.com/articles/developer-productivity.html" ], - "icon": "fas-graduation-cap" + "icon": "fas-graduation-cap", + "importance": "standard" }, { "id": "knowledge-sharing", @@ -177,7 +197,8 @@ "https://www.atlassian.com/team-playbook/plays/knowledge-sharing", "https://confluence.atlassian.com/" ], - "icon": "fas-share-alt" + "icon": "fas-share-alt", + "importance": "standard" }, { "id": "mob-programming", @@ -187,7 +208,8 @@ "https://mobprogramming.org/", "https://www.agilealliance.org/glossary/mob-programming/" ], - "icon": "fas-users-cog" + "icon": "fas-users-cog", + "importance": "standard" }, { "id": "technical-debt", @@ -197,7 +219,8 @@ "https://martinfowler.com/bliki/TechnicalDebt.html", "https://www.agilealliance.org/glossary/technical-debt/" ], - "icon": "fas-credit-card" + "icon": "fas-credit-card", + "importance": "standard" }, { "id": "code-quality", @@ -207,7 +230,8 @@ "https://martinfowler.com/articles/is-quality-worth-cost.html", "https://www.sonarqube.org/" ], - "icon": "fas-star" + "icon": "fas-star", + "importance": "standard" }, { "id": "documentation", @@ -217,7 +241,8 @@ "https://www.atlassian.com/software/confluence", "https://docs.github.com/" ], - "icon": "fas-book" + "icon": "fas-book", + "importance": "standard" } ] -} +} \ No newline at end of file diff --git a/data/skills/data.json b/data/skills/data.json index a71f926..912578b 100644 --- a/data/skills/data.json +++ b/data/skills/data.json @@ -10,7 +10,8 @@ "https://www.postgresql.org/docs/", "https://dev.mysql.com/doc/" ], - "icon": "fas-database" + "icon": "fas-database", + "importance": "incontournable" }, { "id": "postgresql", @@ -20,21 +21,24 @@ "https://www.postgresql.org/", "https://www.postgresql.org/docs/" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "mongodb", "name": "MongoDB", "description": "Base de données NoSQL orientée documents", "links": ["https://www.mongodb.com/", "https://docs.mongodb.com/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "incontournable" }, { "id": "redis", "name": "Redis", "description": "Base de données en mémoire, cache et courtier de messages", "links": ["https://redis.io/", "https://redis.io/docs/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "elasticsearch", @@ -44,21 +48,24 @@ "https://www.elastic.co/elasticsearch/", "https://www.elastic.co/guide/" ], - "icon": "fas-search" + "icon": "fas-search", + "importance": "standard" }, { "id": "python-data", "name": "Python (Data Science)", "description": "Python pour l'analyse de données et machine learning", "links": ["https://pandas.pydata.org/", "https://scikit-learn.org/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "tableau", "name": "Tableau", "description": "Plateforme de visualisation de données", "links": ["https://www.tableau.com/", "https://help.tableau.com/"], - "icon": "fas-chart" + "icon": "fas-chart", + "importance": "standard" }, { "id": "powerbi", @@ -68,14 +75,16 @@ "https://powerbi.microsoft.com/", "https://docs.microsoft.com/power-bi/" ], - "icon": "fab-microsoft" + "icon": "fab-microsoft", + "importance": "standard" }, { "id": "spark", "name": "Apache Spark", "description": "Moteur de traitement de données distribuées", "links": ["https://spark.apache.org/", "https://spark.apache.org/docs/"], - "icon": "fas-bolt" + "icon": "fas-bolt", + "importance": "standard" }, { "id": "airflow", @@ -85,14 +94,16 @@ "https://airflow.apache.org/", "https://airflow.apache.org/docs/" ], - "icon": "fas-stream" + "icon": "fas-stream", + "importance": "standard" }, { "id": "talend", "name": "Talend", "description": "Plateforme open source et commerciale d'intégration de données offrant une interface graphique pour l'ETL, le traitement batch et temps réel", "links": ["https://www.talend.com/", "https://help.talend.com/"], - "icon": "fas-database" + "icon": "fas-database", + "importance": "majeure" }, { "id": "kafka", @@ -102,7 +113,8 @@ "https://kafka.apache.org/", "https://kafka.apache.org/documentation/" ], - "icon": "fas-stream" + "icon": "fas-stream", + "importance": "incontournable" }, { "id": "dragonfly", @@ -112,7 +124,8 @@ "https://www.dragonflydb.io/", "https://www.dragonflydb.io/docs" ], - "icon": "fas-database" + "icon": "fas-database", + "importance": "standard" }, { "id": "sqlserver", @@ -122,29 +135,32 @@ "https://www.microsoft.com/fr-fr/sql-server/", "https://docs.microsoft.com/sql/" ], - "icon": "fab-microsoft" + "icon": "fab-microsoft", + "importance": "majeure" }, - { "id": "snowflake", "name": "Snowflake", "description": "Plateforme de data warehouse cloud-native permettant l'analyse de données à grande échelle", "links": ["https://www.snowflake.com/", "https://docs.snowflake.com/"], - "icon": "fas-cloud" + "icon": "fas-cloud", + "importance": "standard" }, { "id": "solr", "name": "SolR", "description": "Plateforme de recherche open source basée sur Apache Lucene, optimisée pour la recherche en texte intégral", "links": ["https://solr.apache.org/", "https://solr.apache.org/guide/"], - "icon": "fas-search" + "icon": "fas-search", + "importance": "standard" }, { "id": "opensearch", "name": "OpenSearch", "description": "Fork d'Elasticsearch, offrant des fonctionnalités de recherche et d'analyse de données distribuées", "links": ["https://opensearch.org/", "https://opensearch.org/docs/"], - "icon": "fas-search" + "icon": "fas-search", + "importance": "standard" } ] } diff --git a/data/skills/design.json b/data/skills/design.json index 879bb6d..31c138f 100644 --- a/data/skills/design.json +++ b/data/skills/design.json @@ -6,21 +6,17 @@ "id": "figma", "name": "Figma", "description": "Outil de design d'interface collaboratif", - "links": [ - "https://www.figma.com/", - "https://help.figma.com/" - ], - "icon": "fab-figma" + "links": ["https://www.figma.com/", "https://help.figma.com/"], + "icon": "fab-figma", + "importance": "standard" }, { "id": "sketch", "name": "Sketch", "description": "Outil de design d'interface pour macOS", - "links": [ - "https://www.sketch.com/", - "https://www.sketch.com/docs/" - ], - "icon": "fab-sketch" + "links": ["https://www.sketch.com/", "https://www.sketch.com/docs/"], + "icon": "fab-sketch", + "importance": "standard" }, { "id": "adobe-xd", @@ -30,17 +26,16 @@ "https://www.adobe.com/products/xd.html", "https://helpx.adobe.com/xd/" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "ux-ui", "name": "UX/UI Design", "description": "Conception d'expérience et d'interface utilisateur", - "links": [ - "https://www.nngroup.com/", - "https://material.io/design/" - ], - "icon": "fas-cog" + "links": ["https://www.nngroup.com/", "https://material.io/design/"], + "icon": "fas-cog", + "importance": "standard" }, { "id": "design-system", @@ -50,17 +45,16 @@ "https://designsystemsrepo.com/", "https://www.designbetter.co/design-systems-handbook" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "majeure" }, { "id": "prototyping", "name": "Prototypage", "description": "Création de prototypes interactifs", - "links": [ - "https://www.prototypr.io/", - "https://www.invisionapp.com/" - ], - "icon": "fas-palette" + "links": ["https://www.prototypr.io/", "https://www.invisionapp.com/"], + "icon": "fas-palette", + "importance": "standard" }, { "id": "user-research", @@ -70,17 +64,16 @@ "https://www.nngroup.com/articles/", "https://www.usability.gov/" ], - "icon": "fas-users" + "icon": "fas-users", + "importance": "standard" }, { "id": "accessibility", "name": "Accessibilité", "description": "Design accessible et inclusive", - "links": [ - "https://www.w3.org/WAI/", - "https://webaim.org/" - ], - "icon": "fas-eye" + "links": ["https://www.w3.org/WAI/", "https://webaim.org/"], + "icon": "fas-eye", + "importance": "majeure" }, { "id": "responsive-design", @@ -90,7 +83,8 @@ "https://developers.google.com/web/fundamentals/design-and-ux/responsive", "https://responsivedesign.is/" ], - "icon": "fas-mobile" + "icon": "fas-mobile", + "importance": "majeure" }, { "id": "motion-design", @@ -100,7 +94,8 @@ "https://material.io/design/motion/", "https://www.framer.com/" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" } ] -} \ No newline at end of file +} diff --git a/data/skills/devops.json b/data/skills/devops.json index 286f2ed..379b184 100644 --- a/data/skills/devops.json +++ b/data/skills/devops.json @@ -11,7 +11,8 @@ "https://docs.docker.com/", "https://github.com/docker/docker-ce" ], - "icon": "fab-docker" + "icon": "fab-docker", + "importance": "incontournable" }, { "id": "kubernetes", @@ -22,7 +23,8 @@ "https://kubernetes.io/docs/", "https://github.com/kubernetes/kubernetes" ], - "icon": "fas-layers" + "icon": "fas-layers", + "importance": "incontournable" }, { "id": "aws", @@ -33,7 +35,8 @@ "https://docs.aws.amazon.com/", "https://github.com/aws" ], - "icon": "fab-aws" + "icon": "fab-aws", + "importance": "standard" }, { "id": "terraform", @@ -44,7 +47,8 @@ "https://learn.hashicorp.com/terraform", "https://github.com/hashicorp/terraform" ], - "icon": "fas-tools" + "icon": "fas-tools", + "importance": "standard" }, { "id": "jenkins", @@ -55,7 +59,8 @@ "https://www.jenkins.io/doc/", "https://github.com/jenkinsci/jenkins" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "githubactions", @@ -66,14 +71,16 @@ "https://docs.github.com/en/actions", "https://github.com/actions" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "ansible", "name": "Ansible", "description": "Outil d'automatisation IT et de gestion de configuration", "links": ["https://www.ansible.com/", "https://docs.ansible.com/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "gitlab-ci", @@ -83,21 +90,24 @@ "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", "https://docs.gitlab.com/ee/ci/" ], - "icon": "fab-gitlab" + "icon": "fab-gitlab", + "importance": "standard" }, { "id": "prometheus", "name": "Prometheus", "description": "Système de monitoring et d'alerting", "links": ["https://prometheus.io/", "https://prometheus.io/docs/"], - "icon": "fas-chart-line" + "icon": "fas-chart-line", + "importance": "majeure" }, { "id": "grafana", "name": "Grafana", "description": "Plateforme de visualisation et monitoring", "links": ["https://grafana.com/", "https://grafana.com/docs/"], - "icon": "fas-chart-line" + "icon": "fas-chart-line", + "importance": "incontournable" }, { "id": "elk-stack", @@ -107,50 +117,56 @@ "https://www.elastic.co/what-is/elk-stack", "https://www.elastic.co/guide/" ], - "icon": "fas-search" + "icon": "fas-search", + "importance": "standard" }, { "id": "nginx", "name": "Nginx", "description": "Serveur web et proxy inverse", "links": ["https://nginx.org/", "https://nginx.org/en/docs/"], - "icon": "fas-server" + "icon": "fas-server", + "importance": "majeure" }, { "id": "apache", "name": "Apache HTTP Server", "description": "Serveur web open source", "links": ["https://httpd.apache.org/", "https://httpd.apache.org/docs/"], - "icon": "fas-server" + "icon": "fas-server", + "importance": "standard" }, { "id": "traefik", "name": "Traefik", "description": "Proxy inverse moderne et load balancer", "links": ["https://traefik.io/", "https://doc.traefik.io/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "helm", "name": "Helm", "description": "Gestionnaire de packages pour Kubernetes", "links": ["https://helm.sh/", "https://helm.sh/docs/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "istio", "name": "Istio", "description": "Service mesh pour microservices", "links": ["https://istio.io/", "https://istio.io/latest/docs/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, - { "id": "consul", "name": "HashiCorp Consul", "description": "Service discovery et configuration", "links": ["https://www.consul.io/", "https://learn.hashicorp.com/consul"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "nomad", @@ -160,29 +176,32 @@ "https://www.nomadproject.io/", "https://learn.hashicorp.com/nomad" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "kong", "name": "Kong", "description": "Gateway API open source pour la gestion, la sécurisation et le monitoring des API avec support de plugins", "links": ["https://konghq.com/", "https://docs.konghq.com/"], - "icon": "fas-door-open" + "icon": "fas-door-open", + "importance": "majeure" }, - { "id": "ceph", "name": "Ceph", "description": "Système de stockage distribué open source offrant des services d'objets, de blocs et de fichiers", "links": ["https://ceph.io/", "https://docs.ceph.com/"], - "icon": "fas-hdd" + "icon": "fas-hdd", + "importance": "majeure" }, { "id": "harbor", "name": "Harbor", "description": "Registre de conteneurs open source pour le stockage et la distribution sécurisée des images Docker", "links": ["https://goharbor.io/", "https://goharbor.io/docs/"], - "icon": "fas-ship" + "icon": "fas-ship", + "importance": "incontournable" }, { "id": "zabbix", @@ -192,7 +211,8 @@ "https://www.zabbix.com/", "https://www.zabbix.com/documentation" ], - "icon": "fas-chart-line" + "icon": "fas-chart-line", + "importance": "standard" }, { "id": "nutanix", @@ -202,14 +222,16 @@ "https://www.nutanix.com/", "https://portal.nutanix.com/page/documents" ], - "icon": "fas-server" + "icon": "fas-server", + "importance": "standard" }, { "id": "backstage", "name": "Backstage", "description": "Plateforme de portail développeur open source pour centraliser la documentation, les services et les outils de développement", "links": ["https://backstage.io/", "https://backstage.io/docs/"], - "icon": "fas-home" + "icon": "fas-home", + "importance": "standard" }, { "id": "cohesity", @@ -219,22 +241,24 @@ "https://www.cohesity.com/", "https://www.cohesity.com/support/" ], - "icon": "fas-database" + "icon": "fas-database", + "importance": "standard" }, - { "id": "sonar", "name": "Sonar", "description": "Plateforme d'analyse statique de code multi-langage pour la détection des bugs, vulnérabilités et code smells", "links": ["https://www.sonarsource.com/", "https://docs.sonarqube.org/"], - "icon": "fas-search" + "icon": "fas-search", + "importance": "majeure" }, { "id": "git", "name": "Git", "description": "Système de contrôle de version distribué pour le suivi des modifications du code source", "links": ["https://git-scm.com/", "https://git-scm.com/doc"], - "icon": "fab-git" + "icon": "fab-git", + "importance": "incontournable" }, { "id": "trivy", @@ -244,30 +268,32 @@ "https://aquasecurity.github.io/trivy/", "https://aquasecurity.github.io/trivy/latest/docs/" ], - "icon": "fas-shield-alt" + "icon": "fas-shield-alt", + "importance": "standard" }, { "id": "checkmarx", "name": "Checkmarx", "description": "Solution d'analyse de sécurité applicative (SAST) pour la détection des vulnérabilités dans le code source", "links": ["https://checkmarx.com/", "https://checkmarx.com/resources/"], - "icon": "fas-shield-alt" + "icon": "fas-shield-alt", + "importance": "standard" }, - { "id": "liquibase", "name": "Liquibase", "description": "Outil de gestion des changements de base de données pour le versioning et le déploiement des schémas", "links": ["https://www.liquibase.org/", "https://docs.liquibase.com/"], - "icon": "fas-database" + "icon": "fas-database", + "importance": "standard" }, - { "id": "puppet", "name": "Puppet", "description": "Plateforme de gestion de configuration et d'automatisation infrastructure permettant le déploiement et la conformité des systèmes", "links": ["https://puppet.com/", "https://puppet.com/docs/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "azure-devops", @@ -277,7 +303,8 @@ "https://azure.microsoft.com/fr-fr/services/devops/server/", "https://docs.microsoft.com/azure/devops/" ], - "icon": "fab-microsoft" + "icon": "fab-microsoft", + "importance": "majeure" }, { "id": "nexus", @@ -287,7 +314,8 @@ "https://www.sonatype.com/products/sonatype-nexus-repository", "https://help.sonatype.com/repomanager3/" ], - "icon": "fas-archive" + "icon": "fas-archive", + "importance": "standard" } ] } diff --git a/data/skills/frontend.json b/data/skills/frontend.json index 1ae21ae..46194dd 100644 --- a/data/skills/frontend.json +++ b/data/skills/frontend.json @@ -11,7 +11,8 @@ "https://react.dev/", "https://react.dev/learn", "https://github.com/facebook/react" - ] + ], + "importance": "incontournable" }, { "id": "vue", @@ -22,7 +23,8 @@ "https://vuejs.org/", "https://vuejs.org/guide/", "https://github.com/vuejs/core" - ] + ], + "importance": "standard" }, { "id": "typescript", @@ -33,7 +35,8 @@ "https://www.typescriptlang.org/", "https://www.typescriptlang.org/docs/", "https://github.com/microsoft/TypeScript" - ] + ], + "importance": "incontournable" }, { "id": "nextjs", @@ -44,7 +47,8 @@ "https://nextjs.org/", "https://nextjs.org/docs", "https://github.com/vercel/next.js" - ] + ], + "importance": "majeure" }, { "id": "tailwindcss", @@ -55,7 +59,8 @@ "https://tailwindcss.com/", "https://tailwindcss.com/docs", "https://github.com/tailwindlabs/tailwindcss" - ] + ], + "importance": "standard" }, { "id": "webpack", @@ -66,78 +71,88 @@ "https://webpack.js.org/", "https://webpack.js.org/concepts/", "https://github.com/webpack/webpack" - ] + ], + "importance": "majeure" }, { "id": "vite", "name": "Vite", "description": "Outil de build rapide pour applications modernes", "icon": "fas-bolt", - "links": ["https://vitejs.dev/", "https://vitejs.dev/guide/"] + "links": ["https://vitejs.dev/", "https://vitejs.dev/guide/"], + "importance": "standard" }, { "id": "svelte", "name": "Svelte", "description": "Framework de compilation pour interfaces utilisateur", "icon": "fas-code", - "links": ["https://svelte.dev/", "https://svelte.dev/docs"] + "links": ["https://svelte.dev/", "https://svelte.dev/docs"], + "importance": "standard" }, { "id": "solidjs", "name": "SolidJS", "description": "Framework JavaScript réactif et performant", "icon": "fas-atom", - "links": ["https://www.solidjs.com/", "https://www.solidjs.com/docs"] + "links": ["https://www.solidjs.com/", "https://www.solidjs.com/docs"], + "importance": "standard" }, { "id": "astro", "name": "Astro", "description": "Framework statique multi-framework", "icon": "fas-rocket", - "links": ["https://astro.build/", "https://docs.astro.build/"] + "links": ["https://astro.build/", "https://docs.astro.build/"], + "importance": "standard" }, { "id": "remix", "name": "Remix", "description": "Framework full-stack centré sur les standards web", "icon": "fas-sync", - "links": ["https://remix.run/", "https://remix.run/docs"] + "links": ["https://remix.run/", "https://remix.run/docs"], + "importance": "standard" }, { "id": "storybook", "name": "Storybook", "description": "Outil de développement pour composants UI", "icon": "fas-book", - "links": ["https://storybook.js.org/", "https://storybook.js.org/docs"] + "links": ["https://storybook.js.org/", "https://storybook.js.org/docs"], + "importance": "majeure" }, - { "id": "playwright", "name": "Playwright", "description": "Framework de tests pour applications web", "icon": "fas-flask", - "links": ["https://playwright.dev/", "https://playwright.dev/docs/"] + "links": ["https://playwright.dev/", "https://playwright.dev/docs/"], + "importance": "standard" }, { "id": "three-js", "name": "Three.js", "description": "Bibliothèque JavaScript pour 3D dans le navigateur", "icon": "fas-cube", - "links": ["https://threejs.org/", "https://threejs.org/docs/"] + "links": ["https://threejs.org/", "https://threejs.org/docs/"], + "importance": "standard" }, { "id": "d3", "name": "D3.js", "description": "Bibliothèque de visualisation de données", "icon": "fas-chart-line", - "links": ["https://d3js.org/", "https://github.com/d3/d3/wiki"] + "links": ["https://d3js.org/", "https://github.com/d3/d3/wiki"], + "importance": "standard" }, { "id": "gsap", "name": "GSAP", "description": "Bibliothèque d'animations web performantes", "icon": "fas-bolt", - "links": ["https://greensock.com/gsap/", "https://greensock.com/docs/"] + "links": ["https://greensock.com/gsap/", "https://greensock.com/docs/"], + "importance": "standard" }, { "id": "web-components", @@ -147,7 +162,8 @@ "links": [ "https://developer.mozilla.org/en-US/docs/Web/Web_Components", "https://web.dev/web-components/" - ] + ], + "importance": "standard" }, { "id": "pwa", @@ -157,7 +173,8 @@ "links": [ "https://web.dev/progressive-web-apps/", "https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" - ] + ], + "importance": "standard" }, { "id": "reactjs", @@ -167,9 +184,9 @@ "links": [ "https://reactjs.org/", "https://reactjs.org/docs/getting-started.html" - ] + ], + "importance": "standard" }, - { "id": "html5-javascript-css", "name": "HTML5/JavaScript/CSS", @@ -178,7 +195,8 @@ "links": [ "https://developer.mozilla.org/fr/", "https://developer.mozilla.org/fr/docs/Web" - ] + ], + "importance": "standard" } ] } diff --git a/data/skills/mobile.json b/data/skills/mobile.json index b630c03..d196833 100644 --- a/data/skills/mobile.json +++ b/data/skills/mobile.json @@ -11,7 +11,8 @@ "https://reactnative.dev/docs/getting-started", "https://github.com/facebook/react-native" ], - "icon": "fab-react" + "icon": "fab-react", + "importance": "standard" }, { "id": "flutter", @@ -22,7 +23,8 @@ "https://docs.flutter.dev/", "https://github.com/flutter/flutter" ], - "icon": "fas-mobile" + "icon": "fas-mobile", + "importance": "standard" }, { "id": "swift", @@ -33,7 +35,8 @@ "https://docs.swift.org/swift-book/", "https://github.com/apple/swift" ], - "icon": "fab-swift" + "icon": "fab-swift", + "importance": "standard" }, { "id": "kotlin", @@ -44,7 +47,8 @@ "https://kotlinlang.org/docs/", "https://github.com/JetBrains/kotlin" ], - "icon": "fab-android" + "icon": "fab-android", + "importance": "standard" }, { "id": "expo", @@ -55,7 +59,8 @@ "https://docs.expo.dev/", "https://github.com/expo/expo" ], - "icon": "fab-react" + "icon": "fab-react", + "importance": "standard" }, { "id": "ionic", @@ -65,7 +70,8 @@ "https://ionicframework.com/", "https://ionicframework.com/docs" ], - "icon": "fas-mobile" + "icon": "fas-mobile", + "importance": "standard" }, { "id": "xamarin", @@ -75,14 +81,19 @@ "https://dotnet.microsoft.com/apps/xamarin", "https://docs.microsoft.com/xamarin/" ], - "icon": "fab-microsoft" + "icon": "fab-microsoft", + "importance": "standard" }, { "id": "unity", "name": "Unity", "description": "Moteur de jeu pour applications mobiles", - "links": ["https://unity.com/", "https://docs.unity3d.com/"], - "icon": "fas-cube" + "links": [ + "https://unity.com/", + "https://docs.unity3d.com/" + ], + "icon": "fas-cube", + "importance": "standard" }, { "id": "cordova", @@ -92,21 +103,30 @@ "https://cordova.apache.org/", "https://cordova.apache.org/docs/" ], - "icon": "fas-mobile" + "icon": "fas-mobile", + "importance": "standard" }, { "id": "capacitor", "name": "Capacitor", "description": "Runtime natif pour applications web", - "links": ["https://capacitorjs.com/", "https://capacitorjs.com/docs"], - "icon": "fas-cog" + "links": [ + "https://capacitorjs.com/", + "https://capacitorjs.com/docs" + ], + "icon": "fas-cog", + "importance": "standard" }, { "id": "fastlane", "name": "Fastlane", "description": "Automatisation pour développement mobile", - "links": ["https://fastlane.tools/", "https://docs.fastlane.tools/"], - "icon": "fas-cog" + "links": [ + "https://fastlane.tools/", + "https://docs.fastlane.tools/" + ], + "icon": "fas-cog", + "importance": "standard" }, { "id": "firebase", @@ -116,7 +136,8 @@ "https://firebase.google.com/", "https://firebase.google.com/docs" ], - "icon": "fab-google" + "icon": "fab-google", + "importance": "standard" }, { "id": "app-store-optimization", @@ -126,14 +147,19 @@ "https://developer.apple.com/app-store/", "https://play.google.com/console/" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "mobile-testing", "name": "Tests Mobile", "description": "Frameworks de tests pour applications mobiles", - "links": ["https://appium.io/", "https://detox.js.org/"], - "icon": "fas-bug" + "links": [ + "https://appium.io/", + "https://detox.js.org/" + ], + "icon": "fas-bug", + "importance": "standard" }, { "id": "mobile-performance", @@ -143,7 +169,8 @@ "https://developers.google.com/web/tools/lighthouse", "https://developer.android.com/topic/performance" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "push-notifications", @@ -153,7 +180,8 @@ "https://firebase.google.com/docs/cloud-messaging", "https://developer.apple.com/notifications/" ], - "icon": "fas-bell" + "icon": "fas-bell", + "importance": "standard" } ] -} +} \ No newline at end of file diff --git a/data/skills/security.json b/data/skills/security.json index 701893a..3dc1abf 100644 --- a/data/skills/security.json +++ b/data/skills/security.json @@ -7,14 +7,16 @@ "name": "OAuth 2.0", "description": "Framework d'autorisation pour APIs", "links": ["https://oauth.net/2/", "https://tools.ietf.org/html/rfc6749"], - "icon": "fas-key" + "icon": "fas-key", + "importance": "standard" }, { "id": "jwt", "name": "JSON Web Tokens", "description": "Standard pour transmettre des informations de façon sécurisée", "links": ["https://jwt.io/", "https://tools.ietf.org/html/rfc7519"], - "icon": "fas-shield" + "icon": "fas-shield", + "importance": "standard" }, { "id": "https-ssl", @@ -24,14 +26,16 @@ "https://developer.mozilla.org/en-US/docs/Web/Security", "https://letsencrypt.org/" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "owasp", "name": "OWASP", "description": "Bonnes pratiques de sécurité des applications web", "links": ["https://owasp.org/", "https://owasp.org/www-project-top-ten/"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "csrf-xss", @@ -41,7 +45,8 @@ "https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html", "https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "penetration-testing", @@ -51,7 +56,8 @@ "https://owasp.org/www-community/Penetration_Testing_Methodologies", "https://www.kali.org/" ], - "icon": "fas-user-shield" + "icon": "fas-user-shield", + "importance": "standard" }, { "id": "cryptography", @@ -61,14 +67,16 @@ "https://cryptography.io/", "https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "auth0", "name": "Auth0", "description": "Plateforme d'authentification et d'autorisation", "links": ["https://auth0.com/", "https://auth0.com/docs"], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "standard" }, { "id": "keycloak", @@ -78,7 +86,8 @@ "https://www.keycloak.org/", "https://www.keycloak.org/documentation" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "incontournable" }, { "id": "vault", @@ -88,7 +97,8 @@ "https://www.vaultproject.io/", "https://learn.hashicorp.com/vault" ], - "icon": "fas-cog" + "icon": "fas-cog", + "importance": "incontournable" }, { "id": "sentinelone", @@ -98,7 +108,8 @@ "https://www.sentinelone.com/", "https://docs.sentinelone.com/" ], - "icon": "fas-shield-alt" + "icon": "fas-shield-alt", + "importance": "standard" }, { "id": "forescout", @@ -108,7 +119,8 @@ "https://www.forescout.com/", "https://www.forescout.com/support/" ], - "icon": "fas-network-wired" + "icon": "fas-network-wired", + "importance": "standard" } ] } diff --git a/data/skills/testing.json b/data/skills/testing.json index 9fd2d83..2a6b9e4 100644 --- a/data/skills/testing.json +++ b/data/skills/testing.json @@ -10,21 +10,24 @@ "https://www.selenium.dev/", "https://www.selenium.dev/documentation/" ], - "icon": "fas-bug" + "icon": "fas-bug", + "importance": "standard" }, { "id": "cypress", "name": "Cypress", "description": "Framework de test JS end-to-end moderne pour les applications web avec interface de développement intégrée", "links": ["https://www.cypress.io/", "https://docs.cypress.io/"], - "icon": "fas-bug" + "icon": "fas-bug", + "importance": "standard" }, { "id": "k6", "name": "K6", "description": "Outil de test de charge open source en JS pour la performance et le stress testing des applications", "links": ["https://k6.io/", "https://k6.io/docs/"], - "icon": "fas-tachometer-alt" + "icon": "fas-tachometer-alt", + "importance": "standard" }, { "id": "jmeter", @@ -34,7 +37,8 @@ "https://jmeter.apache.org/", "https://jmeter.apache.org/usermanual/" ], - "icon": "fas-chart-line" + "icon": "fas-chart-line", + "importance": "standard" }, { "id": "robot-framework", @@ -44,7 +48,8 @@ "https://robotframework.org/", "https://robotframework.org/robotframework/" ], - "icon": "fas-robot" + "icon": "fas-robot", + "importance": "majeure" }, { "id": "mutation-testing", @@ -54,7 +59,8 @@ "https://en.wikipedia.org/wiki/Mutation_testing", "https://stryker-mutator.io/docs/mutation-testing-elements/what-is-mutation-testing" ], - "icon": "fas-dna" + "icon": "fas-dna", + "importance": "majeure" }, { "id": "stryker", @@ -64,14 +70,16 @@ "https://stryker-mutator.io/", "https://stryker-mutator.io/docs/" ], - "icon": "fas-bug" + "icon": "fas-bug", + "importance": "majeure" }, { "id": "pitest", "name": "Pitest", "description": "Framework de tests de mutation pour Java et JVM", "links": ["https://pitest.org/", "https://pitest.org/quickstart/"], - "icon": "fab-java" + "icon": "fab-java", + "importance": "majeure" }, { "id": "pytest-mutmut", @@ -81,7 +89,8 @@ "https://github.com/boxed/mutmut", "https://mutmut.readthedocs.io/" ], - "icon": "fab-python" + "icon": "fab-python", + "importance": "standard" } ] } diff --git a/scripts/sync-skills.ts b/scripts/sync-skills.ts index f0e0864..456a18b 100644 --- a/scripts/sync-skills.ts +++ b/scripts/sync-skills.ts @@ -85,6 +85,7 @@ async function syncSkillsToDatabase(): Promise { const needsUpdate = existingSkill ? existingSkill.description !== skillFromFile.description || existingSkill.icon !== skillFromFile.icon || + existingSkill.importance !== skillFromFile.importance || JSON.stringify(existingSkill.links?.sort()) !== JSON.stringify(skillFromFile.links?.sort()) : true; diff --git a/services/skills-service.ts b/services/skills-service.ts index 86e8a17..4f948ac 100644 --- a/services/skills-service.ts +++ b/services/skills-service.ts @@ -63,6 +63,7 @@ export class SkillsService { s.name, s.description, s.icon, + s.importance, COALESCE( json_agg(sl.url ORDER BY sl.id) FILTER (WHERE sl.url IS NOT NULL), '[]'::json @@ -70,7 +71,7 @@ export class SkillsService { FROM skills s LEFT JOIN skill_links sl ON s.id = sl.skill_id WHERE s.category_id = $1 - GROUP BY s.id, s.name, s.description, s.icon + GROUP BY s.id, s.name, s.description, s.icon, s.importance ORDER BY s.name `; @@ -81,6 +82,7 @@ export class SkillsService { name: row.name, description: row.description, icon: row.icon, + importance: row.importance, links: row.links, })); } catch (error) { @@ -121,6 +123,7 @@ export class SkillsService { icon?: string; categoryId: string; links: string[]; + importance?: string; }): Promise { const pool = getPool(); const client = await pool.connect(); @@ -130,8 +133,8 @@ export class SkillsService { // Insert skill const skillQuery = ` - INSERT INTO skills (id, name, description, icon, category_id) - VALUES ($1, $2, $3, $4, $5) + INSERT INTO skills (id, name, description, icon, category_id, importance) + VALUES ($1, $2, $3, $4, $5, $6) `; await client.query(skillQuery, [ skill.id, @@ -139,6 +142,7 @@ export class SkillsService { skill.description, skill.icon, skill.categoryId, + skill.importance || "standard", ]); // Insert links @@ -194,13 +198,14 @@ export class SkillsService { // Insert skills for (const skill of categoryData.skills) { const skillQuery = ` - INSERT INTO skills (id, name, description, icon, category_id) - VALUES ($1, $2, $3, $4, $5) + INSERT INTO skills (id, name, description, icon, category_id, importance) + VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, icon = EXCLUDED.icon, - category_id = EXCLUDED.category_id + category_id = EXCLUDED.category_id, + importance = EXCLUDED.importance `; await client.query(skillQuery, [ skill.id, @@ -208,6 +213,7 @@ export class SkillsService { skill.description, skill.icon, categoryId, + skill.importance || "standard", ]); // Delete existing links @@ -324,6 +330,7 @@ export class SkillsService { categoryId: string; description?: string; icon?: string; + importance?: string; }): Promise<{ id: string; name: string; @@ -332,6 +339,7 @@ export class SkillsService { categoryId: string; category: string; usageCount: number; + importance: string; }> { const pool = getPool(); const client = await pool.connect(); @@ -351,10 +359,16 @@ export class SkillsService { // Créer la nouvelle skill const result = await client.query( - `INSERT INTO skills (id, name, category_id, description, icon) - VALUES (gen_random_uuid(), $1, $2, $3, $4) - RETURNING id, name, description, icon, category_id`, - [data.name, data.categoryId, data.description || "", data.icon || ""] + `INSERT INTO skills (id, name, category_id, description, icon, importance) + VALUES (gen_random_uuid(), $1, $2, $3, $4, $5) + RETURNING id, name, description, icon, category_id, importance`, + [ + data.name, + data.categoryId, + data.description || "", + data.icon || "", + data.importance || "standard", + ] ); const newSkill = result.rows[0]; @@ -375,6 +389,7 @@ export class SkillsService { categoryId: newSkill.category_id, category: categoryResult.rows[0]?.name || "Inconnue", usageCount: 0, + importance: newSkill.importance, }; } catch (error) { await client.query("ROLLBACK"); @@ -393,6 +408,7 @@ export class SkillsService { categoryId: string; description?: string; icon?: string; + importance?: string; }): Promise<{ id: string; name: string; @@ -400,6 +416,7 @@ export class SkillsService { icon: string; categoryId: string; category: string; + importance: string; }> { const pool = getPool(); const client = await pool.connect(); @@ -430,20 +447,21 @@ export class SkillsService { // Mettre à jour la skill await client.query( `UPDATE skills - SET name = $1, category_id = $2, description = $3, icon = $4 - WHERE id = $5`, + SET name = $1, category_id = $2, description = $3, icon = $4, importance = $5 + WHERE id = $6`, [ data.name, data.categoryId, data.description || "", data.icon || "", + data.importance || "standard", data.id, ] ); // Récupérer la skill mise à jour const result = await client.query( - `SELECT s.id, s.name, s.description, s.icon, s.category_id, sc.name as category_name + `SELECT s.id, s.name, s.description, s.icon, s.category_id, sc.name as category_name, s.importance FROM skills s LEFT JOIN skill_categories sc ON s.category_id = sc.id WHERE s.id = $1`, @@ -460,6 +478,7 @@ export class SkillsService { icon: skill.icon, categoryId: skill.category_id, category: skill.category_name, + importance: skill.importance, }; } catch (error) { await client.query("ROLLBACK"); @@ -503,4 +522,4 @@ export class SkillsService { client.release(); } } -} +} \ No newline at end of file