diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/challenge_1/challenge_1.js b/challenge_1/challenge_1.js new file mode 100644 index 0000000..c7ae8cd --- /dev/null +++ b/challenge_1/challenge_1.js @@ -0,0 +1,37 @@ +const reduce = ([a,...b],fn,initValue)=>a?reduce(b,fn,fn(initValue,a)):initValue +const map = (arr,fn)=>reduce(arr,(acc,curr)=>acc.concat(fn(curr,arr)),[]) +const filter = (arr,fn)=>reduce(arr,(acc,curr)=>fn(curr)? acc.concat(curr) :acc,[]) +const print = console.log +/** + * @author Thom Maurick Roman Aguilar - thomtwd@gmail.com + * @param {arr} es el array para buscar + * @param {value} es el element que será el que comprueba + * @return La función retornará un array de array + * @example ([2,6,8,0,9,-10,-1]) and 8 => [[2,6] ,[8,0],[9,-1]] + */ + +const filtered = (arr,value)=>{ + let acc = [] + const recursive = arr=>{ + let flag = false + const [a,...b]=arr + let result = filter(b,item=>item+arr[0]===value)[0] + if(result===arr[0]) flag = true + if(result!==undefined ) { + acc.push([arr[0],result]) + if(flag) arr.shift() + arr.splice(arr.indexOf(result),1) + } + if(!flag)arr.shift() + if(arr.length>0) recursive(arr) + return acc + } + return recursive(arr) +} +print(filtered([2,8,6,0,9,-10,-1,6],8)) +print(filtered([2,5,1,7,8,-8,1],3)) +print(filtered([1,2,3,2,7,8,-3],4)) +print(filtered([1,2,4,2,7,8,-3],4)) +print(filtered([1,2,4,2,7,8,-3],8)) +print(filtered( [4, 6, 2, -6, 10],8)) +print(filtered( [1,1,1,8,7,9,0,2],9)) // arreglar -> [[1,8] [7,2] [9,0]] \ No newline at end of file diff --git a/challenge_1/changelle_2.js b/challenge_1/changelle_2.js new file mode 100644 index 0000000..c8378e8 --- /dev/null +++ b/challenge_1/changelle_2.js @@ -0,0 +1,35 @@ +class Song{ + constructor(title,duration,author){ + this.title=title + this.duration = duration + this.author=new author(author.name,author.pais) + } +} +class DB{ + constructor(songs){ + this.songs=songs + } +} +let SpotifyDB +function spotify(){ + return { + init(){ + SpotifyDB=new DB([]) + }, + addSong(title,duration,author){ + SpotifyDB.songs.push(new Song(title,duration,author)) + } + } +} +//agregar editar eliminar mostrar -- agregar a discografia +// agregar discografia a autor + +let spotifyInstance = spotify() + +spotifyInstance.init() +spotifyInstance.addSong('Cancion 1',4.3,{nombre:'asd',pais:'tango'}) + +console.log(SpotifyDB); + + +// 12 de la noche el sabado \ No newline at end of file diff --git a/challenge_2/config/yargs.js b/challenge_2/config/yargs.js new file mode 100644 index 0000000..ede8f41 --- /dev/null +++ b/challenge_2/config/yargs.js @@ -0,0 +1,95 @@ +const argv = require('yargs') + +const id = { + alias:'i', + demand:true +} +const to_list = {} +const by_id ={id} + +const create_artist={ + id:{ + alias:'i', + demand:true + } + , + name:{ + demand:true, + alias:'n' + }, + email:{ + demand:true, + alias:'e' + }, + dni:{ + demand:true, + alias:'d' + } +} + + +const create_musical_genre={ + id, + type:{ + demand:true, + alias:'t' + } +} +const create_album={ + id, + title:{ + demand:true, + alias:'t', + }, + date:{ + demand:true, + alias:'d' + }, + id_artist:{ + demand:true, + alias:'a' + } +} + +const create_song={ + id, + id_genre:{ + demand:true, + alias:'g' + }, + id_album:{ + demand:true, + alias:'a' + }, + date:{ + demand:true, + alias:'d' + }, + title:{ + demand:true, + alias:'t' + } +} + +const yargs = argv.command('create_artist','Creacion de un artista',create_artist) + .command('create_musical_genre','Creacion de un genero musical',create_musical_genre) + .command('create_album','Creacion de un album',create_album) + .command('create_song','Creacion de una cancion',create_song) + .command('to_list_artists','Listar artistas',to_list) + .command('show_artist_by_id','Mostrar artista por id',by_id) + .command('to_list_songs','Listar canciones',to_list) + .command('show_song_by_id','Mostrar cancion por id',by_id) + .command('to_list_albums','Listar albumes',to_list) + .command('show_album_by_id','Mostrar album por id',by_id) + .command('to_list_gs','Listar generos',to_list) + .command('show_genre_by_id','Mostrar genero por id',by_id) + .command('delete_by_id_song','Eliminar cancion por id',by_id) + .command('delete_by_id_artist','Eliminar artista por id',by_id) + .command('delete_by_id_album','Eliminar album por id',by_id) + .command('delete_by_id_gn','Eliminar genero por id',by_id) + .help() + .argv + +module.exports= { + yargs +} \ No newline at end of file diff --git a/challenge_2/package-lock.json b/challenge_2/package-lock.json new file mode 100644 index 0000000..c6a6e1a --- /dev/null +++ b/challenge_2/package-lock.json @@ -0,0 +1,386 @@ +{ + "name": "challenge_2", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/challenge_2/package.json b/challenge_2/package.json new file mode 100644 index 0000000..ac91369 --- /dev/null +++ b/challenge_2/package.json @@ -0,0 +1,17 @@ +{ + "name": "challenge_2", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": {}, + "dependencies": { + "colors": "^1.3.3", + "yargs": "^13.2.4" + } +} diff --git a/challenge_2/src/Album.js b/challenge_2/src/Album.js new file mode 100644 index 0000000..4184dff --- /dev/null +++ b/challenge_2/src/Album.js @@ -0,0 +1,9 @@ +const Entity =require('./Entity') +module.exports= class Album extends Entity{ + constructor({id,title,date,idArtist}){ + super({id}) + this.title=title + this.date=date + this.idArtist=idArtist + } +} diff --git a/challenge_2/src/Artist.js b/challenge_2/src/Artist.js new file mode 100644 index 0000000..ba3d9d3 --- /dev/null +++ b/challenge_2/src/Artist.js @@ -0,0 +1,12 @@ +const Entity =require('./Entity') + +module.exports=class Artist extends Entity{ + constructor({id,dni,name,email}){ + super({id}) + this.name=name + this.email=email + this.dni=dni + } +} + +// $ npm run dev src/model/Artist.js \ No newline at end of file diff --git a/challenge_2/src/Entity.js b/challenge_2/src/Entity.js new file mode 100644 index 0000000..ef93e78 --- /dev/null +++ b/challenge_2/src/Entity.js @@ -0,0 +1,5 @@ +module.exports =class Entity{ + constructor({id}){ + this.id=id + } +} diff --git a/challenge_2/src/FactoryEntity.js b/challenge_2/src/FactoryEntity.js new file mode 100644 index 0000000..b50232d --- /dev/null +++ b/challenge_2/src/FactoryEntity.js @@ -0,0 +1,15 @@ +const Artist = require('./Artist'), + Album = require('./Album'), + MusicalEntity = require('./MusicalGenre'), + Song = require('./Song') + +module.exports =class FactoryEntity{ + buildEntity(argv){ + //logica + if(argv._[0]==='create_artist') return new Artist({id:argv.id,dni:argv.dni,name:argv.name,email:argv.email}) + if(argv._[0]==='create_musical_genre') return new MusicalEntity({id:argv.id,type:argv.type}) + if(argv._[0]==='create_album') return new Album({id:argv.id,title:argv.title,date:argv.date,idArtist:argv.id_artist}) + if(argv._[0]==='create_song') return new Song({id:argv.id,idGenre:argv.id_genre,idAlbum:argv.id_album,date:argv.date,title:argv.title}) + else return null + } +} \ No newline at end of file diff --git a/challenge_2/src/MusicalGenre.js b/challenge_2/src/MusicalGenre.js new file mode 100644 index 0000000..423ff53 --- /dev/null +++ b/challenge_2/src/MusicalGenre.js @@ -0,0 +1,7 @@ +const Entity =require('./Entity') +module.exports= class MusicalGenre extends Entity{ + constructor({id,type}){ + super({id}) + this.type=type + } +} \ No newline at end of file diff --git a/challenge_2/src/Song.js b/challenge_2/src/Song.js new file mode 100644 index 0000000..3581a5e --- /dev/null +++ b/challenge_2/src/Song.js @@ -0,0 +1,11 @@ +const Entity =require('./Entity') + +module.exports= class Song extends Entity{ + constructor({id,idGenre,idAlbum,date,title}){ + super({id}) + this.idGenre=idGenre + this.idAlbum=idAlbum + this.date=date + this.title=title + } +} \ No newline at end of file diff --git a/challenge_2/src/Spotify.js b/challenge_2/src/Spotify.js new file mode 100644 index 0000000..ad1e897 --- /dev/null +++ b/challenge_2/src/Spotify.js @@ -0,0 +1,13 @@ +const { + create, + deleteById, + showById, + toListOf} = require('./crud'), + {yargs} = require('../config/yargs') + +let command = yargs._[0] +if(command.startsWith('create')) return create(yargs) +if(command.startsWith('to_list')) return toListOf(yargs) +if(command.startsWith('delete')) return deleteById(yargs) +if(command.startsWith('show')) return showById(yargs) +else return console.log('Comando desconocido') \ No newline at end of file diff --git a/challenge_2/src/crud.js b/challenge_2/src/crud.js new file mode 100644 index 0000000..0d801ee --- /dev/null +++ b/challenge_2/src/crud.js @@ -0,0 +1,114 @@ +const fs = require('fs'), + FactoryEntity = require('./FactoryEntity'), + pathDB ='./database/spotifyDB.json', + factoryEntity = new FactoryEntity(), + print = console.log +let db = {} +const loadingDB = ()=>{ + try{ + db = require(pathDB) + }catch{ + db = {"artists":[],"albums":[],"songs":[],"musical_genres":[]} + } +} +const saveDB = ()=>{ + return new Promise((resolve,reject)=>{ + let data =JSON.stringify(db) + fs.writeFile('src/database/spotifyDB.json',data,err=>{ + if(err) return reject(err) + return resolve(data) + }) + }) +} + +const create = argv=>{ + loadingDB() + let entity = factoryEntity.buildEntity(argv) + if(argv._[0]==='create_artist') db.artists.push(entity) + if(argv._[0]==='create_musical_genre') db.musical_genres.push(entity) + if(argv._[0]==='create_album') db.albums.push(entity) + if(argv._[0]==='create_song') db.songs.push(entity) + // print(db) + saveDB().then(data=>print(entity)).catch(console.error) +} +// loadingDB() +// create(yargs) +const toListOf=argv=>{ + loadingDB() + if(argv._[0]==='to_list_artists') return print(db.artists) + if(argv._[0]==='to_list_songs') return print(db.songs) + if(argv._[0]==='to_list_albums') return print(db.albums) + if(argv._[0]==='to_list_gs') return print(db.musical_genres) +} +const showById = argv =>{ + loadingDB() + if(argv._[0]==='show_artist_by_id') return print(db.artists.filter(art=>art.id===argv.id)) + if(argv._[0]==='show_song_by_id') return print(db.songs.filter(s=>s.id===argv.id)) + if(argv._[0]==='show_album_by_id') return print(db.albums.filter(al=>al.id===argv.id)) + if(argv._[0]==='show_genre_by_id') return print(db.musical_genres.filter(m=>m.id===argv.id)) +} +const deleteById = argv =>{ + loadingDB() + if(argv._[0]==='delete_by_id_artist') { + let index_artist = db.artists.filter((art,index)=>{ + if(art.id===argv.id) return index + })[0] + let index_album = db.albums.filter((alb,index)=>{ + if(alb.idArtist===argv.id) return index + }) + let index_song =db.songs.filter((so,index)=>{ + if(so.idAlbum===argv.id) return index + }) + db.artists.splice(index_artist,1) + + index_album.forEach(item=>{ + db.albums.splice(item,1) + }) + index_song.forEach(item=>{ + db.songs.splice(item,1) + }) + } + else if(argv._[0]==='delete_by_id_song'){ + let index_song =db.songs.filter((so,index)=>{ + if(so.id===argv.id) return index + })[0] + db.songs.splice(index_song,1) + } + else if(argv._[0]==='delete_by_id_album'){ + let index_album = db.albums.filter((alb,index)=>{ + if(alb.idArtist===argv.id) return index + })[0] + let index_song =db.songs.filter((so,index)=>{ + if(so.idAlbum===argv.id) return index + }) + + db.albums.splice(index_album,1) + index_song.forEach(item=>{ + db.songs.splice(item,1) + }) + + } + else if(argv._[0]==='delete_by_id_gn') { + let index_ge = db.musical_genres.filter((g,index)=>{ + if(g.id===argv.id) return index + })[0] + let index_song =db.songs.filter((so,index)=>{ + if(so.idGenre===argv.id) return index + }) + + db.musical_genres.splice(index_ge,1) + index_song.forEach(item=>{ + db.songs.splice(item,1) + }) + } + saveDB().then(console.log).catch(console.error) +} + +module.exports = { + loadingDB, + saveDB, + create, + toListOf, + showById, + deleteById +} \ No newline at end of file diff --git a/challenge_2/src/database/spotifyDB.json b/challenge_2/src/database/spotifyDB.json new file mode 100644 index 0000000..f9ddae2 --- /dev/null +++ b/challenge_2/src/database/spotifyDB.json @@ -0,0 +1 @@ +{"artists":[{"id":1,"name":"Thom","email":"thomtwd@gmail.com","dni":72847964}],"albums":[],"songs":[],"musical_genres":[]} \ No newline at end of file