From afc1cd1809e9118909b4898003ef401202b6ac32 Mon Sep 17 00:00:00 2001 From: GabrielTrettel Date: Tue, 26 Oct 2021 22:01:49 -0300 Subject: [PATCH 1/2] [in-process] user autentication --- src/app/api/auth.js | 31 +++++++-- src/app/screens/AccountScreen.js | 2 +- src/app/screens/ActivateInstitutionCode.js | 79 +++++++++++++--------- src/app/screens/LoginScreen.js | 4 +- src/app/screens/RegisterScreen.js | 38 +++++++++-- 5 files changed, 108 insertions(+), 46 deletions(-) diff --git a/src/app/api/auth.js b/src/app/api/auth.js index 2e1ca13..6ccb946 100644 --- a/src/app/api/auth.js +++ b/src/app/api/auth.js @@ -1,5 +1,6 @@ import { create } from "apisauce"; import authClient from "../auth/authClient"; +import authStorage from "../auth/storage"; function login(name, password) { return authClient.post(`/login?username=${name}&password=${password}`); @@ -18,6 +19,7 @@ function signup({ secQuestion, secQuestionAns, consent, + role, }) { const body = { username: number, @@ -32,22 +34,37 @@ function signup({ securityquestion: secQuestion, securityanswer: secQuestionAns, termsofusage: consent, - roles: ["ROLE_CLIENT"], + roles: role !== "" ? [role] : ["ROLE_CLIENT"], }; - // Object.entries(body).forEach(([key, value]) => { - // value == "" && delete body[key]; - // }); + Object.entries(body).forEach(([key, value]) => { + value === "" && delete body[key]; + }); return authClient.post(`/signup`, body); } -function userPersonalData(token) { + +async function userPersonalData() { + const authToken = await authStorage.getToken() const localClient = create({ baseURL: "http://wpd.brazilsouth.cloudapp.azure.com:8080/users", }); - localClient.setHeader("Authorization", `Bearer ${token}`); + localClient.setHeader("Authorization", `Bearer ${authToken}`); return localClient.get(`/me`); } -export { login, signup, userPersonalData }; + +async function userActivation(code) { + const { username } = await authStorage.getUser(); + const authToken = await authStorage.getToken() + + const localClient = create({ + baseURL: "http://wpd.brazilsouth.cloudapp.azure.com:8080/users", + }); + localClient.setHeader("Authorization", `Bearer ${authToken}`); + + return localClient.post(`/activate?activationkey=${code}&username=${username}`); +} + +export { login, signup, userPersonalData, userActivation }; diff --git a/src/app/screens/AccountScreen.js b/src/app/screens/AccountScreen.js index e5a1c9f..a5cb40f 100644 --- a/src/app/screens/AccountScreen.js +++ b/src/app/screens/AccountScreen.js @@ -95,7 +95,7 @@ function AccountScreen(props) { IconProvider: FontAwesome, title: "ATIVAR INSTITUIÇÃO", onPress: () => { - props.navigation.navigate("ActivateInstitution"); + props.navigation.navigate("ActivateInstitutionCode"); }, }, { diff --git a/src/app/screens/ActivateInstitutionCode.js b/src/app/screens/ActivateInstitutionCode.js index fdcc7ff..8511f67 100644 --- a/src/app/screens/ActivateInstitutionCode.js +++ b/src/app/screens/ActivateInstitutionCode.js @@ -7,8 +7,6 @@ import { MaterialCommunityIcons } from "@expo/vector-icons"; import { AuthContext } from "../auth/context"; import authStorage from "../auth/storage"; - - import { Form, SubmitButton, @@ -17,7 +15,7 @@ import { } from "../components/forms"; import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; import ConfirmationModal from "../components/ConfirmationModal"; -import {userPersonalData} from "../api/auth"; +import { userActivation } from "../api/auth"; function Header() { return ( @@ -43,20 +41,27 @@ function Header() { } function Institution({ user, institutionRole }) { - var institutionMap = { + const institutionMap = { E: "Escola", D: "Defesa Civil", N: "Não governamental", O: "Outra", - N: "Nenhuma" + N: "Nenhuma", }; - + + const roleMap = { + ROLE_CLIENT: "Não responsável", + ROLE_INSTITUTION: "Responsável", + } + return ( Tippo de instituição: - {institutionMap[user.institutiontype]} + + {institutionMap[user.institutiontype]} + @@ -76,19 +81,24 @@ function Institution({ user, institutionRole }) { size={30} color={colors.primary} /> - {institutionRole} + {roleMap[user.role]} ); } -function ValidateCode({ institutionRole, user }) { +// 950ebd56-7acc-4b45-9366-23a0f814f3f2 + +// 1199990987 + +function ValidateCode({ user }) { return (
- + + Código de ativação: { console.log("Forms values: \n" + JSON.stringify(form)); - processOnSubmit(navigation, form, instRole, setShowLog); + processOnSubmit(navigation, form, user.role, setShowLog); }} > setShowLog(initialState)} onDecline={() => setShowLog(initialState)} /> - + ); diff --git a/src/app/screens/LoginScreen.js b/src/app/screens/LoginScreen.js index 5639cec..2eb2362 100644 --- a/src/app/screens/LoginScreen.js +++ b/src/app/screens/LoginScreen.js @@ -79,10 +79,10 @@ export default function LoginScreen(props) { const result = await login(name, password); if (!result.ok) return setLoginFailed(true); - authStorage.setToken(result.data); + await authStorage.setToken(result.data); setLoginFailed(false); - const user = await userPersonalData(result.data); + const user = await userPersonalData(); user.ok && authContext.setUser(user.data); }; diff --git a/src/app/screens/RegisterScreen.js b/src/app/screens/RegisterScreen.js index 2fde494..d1b8414 100644 --- a/src/app/screens/RegisterScreen.js +++ b/src/app/screens/RegisterScreen.js @@ -51,6 +51,7 @@ const validationSchema = Yup.object().shape({ .required("A resposta da pergunta de segurança é obrigatória") .max(255), consent: Yup.bool().equals([true], "Este campo é obrigatório"), + role: Yup.string(), }); function LocalDatePicker({ date, setDate, _moment }) { @@ -218,6 +219,24 @@ function SecQuestionPicker({ name }) { ); } +function RolePicker({ name }) { + const [items, setItems] = useState([ + { value: "ROLE_INSTITUTION", label: "Responsável" }, + { value: "ROLE_CLIENT", label: "Não responsável" }, + ]); + + return ( + + ); +} + + function MaterialCommunityIconsCustom({ name, color = colors.primary, @@ -249,7 +268,7 @@ export default function RegisterScreen(props) { if (!result.ok) return; authStorage.setToken(result.data); - const user = await userPersonalData(result.data); + const user = await userPersonalData(); user.ok && authContext.setUser(user.data); } @@ -258,6 +277,8 @@ export default function RegisterScreen(props) { const formDate = date.format("DD/MM/yyyy") === moment().format("DD/MM/yyyy") ? "" : date; const result = await signup({...form, dateofborn: formDate}) + console.log(result) + switch (result.status) { case 200: automaticLogin(form) @@ -285,13 +306,12 @@ export default function RegisterScreen(props) { institution: "", secQuestion: "", secQuestionAns: "", + role: "", consent: false, }} onSubmit={(form) => { comparePassword(form.password, form.confirmPassword); handleSubmit(form) - // console.log("cadastro ainda não implementado"); - // console.log("Forms values: \n" + JSON.stringify(form)); }} validationSchema={validationSchema} > @@ -316,7 +336,7 @@ export default function RegisterScreen(props) { + + + Vínculo institucional: + + + + + + + Pergunta de segurança*: Date: Wed, 27 Oct 2021 17:35:47 -0300 Subject: [PATCH 2/2] User autentication first implementation --- src/app/api/auth.js | 6 ++- src/app/screens/AccountScreen.js | 49 +++++++++++++------ src/app/screens/ActivateInstitutionCode.js | 4 +- .../screens/ActivateInstitutionShowCode.js | 29 ++++++++--- src/app/screens/LoginScreen.js | 1 + 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/app/api/auth.js b/src/app/api/auth.js index 6ccb946..3568b69 100644 --- a/src/app/api/auth.js +++ b/src/app/api/auth.js @@ -51,6 +51,7 @@ async function userPersonalData() { baseURL: "http://wpd.brazilsouth.cloudapp.azure.com:8080/users", }); localClient.setHeader("Authorization", `Bearer ${authToken}`); + return localClient.get(`/me`); } @@ -58,13 +59,16 @@ async function userPersonalData() { async function userActivation(code) { const { username } = await authStorage.getUser(); const authToken = await authStorage.getToken() + console.log("TOKEN ACTIVATE: "+authToken); + console.log("USER NAME: " + username); const localClient = create({ baseURL: "http://wpd.brazilsouth.cloudapp.azure.com:8080/users", }); + localClient.setHeader("Authorization", `Bearer ${authToken}`); - return localClient.post(`/activate?activationkey=${code}&username=${username}`); + return localClient.post(`/activate?username=${username}&activationkey=0b7b37bb-0f6d-4c65-b1b4-d7cc816f52bd`); } export { login, signup, userPersonalData, userActivation }; diff --git a/src/app/screens/AccountScreen.js b/src/app/screens/AccountScreen.js index a5cb40f..28cfb63 100644 --- a/src/app/screens/AccountScreen.js +++ b/src/app/screens/AccountScreen.js @@ -9,7 +9,6 @@ import { MaterialCommunityIcons, FontAwesome } from "@expo/vector-icons"; import colors from "../config/colors"; import ConfirmationModal from "../components/ConfirmationModal"; - function UserHeader({ name, fone }) { return ( @@ -74,16 +73,32 @@ function ProfileItensList({ icon, IconProvider, title, onPress }) { function AccountScreen(props) { const { user, setUser } = useContext(AuthContext); - const [ showLog, setShowLog ] = useState(false); + const [showLog, setShowLog] = useState(false); + console.log(user); const logout = () => { setUser(null); authStorage.removeToken(); }; + const activationActions = () => { + if (user?.providerActivationKey) + props.navigation.navigate("ActivateInstitutionShowCode"); + else + props.navigation.navigate("ActivateInstitutionCode"); + }; + + const showActivation = () => { + if (user.role === "ROLE_CLIENT") + return !user.active + else + return true + } + const profileItems = [ { icon: "account", + show: true, IconProvider: MaterialCommunityIcons, title: "Cadastrar pluviômetro", onPress: () => { @@ -92,14 +107,16 @@ function AccountScreen(props) { }, { icon: "institution", + show: showActivation(), IconProvider: FontAwesome, title: "ATIVAR INSTITUIÇÃO", onPress: () => { - props.navigation.navigate("ActivateInstitutionCode"); + activationActions(); }, }, { icon: "information-outline", + show: true, IconProvider: MaterialCommunityIcons, title: "SOBRE O PROJETO", onPress: () => { @@ -108,10 +125,11 @@ function AccountScreen(props) { }, { icon: "logout", + show: true, IconProvider: MaterialCommunityIcons, title: "sair", onPress: () => { - setShowLog(true) + setShowLog(true); }, }, // { @@ -135,16 +153,19 @@ function AccountScreen(props) { - {profileItems.map(({ icon, IconProvider, title, onPress }) => ( - - - - ))} + {profileItems.map( + ({ icon, IconProvider, title, onPress, show }) => + show && ( + + + + ) + )} { + if (authContext.user?.providerActivationKey?.activationkey) + setActCode(authContext.user.providerActivationKey.activationkey); + else + userPersonalData().then((userData) => { + userData.ok && authContext.setUser(userData.data); + setActCode(userData.data.providerActivationKey.activationkey); + }); + }, []); -export default function ActivateInstitutionShowCode({ route }) { - const { code } = route.params; - const [actCode, setActCode] = useState("123456789012"); return ( @@ -52,9 +67,11 @@ export default function ActivateInstitutionShowCode({ route }) { marginTop: 24, fontWeight: "bold", textAlign: "center", - fontSize: dimensions.text.header + fontSize: dimensions.text.header, }} - >{actCode} + > + {actCode} + ); } diff --git a/src/app/screens/LoginScreen.js b/src/app/screens/LoginScreen.js index 2eb2362..255a5f4 100644 --- a/src/app/screens/LoginScreen.js +++ b/src/app/screens/LoginScreen.js @@ -80,6 +80,7 @@ export default function LoginScreen(props) { if (!result.ok) return setLoginFailed(true); await authStorage.setToken(result.data); + // console.log("TOKEN: " + result.data); setLoginFailed(false); const user = await userPersonalData();