diff --git a/config/_development.json b/config/_development.json index dddc416..cf06e61 100644 --- a/config/_development.json +++ b/config/_development.json @@ -42,5 +42,12 @@ "enabled": true, "origins": [ "http://eduardo-velasques.dev.netuno.org:10030" ] } - ] + ], + "jwt": { + "enabled": true, + "secret": "NN,NvyQTB!ZMHc7*", + "access_expires": 60, + "refresh_expires": 1440, + "algorithm": "HS512" + } } diff --git a/dbs/social_ests.mv.db b/dbs/social_ests.mv.db index 386d6d1..145ba39 100644 Binary files a/dbs/social_ests.mv.db and b/dbs/social_ests.mv.db differ diff --git a/server/services/cities/get.js b/server/services/cities/get.js new file mode 100644 index 0000000..6d09224 --- /dev/null +++ b/server/services/cities/get.js @@ -0,0 +1,7 @@ +_out.json( + _db.query( + ` + SELECT uid, nome as name FROM cidade + ` + ) +) \ No newline at end of file diff --git a/server/services/cities/options.js b/server/services/cities/options.js new file mode 100644 index 0000000..f731105 --- /dev/null +++ b/server/services/cities/options.js @@ -0,0 +1 @@ +_out.json(_val.map().set("result", true)) \ No newline at end of file diff --git a/server/services/register.options.js b/server/services/register.options.js new file mode 100644 index 0000000..f731105 --- /dev/null +++ b/server/services/register.options.js @@ -0,0 +1 @@ +_out.json(_val.map().set("result", true)) \ No newline at end of file diff --git a/server/services/register.post.js b/server/services/register.post.js new file mode 100644 index 0000000..8aed95a --- /dev/null +++ b/server/services/register.post.js @@ -0,0 +1,56 @@ + +const name = _req.getString("name") +const surname = _req.getString("surname") +const cityUid = _req.getString("city_uid") +const email = _req.getString("email") +const username = _req.getString("username") +const password = _req.getString("password") + +const dbCidade = _db.get("cidade", cityUid) + +const emailExists = _user.firstByMail(email) +const usernameExists = _user.firstByUser(username) + +if (dbCidade == null) { + _header.status(409) + _out.json( + _val.map() + .set("error", true) + .set("message", "city-not-found") + ) +} else if (emailExists != null) { + _header.status(409) + _out.json( + _val.map() + .set("error", true) + .set("message", "email-exists") + ) +} else if (usernameExists != null) { + _header.status(409) + _out.json( + _val.map() + .set("error", true) + .set("message", "user-exists") + ) +} else { + const group = _group.firstByCode("user") + const user_id = _user.create( + _val.map() + .set("name", `${name} ${surname}`) + .set("mail", email) + .set("user", username) + .set("pass", password) + .set("group_id", group.getInt("id")) + ) + _db.insert( + 'pessoa', + _val.map() + .set("nome", name) + .set("apelido", surname) + .set("email", email) + .set("utilizador_id", user_id) + .set("cidade_id", dbCidade.getInt("id")) + ) + _log.info("Novo utilizador criado com o id: "+ user_id) + _out.json(_val.map().set("result", true)) +} diff --git a/server/setup/_end.js b/server/setup/_end.js index e69de29..9387e09 100644 --- a/server/setup/_end.js +++ b/server/setup/_end.js @@ -0,0 +1,5 @@ +_group.createIfNotExists( + _val.map() + .set("name", "Utilizador Genérico") + .set("code", "user") +) \ No newline at end of file diff --git a/server/setup/_schema-form-3-pessoa.js b/server/setup/_schema-form-3-pessoa.js index 9fc666f..435e983 100644 --- a/server/setup/_schema-form-3-pessoa.js +++ b/server/setup/_schema-form-3-pessoa.js @@ -89,51 +89,51 @@ _form.createComponentIfNotExists( "83b4bbd5-a9cb-40a4-9769-13c03029462f", _val.init() .set("colspan", 0) - .set("displayname", "Comunidades") + .set("displayname", "E-mail") .set("firebase", "") .set("group_id", 0) .set("height", 0) .set("max", 0) .set("min", 0) - .set("name", "comunidades") - .set("notnull", false) - .set("primarykey", false) - .set("properties", "{\"ITEM_SEPARATOR\":{\"default\":\" # \",\"type\":\"STRING\",\"value\":\" # \"},\"MAX_COLUMN_LENGTH\":{\"default\":\"0\",\"type\":\"INTEGER\",\"value\":\"0\"},\"COLUMN_SEPARATOR\":{\"default\":\" - \",\"type\":\"LINK_SEPARATOR\",\"value\":\" - \"},\"REFERENCE\":{\"default\":\"\",\"type\":\"LINK\",\"value\":\"pessoa_comunidade:pessoa_id\"},\"LINK\":{\"default\":\"\",\"type\":\"LINK\",\"value\":\"pessoa_comunidade:comunidade_id\"},\"SERVICE\":{\"default\":\"com/MultiSelect.netuno\",\"type\":\"STRING\",\"value\":\"com/MultiSelect.netuno\"},\"ONLY_ACTIVES\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"}}") + .set("name", "email") + .set("notnull", true) + .set("primarykey", true) + .set("properties", "{}") .set("rowspan", 0) .set("tdheight", 0) .set("tdwidth", 0) - .set("type", "multiselect") - .set("uid", "f3c9f8ef-154a-49e8-b209-cfee9694fb51") + .set("type", "email") + .set("uid", "e99477e6-1a12-4d75-a334-13aeb222eda7") .set("user_id", 0) .set("whenedit", true) .set("whenexport", true) - .set("whenfilter", false) + .set("whenfilter", true) .set("whennew", true) - .set("whenresult", false) + .set("whenresult", true) .set("whenview", true) .set("width", 0) .set("x", 1) - .set("y", 5) + .set("y", 4) ) _form.createComponentIfNotExists( "83b4bbd5-a9cb-40a4-9769-13c03029462f", _val.init() .set("colspan", 0) - .set("displayname", "E-mail") + .set("displayname", "Nome") .set("firebase", "") .set("group_id", 0) .set("height", 0) .set("max", 0) .set("min", 0) - .set("name", "email") + .set("name", "nome") .set("notnull", true) - .set("primarykey", true) - .set("properties", "{}") + .set("primarykey", false) + .set("properties", "{\"MASK_REVERSE\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"},\"MASK_SELECTONFOCUS\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"},\"MASK\":{\"default\":\"\",\"type\":\"STRING\",\"value\":\"\"}}") .set("rowspan", 0) .set("tdheight", 0) .set("tdwidth", 0) - .set("type", "email") - .set("uid", "e99477e6-1a12-4d75-a334-13aeb222eda7") + .set("type", "text") + .set("uid", "e38af13b-db5a-4eab-8bfa-05de641f1f5b") .set("user_id", 0) .set("whenedit", true) .set("whenexport", true) @@ -143,27 +143,27 @@ _form.createComponentIfNotExists( .set("whenview", true) .set("width", 0) .set("x", 1) - .set("y", 4) + .set("y", 1) ) _form.createComponentIfNotExists( "83b4bbd5-a9cb-40a4-9769-13c03029462f", _val.init() .set("colspan", 0) - .set("displayname", "Nome") + .set("displayname", "Utilizador") .set("firebase", "") .set("group_id", 0) .set("height", 0) .set("max", 0) .set("min", 0) - .set("name", "nome") - .set("notnull", true) + .set("name", "utilizador_id") + .set("notnull", false) .set("primarykey", false) - .set("properties", "{\"MASK_REVERSE\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"},\"MASK_SELECTONFOCUS\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"},\"MASK\":{\"default\":\"\",\"type\":\"STRING\",\"value\":\"\"}}") + .set("properties", "{\"ALLOW_USER_LOGGED\":{\"default\":\"false\",\"type\":\"BOOLEAN\",\"value\":\"false\"},\"GROUPS\":{\"default\":\"\",\"type\":\"STRING\",\"value\":\"\"},\"GROUPS_MODE\":{\"default\":\"all|exclude|only\",\"type\":\"CHOICE\",\"value\":\"all\"},\"USERS_MODE\":{\"default\":\"all|exclude|only\",\"type\":\"CHOICE\",\"value\":\"all\"},\"USERS\":{\"default\":\"\",\"type\":\"STRING\",\"value\":\"\"}}") .set("rowspan", 0) .set("tdheight", 0) .set("tdwidth", 0) - .set("type", "text") - .set("uid", "e38af13b-db5a-4eab-8bfa-05de641f1f5b") + .set("type", "user") + .set("uid", "86e1c717-56ac-45a9-bfcd-502a81ab2de9") .set("user_id", 0) .set("whenedit", true) .set("whenexport", true) @@ -173,5 +173,5 @@ _form.createComponentIfNotExists( .set("whenview", true) .set("width", 0) .set("x", 1) - .set("y", 1) + .set("y", 6) ) diff --git a/website/package.json b/website/package.json index a37b2e6..7570f87 100644 --- a/website/package.json +++ b/website/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@netuno/auth-client": "^1.0.3", "@netuno/service-client": "^1.0.7", "@testing-library/jest-dom": "^5.11.10", "@testing-library/react": "^11.2.5", diff --git a/website/src/App.css b/website/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/website/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/website/src/App.js b/website/src/App.js index 27e6d7d..e095aeb 100644 --- a/website/src/App.js +++ b/website/src/App.js @@ -1,20 +1,26 @@ import React, { useState, useEffect } from "react"; import _service from '@netuno/service-client'; -import { Form, Input, Button, Checkbox } from 'antd'; +import { Layout, Menu } from 'antd'; + +import { + BrowserRouter as Router, + Switch, + Route, + Link +} from "react-router-dom"; + +import Home from './pages/Home'; +import Login from './pages/Login'; +import Register from './pages/Register'; +import Main from './pages/Main'; import logo from './logo.svg'; -import './App.css'; +import './App.less'; -const layout = { - labelCol: { span: 8 }, - wrapperCol: { span: 16 }, -}; -const tailLayout = { - wrapperCol: { offset: 8, span: 16 }, -}; +const { Header, Footer, Content } = Layout; -function App() { +export default () => { const [ data, setData ] = useState([]); useEffect(()=> { _service({ @@ -27,77 +33,38 @@ function App() { } }); }, []); - const onFinish = (values) => { - console.log('Success:', values); - }; - const onFinishFailed = (errorInfo) => { - console.log('Failed:', errorInfo); - }; return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - - { JSON.stringify(data) } -
-
- - - - - - - - - - Remember me - - - - - -
-
+ + +
+ + Home + Login + Register + +
+ + + + + + + + + +
+ + + + + + +
+

Plataforma Social

+ Desenvolvimento de demonstração. +
+ + ); -} - -export default App; +}; diff --git a/website/src/App.less b/website/src/App.less new file mode 100644 index 0000000..d5589d2 --- /dev/null +++ b/website/src/App.less @@ -0,0 +1,5 @@ + +main { + padding: 50px; + min-height: calc(100vh - 150px) !important; +} diff --git a/website/src/pages/Home/index.js b/website/src/pages/Home/index.js new file mode 100644 index 0000000..513cad7 --- /dev/null +++ b/website/src/pages/Home/index.js @@ -0,0 +1,9 @@ +import React, { useState, useEffect } from "react"; + +export default () => { + return ( +
+

Home

+
+ ); +}; diff --git a/website/src/pages/Home/index.less b/website/src/pages/Home/index.less new file mode 100644 index 0000000..e69de29 diff --git a/website/src/pages/Login/index.js b/website/src/pages/Login/index.js new file mode 100644 index 0000000..15258df --- /dev/null +++ b/website/src/pages/Login/index.js @@ -0,0 +1,94 @@ +import React, { useState, useEffect } from "react"; + +import { Form, Input, Button, Checkbox } from 'antd'; + +import _auth from '@netuno/auth-client'; + +import { Redirect } from "react-router-dom"; + +import './index.less'; + +const layout = { + labelCol: { span: 8 }, + wrapperCol: { span: 16 }, +}; +const tailLayout = { + wrapperCol: { offset: 8, span: 16 }, +}; + +export default () => { + const [ loading, setLoading ] = useState(false); + const onFinish = (values) => { + setLoading(true); + _auth.login({ + username: values.username, + password: values.password, + success: ()=> { + setLoading(false); + }, + fail: ()=> { + alert("Fail."); + } + }); + }; + + const onFinishFailed = (errorInfo) => { + console.log('Failed:', errorInfo); + }; + + if (_auth.isLogged()) { + return ; + } + return ( +
+

Login

+
+
+ + + + + + + + + + Relembrar o acesso. + + + + + +
+
+
+ ); +}; diff --git a/website/src/pages/Login/index.less b/website/src/pages/Login/index.less new file mode 100644 index 0000000..df69bba --- /dev/null +++ b/website/src/pages/Login/index.less @@ -0,0 +1,4 @@ + +.login { + max-width: 600px; +} diff --git a/website/src/pages/Main/index.js b/website/src/pages/Main/index.js new file mode 100644 index 0000000..d6e5d03 --- /dev/null +++ b/website/src/pages/Main/index.js @@ -0,0 +1,24 @@ +import React, { useState, useEffect } from "react"; + +import { Redirect } from "react-router-dom"; + +import { Button } from 'antd'; + +import _auth from '@netuno/auth-client'; + +export default () => { + const [ loading, setLoading ] = useState(false); + if (!_auth.isLogged()) { + return ; + } + const onLogout = ()=> { + _auth.logout(); + setLoading(true); + } + return ( +
+

Olá...

+ +
+ ); +}; diff --git a/website/src/pages/Main/index.less b/website/src/pages/Main/index.less new file mode 100644 index 0000000..e69de29 diff --git a/website/src/pages/Register/index.js b/website/src/pages/Register/index.js new file mode 100644 index 0000000..c272b27 --- /dev/null +++ b/website/src/pages/Register/index.js @@ -0,0 +1,158 @@ +import React, { useState, useEffect } from "react"; + +import { Form, Input, Button, Select } from 'antd'; + +import _service from '@netuno/service-client'; + +import './index.less'; + +const layout = { + labelCol: { span: 8 }, + wrapperCol: { span: 16 }, +}; +const tailLayout = { + wrapperCol: { offset: 8, span: 16 }, +}; + +export default () => { + const [ loading, setLoading ] = useState(false); + const [ cities, setCities ] = useState([]); + + useEffect(()=> { + _service({ + url: 'cities', + success: (response) => { + setCities(response.json); + }, + fail: (e) => { + console.log("Service Error", e); + } + }) + }, []); + + const onFinish = (values) => { + setLoading(true); + _service({ + method: 'POST', + url: "register", + data: values, + success: (response) => { + setLoading(false); + }, + fail: (e) => { + console.log("Service Error", e); + } + }); + }; + + const onFinishFailed = (errorInfo) => { + console.log('Failed:', errorInfo); + }; + + return ( +
+

Register

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ); +}; diff --git a/website/src/pages/Register/index.less b/website/src/pages/Register/index.less new file mode 100644 index 0000000..807d93f --- /dev/null +++ b/website/src/pages/Register/index.less @@ -0,0 +1,4 @@ + +.register { + max-width: 600px; +}