Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* Copyright ou © ou Copr. Université de Lorraine, (2022)
*
* Direction du Numérique de l'Université de Lorraine - SIED
* ([email protected])
*
* Ce logiciel est un programme informatique servant à rendre accessible
* sur mobile divers services universitaires aux étudiants et aux personnels
* de l'université.
*
* Ce logiciel est régi par la licence CeCILL 2.1, soumise au droit français
* et respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et INRIA
* sur le site "http://cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* À cet égard, l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et à tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et/ou de leurs données et, plus généralement,
* à l'utiliser et à l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL 2.1, et que vous en avez accepté les
* termes.
*/

import { Field, ObjectType } from '@nestjs/graphql';
import { KnowledgeBaseTranslationsWordpress } from '@wordpress/collections/translations/translations.wordpress.model';
import { ImageWordpress } from '@wordpress/collections/system/image.wordpress.model';

@ObjectType()
class KnowledgeBaseParentWordpress {
@Field()
databaseId: number;
}

@ObjectType()
class KnowledgeBaseParentNodeWordpress {
@Field(() => KnowledgeBaseParentWordpress)
node: KnowledgeBaseParentWordpress;
}

@ObjectType()
class KnowledgeBaseImageNodeWordpress {
@Field(() => ImageWordpress)
node: ImageWordpress;
}

@ObjectType()
export class KnowledgeBaseWordpress {
@Field()
databaseId: number;

@Field()
informationTitle: string;

@Field()
informationContent: string;

@Field()
informationSearchKeywords: string;

@Field()
informationType: 'content' | 'internal_link' | 'external_link';

@Field()
informationChildDisplay: 'card' | 'list';

@Field()
informationLink: string;

@Field()
informationPosition: number;

@Field(() => [KnowledgeBaseTranslationsWordpress])
translations: KnowledgeBaseTranslationsWordpress[];

@Field(() => KnowledgeBaseParentNodeWordpress, { nullable: true })
informationParent: KnowledgeBaseParentNodeWordpress | null;

@Field(() => KnowledgeBaseImageNodeWordpress, { nullable: true })
informationCoverImage: KnowledgeBaseImageNodeWordpress | null;

@Field()
informationPhone: string;

@Field()
informationAddress: string;

@Field()
informationEmail: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
* Copyright ou © ou Copr. Université de Lorraine, (2022)
*
* Direction du Numérique de l'Université de Lorraine - SIED
* ([email protected])
* JNESIS ([email protected])
* ([email protected])
*
* Ce logiciel est un programme informatique servant à rendre accessible
* sur mobile divers services universitaires aux étudiants et aux personnels
Expand Down Expand Up @@ -37,10 +36,13 @@
* termes.
*/

const express = require('express');
const router = express.Router();
const { knowledgeBaseData } = require('./knowledge-base.mock');
import { forwardRef, Module } from '@nestjs/common';
import { KnowledgeBaseWordpressResolver } from './knowledge-base.wordpress.resolver';
import { KnowledgeBaseWordpressService } from './knowledge-base.wordpress.service';
import { WordpressModule } from '@wordpress/wordpress.module';

router.get('/', (req, res) => res.json(knowledgeBaseData));

module.exports = router;
@Module({
imports: [forwardRef(() => WordpressModule)],
providers: [KnowledgeBaseWordpressResolver, KnowledgeBaseWordpressService],
})
export class KnowledgeBaseWordpressModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright ou © ou Copr. Université de Lorraine, (2022)
*
* Direction du Numérique de l'Université de Lorraine - SIED
* ([email protected])
*
* Ce logiciel est un programme informatique servant à rendre accessible
* sur mobile divers services universitaires aux étudiants et aux personnels
* de l'université.
*
* Ce logiciel est régi par la licence CeCILL 2.1, soumise au droit français
* et respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et INRIA
* sur le site "http://cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* À cet égard, l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et à tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et/ou de leurs données et, plus généralement,
* à l'utiliser et à l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL 2.1, et que vous en avez accepté les
* termes.
*/

import { Query, Resolver } from '@nestjs/graphql';
import { KnowledgeBaseWordpressService } from './knowledge-base.wordpress.service';
import { KnowledgeBase } from '@common/models/knowledge-base.model';

@Resolver(() => KnowledgeBase)
export class KnowledgeBaseWordpressResolver {
constructor(
private readonly knowledgeServiceService: KnowledgeBaseWordpressService,
) {}

// Définition de la requête GraphQL qui sera exécutée depuis le backend de Multi
@Query(() => [KnowledgeBase], { name: 'knowledgeBase' })
async getKnowledgeBase(): Promise<KnowledgeBase[]> {
return this.knowledgeServiceService.getKnowledgeBase();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
* Copyright ou © ou Copr. Université de Lorraine, (2022)
*
* Direction du Numérique de l'Université de Lorraine - SIED
* ([email protected])
*
* Ce logiciel est un programme informatique servant à rendre accessible
* sur mobile divers services universitaires aux étudiants et aux personnels
* de l'université.
*
* Ce logiciel est régi par la licence CeCILL 2.1, soumise au droit français
* et respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et INRIA
* sur le site "http://cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* À cet égard, l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et à tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et/ou de leurs données et, plus généralement,
* à l'utiliser et à l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL 2.1, et que vous en avez accepté les
* termes.
*/

import { Injectable } from '@nestjs/common';
import { WordpressService } from '@wordpress/wordpress.service';
import { KnowledgeBaseTranslations } from '@common/models/translations.model';
import { KnowledgeBaseTranslationsWordpress } from '@wordpress/collections/translations/translations.wordpress.model';
import { ValidateMapping } from '@common/decorators/validate-mapping.decorator';
import { KnowledgeBaseSchema } from '@common/validation/schemas/knowledge-base.schema';
import { normalizeEmptyStringToNull } from '@common/utils/normalize';
import { KnowledgeBaseWordpress } from '@wordpress/collections/knowledge-base/knowledge-base.wordpress.model';
import { KnowledgeBase } from '@common/models/knowledge-base.model';

// TODO: Move FRENCH_CODE to .env and rename it to DEFAULT_LANGUAGE_CODE
const FRENCH_CODE = 'FR';

@Injectable()
export class KnowledgeBaseWordpressService {
constructor(private readonly wordpressService: WordpressService) {}

@ValidateMapping({ schema: KnowledgeBaseSchema })
private mapToMultiModel(
knowledgeBase: KnowledgeBaseWordpress,
): KnowledgeBase {
const frTranslation: KnowledgeBaseTranslations = {
languagesCode: FRENCH_CODE.toLowerCase(),
title: knowledgeBase.informationTitle,
content: knowledgeBase.informationContent,
searchKeywords:
knowledgeBase.informationSearchKeywords &&
knowledgeBase.informationSearchKeywords?.trim() !== ''
? knowledgeBase.informationSearchKeywords
.split(',')
.filter((keyword) => keyword.trim() !== '')
: null,
};

const translations: KnowledgeBaseTranslations[] = [
frTranslation,
...(knowledgeBase.translations?.map(
(translation: KnowledgeBaseTranslationsWordpress) => ({
languagesCode: translation.language.code.toLowerCase(),
title: translation.informationTitle,
content: translation.informationContent,
searchKeywords:
translation.informationSearchKeywords &&
translation.informationSearchKeywords?.trim() !== ''
? translation.informationSearchKeywords
.split(',')
.filter((keyword) => keyword.trim() !== '')
: null,
}),
) || []),
];

return {
id: knowledgeBase.databaseId.toString(),
type: knowledgeBase.informationType,
childDisplay: knowledgeBase.informationChildDisplay || null,
link: normalizeEmptyStringToNull(knowledgeBase.informationLink),
position: knowledgeBase.informationPosition || 0,
translations,
parentId:
knowledgeBase.informationParent?.node?.databaseId?.toString() || null,
coverImage: normalizeEmptyStringToNull(
knowledgeBase.informationCoverImage?.node.mediaItemUrl.toString(),
),
phone: normalizeEmptyStringToNull(knowledgeBase.informationPhone),
address: normalizeEmptyStringToNull(knowledgeBase.informationAddress),
email: normalizeEmptyStringToNull(knowledgeBase.informationEmail),
};
}

async getKnowledgeBase(): Promise<KnowledgeBase[]> {
const data = await this.wordpressService.executeGraphQLQuery(`
query {
knowledgeBases(first: 100, where: {language: ${FRENCH_CODE}}) {
nodes {
databaseId
informationTitle
informationContent
informationType
informationChildDisplay
informationLink
informationPosition
informationSearchKeywords
informationPhone
informationAddress
informationEmail
informationCoverImage {
node {
databaseId
sourceUrl
mediaItemUrl
altText
}
}
informationParent {
node {
databaseId
informationTitle
informationContent
}
}
translations {
databaseId
language {
code
name
locale
}
informationTitle
informationContent
informationSearchKeywords
}
}
}
}
`);
return data.knowledgeBases.nodes.map(this.mapToMultiModel);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,15 @@ export class WidgetsTranslationsWordpress extends BaseTranslationsWordpress {
@Field()
widgetTitle: string;
}

@ObjectType()
export class KnowledgeBaseTranslationsWordpress extends BaseTranslationsWordpress {
@Field()
informationContent: string;

@Field()
informationTitle: string;

@Field()
informationSearchKeywords: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import { LanguagesWordpressModule } from '@wordpress/collections/languages/langu
import { LoginWordpressModule } from '@wordpress/collections/login/login.wordpress.module';
import { StaticPagesWordpressModule } from '@wordpress/collections/static-pages/static-pages.wordpress.module';
import { WidgetsWordpressModule } from '@wordpress/collections/widgets/widgets.wordpress.module';
import { KnowledgeBaseWordpressModule } from '@wordpress/collections/knowledge-base/knowledge-base.wordpress.module';

@Module({
providers: [WordpressService],
Expand All @@ -62,6 +63,7 @@ import { WidgetsWordpressModule } from '@wordpress/collections/widgets/widgets.w
StaticPagesWordpressModule,
SocialNetworksWordpressModule,
WidgetsWordpressModule,
KnowledgeBaseWordpressModule,
],
exports: [
ChannelsWordpressModule,
Expand All @@ -74,6 +76,7 @@ import { WidgetsWordpressModule } from '@wordpress/collections/widgets/widgets.w
StaticPagesWordpressModule,
SocialNetworksWordpressModule,
WidgetsWordpressModule,
KnowledgeBaseWordpressModule,
],
})
export class WordpressModule {}
Loading