diff --git a/Readme.md b/Readme.md index ed84ec5c..70e0199c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,43 @@ +# SOCIAL NETWORK +## PROYECTO: EDU-LINE +## RESUMEN: +Red Social sobre temas de educación + +## INVESTIGACIÓN UX: +Aplicación dirigida a usuarios especialistas en el tema y padres de familia que se podrán comunicar a través de esta red social; compartir tips, técnicas y demás información que ayude mejorar la educación de sus hijos o dar pautas para que los profesionales mejoren su forma de enseñar. + +## Historias de Usuario: + +* Como usuario nuevo debo poder crear una cuenta con email y password válidos para poder iniciar sesion e ingresar a la red social. + +* Como usuario nuevo debo poder tener la opción de iniciar sesión con mi cuenta de Google o Facebook para ingresar a la red social sin necesidad de crear una cuenta de email válido. + +* Como usuario loggeado debo poder crear, guardar, modificar en el mismo lugar (in place) y eliminar una publicación (post) privada o pública, que puede ser una frase o una imagen. + +* Como usuario loggeado debo poder ver todos los posts públicos y privados que he creado hasta ese momento, desde el más reciente hasta el más antiguo, así como la opción de poder cambiar la configuración de privacidad de mis post. + +* Yo como usuario loggeado, puedo dar like y llevar un conteo de likes en mi publicación así como poder escribir, guardar, editar o eliminar un comentario en mi publicación. + +* Al final debo poder ingresar a la red social y poder visualizar los datos de mi perfil creado o editarlos. + +## FEEDBACK: SI + +## PROTOTIPO BAJA FIDELIDAD: + + + + + + + +## PROTOTIPO ALTA FIDELIDAD (FIGMA): + + + +## PROTOTIPO FINAL: + + + # Creando una Red Social Bienvenida a tu primer proyecto del track de Frontend en Laboratoria. @@ -147,43 +187,43 @@ anterior en la siguiente sección. ### HTML y CSS -* [ ] [HTML semántico](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) -* [ ] [CSS `flexbox`](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -* [ ] Construir tu aplicación respetando el diseño realizado (maquetación). +* [✔] [HTML semántico](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) +* [🤔] [CSS `flexbox`](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) +* [✔] Construir tu aplicación respetando el diseño realizado (maquetación). ### DOM y Web APIs -* [ ] [Manipulación dinámica del DOM](https://developer.mozilla.org/es/docs/Referencia_DOM_de_Gecko/Introducci%C3%B3n) -* [ ] [History API](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) -* [ ] [`localStorage`] +* [✔] [Manipulación dinámica del DOM](https://developer.mozilla.org/es/docs/Referencia_DOM_de_Gecko/Introducci%C3%B3n) +* [✔] [History API](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) +* [✔] [`localStorage`] ### Javascript -* [ ] [Uso de callbacks](https://developer.mozilla.org/es/docs/Glossary/Callback_function) -* [ ] [Consumo de Promesas](https://scotch.io/tutorials/javascript-promises-for-dummies#toc-consuming-promises) -* [ ] Uso ES modules -([`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) -| [`export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)) +* [🤔] [Uso de callbacks](https://developer.mozilla.org/es/docs/Glossary/Callback_function) +* [🤔] [Consumo de Promesas](https://scotch.io/tutorials/javascript-promises-for-dummies#toc-consuming-promises) +* [🤔] Uso ES modules +* [✔] ([`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) +* [✔] `export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)) ### Firebase * [ ] [Firestore](https://firebase.google.com/docs/firestore) -* [ ] [Firebase Auth](https://firebase.google.com/docs/auth/web/start) -* [ ] [Firebase security rules](https://firebase.google.com/docs/rules) -* [ ] [Uso de onSnapshot](https://firebase.google.com/docs/firestore/query-data/listen) +* [✔] ] [Firebase Auth](https://firebase.google.com/docs/auth/web/start) +* [🤔] [Firebase security rules](https://firebase.google.com/docs/rules) +* [🤔] [Uso de onSnapshot](https://firebase.google.com/docs/firestore/query-data/listen) | [onAuthStateChanged](https://firebase.google.com/docs/auth/web/start#set_an_authentication_state_observer_and_get_user_data) ### Testing -* [ ] [Testeo de tus funciones](https://jestjs.io/docs/es-ES/getting-started) +* [🤔] [Testeo de tus funciones](https://jestjs.io/docs/es-ES/getting-started) * [ ] [Testeo asíncrono](https://jestjs.io/docs/es-ES/asynchronous) * [ ] [Mocking](https://jestjs.io/docs/es-ES/manual-mocks) ### Colaboración en Github -* [ ] Branches -* [ ] Pull Requests -* [ ] Tags +* [✔] Branches +* [✔] Pull Requests +* [✔] Tags ### Organización en Github @@ -194,8 +234,8 @@ anterior en la siguiente sección. ### Buenas prácticas de desarrollo -* [ ] Modularización -* [ ] Nomenclatura / Semántica +* [✔] Modularización +* [🤔 ] Nomenclatura / Semántica * [ ] Linting *** diff --git a/SocialNet1.jpg b/SocialNet1.jpg new file mode 100644 index 00000000..ffb50b42 Binary files /dev/null and b/SocialNet1.jpg differ diff --git a/SocialNet2.jpg b/SocialNet2.jpg new file mode 100644 index 00000000..00cb9279 Binary files /dev/null and b/SocialNet2.jpg differ diff --git a/SocialNet3.jpg b/SocialNet3.jpg new file mode 100644 index 00000000..c47b63a2 Binary files /dev/null and b/SocialNet3.jpg differ diff --git a/SocialNet4.jpg b/SocialNet4.jpg new file mode 100644 index 00000000..d245f69e Binary files /dev/null and b/SocialNet4.jpg differ diff --git a/SocialNet5.jpg b/SocialNet5.jpg new file mode 100644 index 00000000..7b1b1b4d Binary files /dev/null and b/SocialNet5.jpg differ diff --git a/SocialNetFigma.jpg b/SocialNetFigma.jpg new file mode 100644 index 00000000..4baacdec Binary files /dev/null and b/SocialNetFigma.jpg differ diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 00000000..9e673a0d --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,29 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/node', +1 verbose cli '/usr/bin/npm', +1 verbose cli 'config', +1 verbose cli 'set', +1 verbose cli 'prefix', +1 verbose cli '/npm', +1 verbose cli '-g' ] +2 info using npm@3.5.2 +3 info using node@v8.10.0 +4 info config set "prefix" "/npm" +5 verbose stack Error: EACCES: permission denied, open '/etc/npmrc' +6 verbose cwd /home/laboratoria112-am/Documentos/laboratoria/CDMX009-Social-Network +7 error Linux 4.15.0-72-generic +8 error argv "/usr/bin/node" "/usr/bin/npm" "config" "set" "prefix" "/npm" "-g" +9 error node v8.10.0 +10 error npm v3.5.2 +11 error path /etc/npmrc +12 error code EACCES +13 error errno -13 +14 error syscall open +15 error Error: EACCES: permission denied, open '/etc/npmrc' +15 error { Error: EACCES: permission denied, open '/etc/npmrc' +15 error errno: -13, +15 error code: 'EACCES', +15 error syscall: 'open', +15 error path: '/etc/npmrc' } +16 error Please try running this command again as root/Administrator. +17 verbose exit [ -13, true ] diff --git a/package.json b/package.json index 9a365577..ec06a739 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "htmlhint": "htmlhint dist/*.html ", "eslint": "eslint --ext .js src/ test/", "stylelint": "stylelint --aei src/**/*.css", - "pretest": "npm run htmlhint && npm run eslint && npm run stylelint", "test": "jest --coverage", "start": "serve src/" }, @@ -26,11 +25,16 @@ "eslint-config-airbnb-base": "^13.2.0", "eslint-plugin-import": "^2.18.2", "eslint-plugin-jest": "^22.1.2", + "firebase-functions-test": "^0.2.1", "htmlhint": "^0.11.0", - "jest": "^24.8.0", + "jest": "^24.9.0", "regenerator-runtime": "^0.13.1", "serve": "^11.0.2", "stylelint": "^10.1.0", "stylelint-config-recommended": "^2.2.0" + }, + "dependencies": { + "firebase-admin": "^8.11.0", + "firebase-functions": "^3.6.1" } -} \ No newline at end of file +} diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 00000000..279b0821 --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} \ No newline at end of file diff --git a/src/auth.js b/src/auth.js new file mode 100644 index 00000000..fe7eb371 --- /dev/null +++ b/src/auth.js @@ -0,0 +1,62 @@ + + +// LOGIN CON EMAIL Y PWD + + function emailLogin(email, password) { + //(!email || !password) return 'No existe email o password' + //if (password.length < 6) return 'No cumple con 6 caracteres' + + firebase.auth() + .signInWithEmailAndPassword(email, password) + .catch(function(error) { + // Handle Errors here. + const errorCode = error.code; + const errorMessage = error.message; + if (errorCode === "auth/invalid-email"){ + alert("Email inválido") + } if (errorCode === "auth/user-disabled"){ + alert("Usuario deshabilitado") + } if (errorCode === "auth/user-not-found"){ + alert("Usuario no encontrado") + } if (errorCode === "auth/wrong-password"){ + alert("Contraseña incorrecta") + } + console.log(`${errorCode} ${errorMessage}`) + // ... + }); + } + + + function logout() { + firebase.auth().signOut().then(function() { + // Sign-out successful. + //return true + }).catch(function(error) { + // An error happened. + //return false + console.log(error) + }); +} + +// CREAR CUENTA MAIL Y PWD +function createAccount(mail, pwd) { + firebase.auth().createUserWithEmailAndPassword(mail, pwd) + .then(function(){ + window.socialNetwork.verification(); + }) + .catch(function(error) { + // Handle Errors here. + const errorCode = error.code; + const errorMessage = error.message; + if (errorCode === "auth/email-already-in-use"){ + alert("Correo en uso") + //return "Correo en uso" + } if (errorCode === "auth/invalid-email"){ + alert("Email inválido") + //return "Email inválido" + } if (errorCode === "auth/weak-password"){ + alert("Contraseña tiene que tener más de 6 caracteres") + } + console.log(`${errorCode} ${errorMessage}`) + }); +} \ No newline at end of file diff --git a/src/auth.test.js b/src/auth.test.js new file mode 100644 index 00000000..68b70cee --- /dev/null +++ b/src/auth.test.js @@ -0,0 +1,74 @@ +/*import * as auth from "./auth.js" + +/global.firebase = { + auth: jest.fn(() => ({ + signInWithEmailAndPassword: jest.fn(() => new Promise((resolve, reject) => { + resolve(true) + })) + })) +} + +test('Validaciones de emailLogin', () => { + let email = "antropologia@gmail.com" + let password = "123D" + + expect(auth.emailLogin(email, password)).toBe('No cumple con 6 caracteres'); + expect(auth.emailLogin('', password)).toBe('No existe email o password'); +}); + +test('emailLogin se ejecuta correctamente', () => { + let email = "antropologia@gmail.com" + let password = "123DKL" + + auth.emailLogin(email, password).then(valor => { + expect(valor).toBe(true) + }); +}); + + + +global.firebase = { + auth: jest.fn(() => ({ + createUserWithEmailAndPassword: jest.fn(() => new Promise((resolve, reject) => { + resolve(true) + })) + })) +} + +function falsaCreateAccount(email, pass){ + if(!email.includes("@")){ + return "Email inválido" + } +} + +test('Validacion incorrecta', () => { + let email = "suregmail.com" + let password = "123D" + + expect(falseCreateAccount(email, password)).toBe('Email inválido'); + expect(auth.createAccount(password)).toBe('No cumple con los 6 caracteres'); +}); + + +test('Validacion correcta', () => { + let email = "sure@gmail.com" + let password = "123DOP" + + auth.createAccount(email, password).then(valor => { + expect(valor).toBe(true) + }); +});*/ + +/*function falsesignInWithEmailAndPassword(email, password){ + if(!email.includes("@")){ + return "email invalido" +} +} + +test('Validacion incorrecta', () => { + let email = "suregmail.com" + let password = "123D" + + expect(falsesignInWithEmailAndPassword(email, password)).toBe('Email inválido'); + expect(auth.emailLogin(password)).toBe('No cumple con los 6 caracteres'); +});*/ diff --git a/src/data.js b/src/data.js new file mode 100644 index 00000000..181e7d3d --- /dev/null +++ b/src/data.js @@ -0,0 +1,175 @@ + + +window.socialNetwork = { + + createNewUserStorage: ()=> { + firebase.database().ref("users/"+firebase.auth().currentUser.uid).once("value", function(snapshot) { + if (snapshot.val() === null) { + firebase.database().ref("/users/" + firebase.auth().currentUser.uid).set({ + "profile": { + "username": firebase.auth().currentUser.displayName !== null ? firebase.auth().currentUser.displayName : firebase.auth().currentUser.email, + "especialidad": false, + "profilePic": firebase.auth().currentUser.photoURL ? firebase.auth().currentUser.photoURL : './img/userLogo.png', + "email": firebase.auth().currentUser.email + }, + "posts": false, + "comments": false + }) + // firebase.database().ref("users/"+firebase.auth().currentUser.uid).once("value", function(snapshot) { + // window.currentUser = snapshot.val(); + // }) + } + else { + // firebase.database().ref("users/"+firebase.auth().currentUser.uid).once("value", function(snapshot) { + // window.currentUser = snapshot.val(); + // }) + // console.log(snapshot.val()) + // console.log("usuario ya existia") + return snapshot //Promesa JS + } + }) + + }, + + + printPosts: (cbDOM)=> { + firebase.database().ref("/posts").on("value", cbDOM) + }, + + printPostsDOM: (snapshot)=>{ + document.getElementById("content").innerHTML = "" + let postKeys = Object.keys(snapshot.val()); + postKeys.reverse(); + for(let post of postKeys) { + // console.log(Object.values(snapshot.val()[post].comments).length) + document.getElementById("content").innerHTML += ` +
[post].authorPic ? snapshot.val()[post].authorPic : './img/userLogo.png'})
${snapshot.val()[post].author} ${snapshot.val()[post].especialidad ? "- "+snapshot.val()[post].especialidad : ""}
+ +