diff --git a/README.md b/README.md index d15aed9..1a3528c 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,98 @@ const { getDairaByBaladyiaName } = require('@dzcode-io/leblad'); console.log(getDairaByBaladyiaName('ES SENIA')); // will print the daira object ({name: "ES SENIA"...}) ``` +#### getBaladiyaByCodeAndDairaCodeAndWilayaCode(mattricule:number, code: number, bcode:number, projection?: string[]) + +Takes a Wialya code , Daira code and Baladyia code and returns a baladiya. + +**Arguments** + +- `mattricule: number` (**required**) the Wilaya id +- `code: number` (**required**) the Daira id +- `bcode: number` (**required**) the Baladiya id +- `projection: string[]` (optional) Array of Wilaya Object attributes + +**Examples** + +```javascript +const { getBaladiyaByCodeAndDairaCodeAndWilayaCode } = require('@dzcode-io/leblad'); + +console.log(getBaladiyaByCodeAndDairaCodeAndWilayaCode(1, 101, 101)); // will print the daira object ({name: "ADRAR"...}) +``` + +#### getBaladiyaByCodeAndDairaCodeAndWilayaCode(mattricule:number, code: number, bcode:number, projection?: string[]) + +Takes a Wialya mattricule , Daira code and Baladyia code and returns a baladiya. + +**Arguments** + +- `mattricule: number` (**required**) the Wilaya id +- `code: number` (**required**) the Daira id +- `bcode: number` (**required**) the Baladiya id +- `projection: string[]` (optional) Array of Wilaya Object attributes + +**Examples** + +```javascript +const { getBaladiyaByCodeAndDairaCodeAndWilayaCode } = require('@dzcode-io/leblad'); + +console.log(getBaladiyaByCodeAndDairaCodeAndWilayaCode(1, 101, 101)); // will print the baladiya object ({name: "ADRAR"...}) +``` + +#### getBaldiyaByCodeForWilaya(mattricule:number, code: number, projection?: string[]) + +Takes a Wialya mattricule, Baladyia code and returns a baladiya. + +**Arguments** + +- `mattricule: number` (**required**) the Wilaya id +- `code: number` (**required**) the Baladiya id +- `projection: string[]` (optional) Array of Baladiya Object attributes + +**Examples** + +```javascript +const { getBaldiyaByCodeForWilaya } = require('@dzcode-io/leblad'); + +console.log(getBaldiyaByCodeForWilaya(1, 121)); // will print the baldiya object ({name: "OULED AHMED TIMMI"...}) +``` + +#### getBaldiyatsForDairaByCodeForWilayaByCode(mattricule:number, code: number, projection?: string[]) + +Takes a Wialya mattricule and Daira code and returns a list of baladiyats. + +**Arguments** + +- `mattricule: number` (**required**) the Wilaya id +- `code: number` (**required**) the Daira id +- `projection: string[]` (optional) Array of Baladiya Object attributes + +**Examples** + +```javascript +const { getBaldiyatsForDairaByCodeForWilayaByCode } = require('@dzcode-io/leblad'); + +console.log(getBaldiyatsForDairaByCodeForWilayaByCode(1, 101)); // will print the list of baldiyats ([{name: "OULED AHMED TIMMI"...}, {....} , {....} ...]) +``` + +#### getDairaByCodeAndWilayaCode(mattricule:number, code: number, projection?: string[]) + +Takes a Wialya mattricule and Daira code and returns a daira. + +**Arguments** + +- `mattricule: number` (**required**) the Wilaya id +- `code: number` (**required**) the Daira id +- `projection: string[]` (optional) Array of Daira Object attributes + +**Examples** + +```javascript +const { getDairaByCodeAndWilayaCode } = require('@dzcode-io/leblad'); + +console.log(getDairaByCodeAndWilayaCode (1, 103)); // will print the daira object ({name: "CHAROUINE"...},) +``` + ## Helper methods #### projectObject(data: (object|array), projection?: string[]) diff --git a/src/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.js b/src/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.js new file mode 100644 index 0000000..a410731 --- /dev/null +++ b/src/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.js @@ -0,0 +1,31 @@ +const projectBaladiya = require('../utils/projections/projectObject'); + +const getBaladiyaByCodeAndDairaCodeAndWilayaCode = (data) => +/** + * Takes a wilaya mattricule ,a daira code , bladiya code and return the baladyia. + * + * @example Get a baladiya by code, daira code, and wilaya mattricule(mattricule:1, code:101, bcode:101) + * + * //returns {name : "ADRAR"} + * getWilayaByBaladyiaName(1, 101,101) + * + * @param { integer } mattricule wilaya mattricule + * @param { integer } code daira code + * @param { integer } bcode baladiya code + * @param { String[] } projection a list of Baladyia object attributes to keep + * @returns { Object | null } Returns a baldiya's object, or null + */ + (mattricule, code, bcode, projection)=>{ + const wilaya = data.find((w) => w.mattricule === mattricule); + if (wilaya) { + const daira = wilaya.dairats.find((d)=> d.code === code); + if( daira){ + const baladiya = daira.baladyiats.find((b)=> b.code === bcode); + return projectBaladiya(baladiya, projection); + } + + } + return null; + }; + +module.exports = getBaladiyaByCodeAndDairaCodeAndWilayaCode; \ No newline at end of file diff --git a/src/api/getBaldiyaByCodeForWilaya.js b/src/api/getBaldiyaByCodeForWilaya.js new file mode 100644 index 0000000..9762ecd --- /dev/null +++ b/src/api/getBaldiyaByCodeForWilaya.js @@ -0,0 +1,38 @@ +const projectBaladiya = require('../utils/projections/projectObject'); + +const getBaldiyaByCodeForWilaya = (data) => +/** + * Takes a wilaya code (mattricule) and a baladiya code and return a baladiya + * + * @example Get the baladiya of adrar in adrara(mattricule:1 ,code: 101) + * + * + * getBaldiyaByCodeForWilaya(1, 101) + * + * @param { Number } mattricule wilaya code (mattricule) + * @param { Number } code baladiya code (code) + * @param { String[] } projection a list of Baladyia object attributes to keep + * @returns { Object[] | null } get baladiya's object + */ + + (mattricule, code, projections) => { + const wilaya = data.find((w) => w.mattricule === mattricule); + if (wilaya) { + const baladyiats = wilaya.dairats.reduce( + (acc, daira) => [...acc, ...daira.baladyiats], + [], + ); + + const baladiya = baladyiats.find((w)=> w.code === code); + if (baladiya){ + return projectBaladiya(baladiya, projections); + } + + + } + + + return null; + }; + +module.exports = getBaldiyaByCodeForWilaya; diff --git a/src/api/getBaldiyatsForDairaByCodeForWilayaByCode.js b/src/api/getBaldiyatsForDairaByCodeForWilayaByCode.js new file mode 100644 index 0000000..87e8f1f --- /dev/null +++ b/src/api/getBaldiyatsForDairaByCodeForWilayaByCode.js @@ -0,0 +1,31 @@ +const projectBaladiya = require('../utils/projections/projectObject'); + +const getBaldiyatsForDairaByCodeForWilayaByCode = (data) => +/** + * Takes a wilaya code (mattricule), daira code (code) and returns array of Baladiyates of wilaya. + * + * @example Get Baladiyats list of adrar daira in adrar wilaya (mattricule:1 ,code: 101) + * + * + * getBaldiyatsForDairaByCodeForWilayaByCode(1, 101) + * + * @param { Number } mattricule wilaya code (mattricule) + * @param { Number } code baladiya code (code) + * @param { String[] } projections a list of Baladyia object attributes to keep + * @returns { Object[] | null } list of all baladiyas for wilaya + */ + + (mattricule, code, projections) => { + const wilaya = data.find((w) => w.mattricule === mattricule); + if (wilaya) { + const daira = wilaya.dairats.find((d) => d.code === code); + + if(daira){ + return projectBaladiya(daira.baladyiats, projections); + } + + } + return null; + }; + +module.exports = getBaldiyatsForDairaByCodeForWilayaByCode; diff --git a/src/api/getDairaByCodeAndWilayaCode.js b/src/api/getDairaByCodeAndWilayaCode.js new file mode 100644 index 0000000..d10917a --- /dev/null +++ b/src/api/getDairaByCodeAndWilayaCode.js @@ -0,0 +1,26 @@ +const projectDaira = require('../utils/projections/projectObject'); + +const getDairaByCodeAndWilayaCode = (data)=> +/** + * Takes a wilaya mattricule and a daira code and return daira. + * + * @example Get a daira by code and wilaya mattricule(mattricule:1, code:101) + * + * //returns {name : "ADRAR"} + * getWilayaByBaladyiaName(1, 101) + * + * @param { integer } mattricule wilaya mattricule + * @param { integer } code daira code + * @param { String[] } projection a list of Baladyia object attributes to keep + * @returns { Object | null } Returns daira's object, or null + */ + (mattricule, code, projection)=>{ + const wilaya = data.find((w) => w.mattricule === mattricule); + if (wilaya) { + const daira = wilaya.dairats.find((d)=> d.code === code); + return projectDaira(daira, projection); + } + return null; + }; + +module.exports = getDairaByCodeAndWilayaCode; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 706adad..8def2a7 100644 --- a/src/index.js +++ b/src/index.js @@ -16,7 +16,10 @@ const getBaladyiatsForWilaya = require('./api/getBaladyiatsForWilaya'); const getBaladyiatsForDaira = require('./api/getBaladyiatsForDaira'); const getWilayaByBaladyiaName = require('./api/getWilayaByBaladyiaName'); const getDairaByBaladyiaName = require('./api/getDairaByBaladyiaName'); - +const getDairaByCodeAndWilayaCode = require('./api/getDairaByCodeAndWilayaCode'); +const getBaladiyaByCodeAndDairaCodeAndWilayaCode = require('./api/getBaladiyaByCodeAndDairaCodeAndWilayaCode'); +const getBaldiyatsForDairaByCodeForWilayaByCode = require('./api/getBaldiyatsForDairaByCodeForWilayaByCode'); +const getBaldiyaByCodeForWilaya = require('./api/getBaldiyaByCodeForWilaya'); const data = require('../data/WilayaList.json'); const _getData = () => [...data]; @@ -35,6 +38,10 @@ module.exports = { getBaladyiatsForDaira: getBaladyiatsForDaira(_getData()), getWilayaByBaladyiaName: getWilayaByBaladyiaName(_getData()), getDairaByBaladyiaName: getDairaByBaladyiaName(_getData()), + getDairaByCodeAndWilayaCode: getDairaByCodeAndWilayaCode(_getData()), + getBaladiyaByCodeAndDairaCodeAndWilayaCode: getBaladiyaByCodeAndDairaCodeAndWilayaCode(_getData()), + getBaldiyatsForDairaByCodeForWilayaByCode: getBaldiyatsForDairaByCodeForWilayaByCode(_getData()), + getBaldiyaByCodeForWilaya: getBaldiyaByCodeForWilaya(_getData()), utils: { projectObject, isValidWilayaCode, diff --git a/tests/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.test.js b/tests/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.test.js new file mode 100644 index 0000000..c40b658 --- /dev/null +++ b/tests/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode.test.js @@ -0,0 +1,72 @@ +describe('get matching daira by code and wilaya mattricule', ()=>{ + const mockData = [ + { + mattricule: 47, + name: 'Ghardaïa', + dairats: [ + { + code: 4701, + name: 'GHARDAIA', + name_ar: 'غرداية', + name_en: 'GHARDAIA', + baladyiats: [ + { + code: 4701, + name: 'GHARDAIA', + name_en: 'GHARDAIA', + name_ar: 'غرداية', + }, + { + code: 4702, + name: 'EL MENIAA', + name_en: 'EL MENIAA', + name_ar: 'المنيعة', + }, + ], + }, + ], + }, + ]; + + + + let getBaladiyaByCodeAndDairaCodeAndWilayaCode; + beforeEach(()=>{ + getBaladiyaByCodeAndDairaCodeAndWilayaCode = require('../../src/api/getBaladiyaByCodeAndDairaCodeAndWilayaCode'); + }); + + it('should export a function', () => { + expect(typeof getBaladiyaByCodeAndDairaCodeAndWilayaCode).toBe('function'); + }); + + it('should return a curried function that returns the data', () => { + const fn = getBaladiyaByCodeAndDairaCodeAndWilayaCode(mockData); + + expect(typeof fn).toBe('function'); + }); + + it('should return null for invalid wilaya mattricule and baladiya and daira code ', () => { + const result = getBaladiyaByCodeAndDairaCodeAndWilayaCode(mockData)(99, 1, 99); + + expect(result).toBeNull(); + }); + + it('should return null for invalid baladiya and daira code ', () => { + const result = getBaladiyaByCodeAndDairaCodeAndWilayaCode(mockData)(47, 88, 99); + + expect(result).toBeNull(); + }); + + + it('should return null for invalid baladiya code ', () => { + const result = getBaladiyaByCodeAndDairaCodeAndWilayaCode(mockData)(47, 4701, 99); + + expect(result).toBeNull(); + }); + + it('should return a matching baldiya for valide wilaya mattricule, baladiya and daira code ', () => { + const result = getBaladiyaByCodeAndDairaCodeAndWilayaCode(mockData)(47, 4701, 4702); + expect(result).toEqual(mockData[0].dairats[0].baladyiats[1]); + }); + +}); \ No newline at end of file diff --git a/tests/api/getBaldiyaByCodeForWilaya.test.js b/tests/api/getBaldiyaByCodeForWilaya.test.js new file mode 100644 index 0000000..674ac2a --- /dev/null +++ b/tests/api/getBaldiyaByCodeForWilaya.test.js @@ -0,0 +1,91 @@ +describe('get matching baldiyats by daira code and wilaya mattricule', ()=>{ + const mockData = [ + { + mattricule: 47, + name: 'Ghardaïa', + dairats: [ + { + code: 4701, + name: 'GHARDAIA', + name_ar: 'غرداية', + name_en: 'GHARDAIA', + baladyiats: [ + { + code: 4701, + name: 'GHARDAIA', + name_en: 'GHARDAIA', + name_ar: 'غرداية', + }, + { + code: 4702, + name: 'EL MENIAA', + name_en: 'EL MENIAA', + name_ar: 'المنيعة', + }, + ], + }, + ], + }, + ]; + + const mockDataNoBaladiyats = [ + { + mattricule: 47, + name: 'Ghardaïa', + dairats: [ + { + code: 4701, + name: 'GHARDAIA', + name_ar: 'غرداية', + name_en: 'GHARDAIA', + baladyiats: [ + + ], + }, + ], + }, + ]; + let getBaldiyaByCodeForWilaya; + + beforeEach(()=>{ + getBaldiyaByCodeForWilaya = require('../../src/api/getBaldiyaByCodeForWilaya'); + }); + + + + it('should export a function', () => { + expect(typeof getBaldiyaByCodeForWilaya).toBe('function'); + }); + + it('should return a curried function that returns the data', () => { + const fn = getBaldiyaByCodeForWilaya(mockData); + + expect(typeof fn).toBe('function'); + }); + + it('should return null for invalid wilaya mattricule and baldiya code ', () => { + const result = getBaldiyaByCodeForWilaya(mockData)(99, 1); + + expect(result).toBeNull(); + }); + + it('should return null for invalid baldiya code ', () => { + const result = getBaldiyaByCodeForWilaya(mockData)(47, 22); + + expect(result).toBeNull(); + }); + + + it('should return a matching baldiya for a valide baladiya code and wilaya mattricule ', () => { + const result =getBaldiyaByCodeForWilaya(mockData)(47, 4702); + + expect(result).toEqual(mockData[0].dairats[0].baladyiats[1]); + }); + + it('should return null for an empty data set', () => { + const result =getBaldiyaByCodeForWilaya(mockDataNoBaladiyats)(47, 4702); + + expect(result).toBeNull(); + }); + +}); \ No newline at end of file diff --git a/tests/api/getBaldiyatsForDairaByCodeForWilayaByCode.test.js b/tests/api/getBaldiyatsForDairaByCodeForWilayaByCode.test.js new file mode 100644 index 0000000..10a1af2 --- /dev/null +++ b/tests/api/getBaldiyatsForDairaByCodeForWilayaByCode.test.js @@ -0,0 +1,69 @@ +describe('get matching baldiyats by daira code and wilaya mattricule', ()=>{ + const mockData = [ + { + mattricule: 47, + name: 'Ghardaïa', + dairats: [ + { + code: 4701, + name: 'GHARDAIA', + name_ar: 'غرداية', + name_en: 'GHARDAIA', + baladyiats: [ + { + code: 4701, + name: 'GHARDAIA', + name_en: 'GHARDAIA', + name_ar: 'غرداية', + }, + { + code: 4702, + name: 'EL MENIAA', + name_en: 'EL MENIAA', + name_ar: 'المنيعة', + }, + ], + }, + ], + }, + ]; + + let getBaldiyatsForDairaByCodeForWilayaByCode; + + beforeEach(()=>{ + getBaldiyatsForDairaByCodeForWilayaByCode = require('../../src/api/getBaldiyatsForDairaByCodeForWilayaByCode'); + }); + + + + it('should export a function', () => { + expect(typeof getBaldiyatsForDairaByCodeForWilayaByCode).toBe('function'); + }); + + it('should return a curried function that returns the data', () => { + const fn = getBaldiyatsForDairaByCodeForWilayaByCode(mockData); + + expect(typeof fn).toBe('function'); + }); + + it('should return null for invalid wilaya mattricule and daira code ', () => { + const result = getBaldiyatsForDairaByCodeForWilayaByCode(mockData)(99, 1); + + expect(result).toBeNull(); + }); + + it('should return null for invalid daira code ', () => { + const result = getBaldiyatsForDairaByCodeForWilayaByCode(mockData)(47, 22); + + expect(result).toBeNull(); + }); + + + it('should return null for invalid baladiya code ', () => { + const result = getBaldiyatsForDairaByCodeForWilayaByCode(mockData)(47, 4701); + + expect(result).toEqual(mockData[0].dairats[0].baladyiats); + }); + + +}); \ No newline at end of file diff --git a/tests/api/getDairaByCodeAndWilayaCode.test.js b/tests/api/getDairaByCodeAndWilayaCode.test.js new file mode 100644 index 0000000..2c198da --- /dev/null +++ b/tests/api/getDairaByCodeAndWilayaCode.test.js @@ -0,0 +1,89 @@ + +describe('get matching daira by code and wilaya mattricule', ()=>{ + const mockData = [ + { + mattricule: 33, + dairats: [ + { + code: 3301, + baladyiats: [ + { + code: 3301, + }, + ], + }, + { + code: 3302, + baladyiats: [ + { + code: 3302, + }, + { + code: 3305, + }, + ], + }, + { + code: 3302, + baladyiats: [ + { + code: 3302, + }, + { + code: 3305, + }, + ], + }, + { + code: 3306, + baladyiats: [ + { + code: 3303, + }, + { + code: 3304, + }, + { + code: 3306, + }, + ], + }, + ], + }, + ]; + + let getDairaByCodeAndWilayaCode; + beforeEach(()=>{ + getDairaByCodeAndWilayaCode = require('../../src/api/getDairaByCodeAndWilayaCode'); + }); + + it('should export a function', () => { + expect(typeof getDairaByCodeAndWilayaCode).toBe('function'); + }); + + it('should return a curried function that returns the data', () => { + const fn = getDairaByCodeAndWilayaCode(mockData); + + expect(typeof fn).toBe('function'); + }); + + it('should return null for invalid wilaya mattricule and daira code ', () => { + const result = getDairaByCodeAndWilayaCode(mockData)(99, 1); + + expect(result).toBeNull(); + }); + + it('should return null for invalid daira code ', () => { + const result = getDairaByCodeAndWilayaCode(mockData)(33, 99); + + expect(result).toBeNull(); + }); + + + + it('should return a matching baldiya for valide wilaya mattricule and daira code ', () => { + const result = getDairaByCodeAndWilayaCode(mockData)(33, 3302); + expect(result).toEqual(mockData[0].dairats[1]); + }); + +}); \ No newline at end of file diff --git a/tests/index.test.js b/tests/index.test.js index 9763907..8e06c99 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -26,6 +26,10 @@ describe("Le'Bled SDK", () => { getBaladyiatsForDaira: expect.any(Function), getWilayaByBaladyiaName: expect.any(Function), getDairaByBaladyiaName: expect.any(Function), + getDairaByCodeAndWilayaCode: expect.any(Function), + getBaladiyaByCodeAndDairaCodeAndWilayaCode: expect.any(Function), + getBaldiyatsForDairaByCodeForWilayaByCode: expect.any(Function), + getBaldiyaByCodeForWilaya: expect.any(Function), utils: { projectObject: expect.any(Function), isValidZipCode: expect.any(Function),