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 ( -
- Edit src/App.js and save to reload.
-