Browse Source

Sessão 15

master
eduveks 5 years ago
parent
commit
7877999a4b
10 changed files with 152 additions and 7 deletions
  1. +42
    -0
      server/services/api/communities/detail.get.js
  2. +2
    -0
      server/services/api/communities/detail.options.js
  3. +11
    -2
      server/services/api/communities/get.js
  4. +1
    -0
      website/package.json
  5. +4
    -0
      website/src/App.js
  6. +6
    -2
      website/src/pages/Communities/Item/index.js
  7. +1
    -2
      website/src/pages/Communities/index.js
  8. +1
    -1
      website/src/pages/Communities/index.less
  9. +71
    -0
      website/src/pages/Community/index.js
  10. +13
    -0
      website/src/pages/Community/index.less

+ 42
- 0
server/services/api/communities/detail.get.js View File

@ -0,0 +1,42 @@
// _core : social/userPessoa
const dbComunidade = _db.queryFirst(`
SELECT
uid,
nome,
descricao,
imagem,
(
SELECT count(id)
FROM pessoa_comunidade
WHERE pessoa_id = ?
AND comunidade_id = comunidade.id
) seguindo,
(
SELECT count(id)
FROM pessoa_comunidade
WHERE comunidade_id = comunidade.id
) pessoas,
(
SELECT count(id)
FROM publicacao
WHERE comunidade_id = comunidade.id
) publicacoes
FROM comunidade
WHERE active = true
AND uid = ?::uuid
ORDER BY nome
`, userPessoa().getInt("id"), _req.getString("uid"))
const data = _val.map()
if (dbComunidade != null) {
data.set("uid", dbComunidade.getString("uid"))
.set("name", dbComunidade.getString("nome"))
.set("description", dbComunidade.getString("descricao"))
.set("following", dbComunidade.getInt("seguindo") > 0)
.set("people", dbComunidade.getInt("pessoas"))
.set("publications", dbComunidade.getInt("publicacoes"))
}
_out.json(data)

+ 2
- 0
server/services/api/communities/detail.options.js View File

@ -0,0 +1,2 @@
_out.json(_val.map().set("result", true))

+ 11
- 2
server/services/api/communities/get.js View File

@ -1,23 +1,32 @@
// _core : social/userPessoa
const dbComunidades = _db.query(` const dbComunidades = _db.query(`
SELECT SELECT
uid, uid,
nome, nome,
descricao, descricao,
imagem
imagem,
(
SELECT count(id)
FROM pessoa_comunidade
WHERE pessoa_id = ?
AND comunidade_id = comunidade.id
) seguindo
FROM comunidade FROM comunidade
WHERE active = true WHERE active = true
ORDER BY nome ORDER BY nome
`)
`, userPessoa().getInt("id"))
const data = _val.list() const data = _val.list()
for (const dbComunidade of dbComunidades) { for (const dbComunidade of dbComunidades) {
data.add( data.add(
_val.map() _val.map()
.set("uid", dbComunidade.getString("uid")) .set("uid", dbComunidade.getString("uid"))
.set("name", dbComunidade.getString("nome")) .set("name", dbComunidade.getString("nome"))
.set("description", dbComunidade.getString("descricao")) .set("description", dbComunidade.getString("descricao"))
.set("following", dbComunidade.getInt("seguindo") > 0)
) )
} }


+ 1
- 0
website/package.json View File

@ -3,6 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@ant-design/icons": "^4.6.2",
"@netuno/auth-client": "^1.0.3", "@netuno/auth-client": "^1.0.3",
"@netuno/service-client": "^1.0.7", "@netuno/service-client": "^1.0.7",
"@testing-library/jest-dom": "^5.11.10", "@testing-library/jest-dom": "^5.11.10",


+ 4
- 0
website/src/App.js View File

@ -14,6 +14,7 @@ import Home from './pages/Home';
import Login from './pages/Login'; import Login from './pages/Login';
import Register from './pages/Register'; import Register from './pages/Register';
import Communities from './pages/Communities'; import Communities from './pages/Communities';
import Community from './pages/Community';
import Main from './pages/Main'; import Main from './pages/Main';
import Core from './Core'; import Core from './Core';
@ -95,6 +96,9 @@ function App() {
<Route path="/main"> <Route path="/main">
<Main /> <Main />
</Route> </Route>
<Route path="/community/:uid">
<Community />
</Route>
<Route path="/"> <Route path="/">
<Home /> <Home />
</Route> </Route>


+ 6
- 2
website/src/pages/Communities/Item/index.js View File

@ -1,13 +1,17 @@
import React, { useEffect, useState} from 'react'; import React, { useEffect, useState} from 'react';
import { Link } from "react-router-dom";
import _service from '@netuno/service-client'; import _service from '@netuno/service-client';
import { Button, notification } from 'antd'; import { Button, notification } from 'antd';
import { CheckCircleOutlined } from '@ant-design/icons';
import "./index.less"; import "./index.less";
export default ({ data })=> { export default ({ data })=> {
const [following, setFollowing] = useState(false);
const [following, setFollowing] = useState(data.following);
const onFollow = ()=> { const onFollow = ()=> {
_service({ _service({
method: 'PUT', method: 'PUT',
@ -28,7 +32,7 @@ export default ({ data })=> {
const servicePrefix = _service.config().prefix; const servicePrefix = _service.config().prefix;
return ( return (
<li style={{ backgroundImage: `url(${ servicePrefix }/api/communities/image?uid=${ data.uid })` }}> <li style={{ backgroundImage: `url(${ servicePrefix }/api/communities/image?uid=${ data.uid })` }}>
<h1>{ data.name } <Button type="link" onClick={onFollow}>Seguir</Button></h1>
<h1><Link to={`/community/${data.uid}`}>{ data.name }</Link> { following ? <CheckCircleOutlined /> : null }</h1>
</li> </li>
); );
}; };

+ 1
- 2
website/src/pages/Communities/index.js View File

@ -33,10 +33,9 @@ export default ()=> {
} }
}); });
}, []); }, []);
const servicePrefix = _service.config().prefix;
return ( return (
<div className="communities"> <div className="communities">
<h1>Comunidades...</h1>{servicePrefix}
<h1>Comunidades...</h1>
<ul className="communities__list"> <ul className="communities__list">
{ communities.length > 0 && communities.map( { communities.length > 0 && communities.map(
(community) => { (community) => {


+ 1
- 1
website/src/pages/Communities/index.less View File

@ -8,7 +8,7 @@
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 50% 50%; background-position: 50% 50%;
height: 300px;
height: 200px;
h1 { h1 {
background-color: rgba(0, 0, 0, 0.75); background-color: rgba(0, 0, 0, 0.75);
padding: 10px; padding: 10px;


+ 71
- 0
website/src/pages/Community/index.js View File

@ -0,0 +1,71 @@
import React, { useEffect, useState} from 'react';
import _service from '@netuno/service-client';
import { useParams } from "react-router-dom";
import { Button, Spin, Row, Col, notification } from 'antd';
import { CheckCircleOutlined } from '@ant-design/icons';
import "./index.less";
export default ()=> {
const [data, setData] = useState(null);
const [following, setFollowing] = useState(false);
const { uid } = useParams();
useEffect(()=> {
_service({
method: 'GET',
url: "api/communities/detail",
data: { uid },
success: (response) => {
setData(response.json);
setFollowing(response.json.following);
},
fail: (e) => {
console.log("Service Error", e);
notification["error"]({
message: 'Informações',
description: 'Não foi possível carregar a informação.',
});
}
});
}, []);
const onFollow = ()=> {
_service({
method: 'PUT',
url: "api/communities/follow",
data: {uid: data.uid},
success: (response) => {
setFollowing(response.json.result);
},
fail: (e) => {
console.log("Service Error", e);
notification["error"]({
message: 'Informações',
description: 'Não foi possível carregar a informação.',
});
}
});
};
const servicePrefix = _service.config().prefix;
if (data == null) {
return <Spin />;
}
return (
<div className="community">
<div className="community__banner" style={{ backgroundImage: `url(${ servicePrefix }/api/communities/image?uid=${ data.uid })` }}>
<h1>{ data.name } { following ? <CheckCircleOutlined /> : <Button type="link" onClick={onFollow}>Seguir</Button> }</h1>
</div>
<Row>
<Col span={8}>Pessoas: {data.people}</Col>
<Col span={8}>Publicações: {data.publications}</Col>
<Col span={8}>{ following ? <><CheckCircleOutlined /> Seguindo</> : <Button type="link" onClick={onFollow}>Seguir</Button> }</Col>
</Row>
</div>
);
};

+ 13
- 0
website/src/pages/Community/index.less View File

@ -0,0 +1,13 @@
.community {
&__banner {
background-size: cover;
background-repeat: no-repeat;
background-position: 50% 50%;
height: 300px;
h1 {
background-color: rgba(0, 0, 0, 0.75);
padding: 10px;
}
}
}

Loading…
Cancel
Save