Skip to content

Commit

Permalink
[83] Add support for a proper homepage
Browse files Browse the repository at this point in the history
Bug: #83
Signed-off-by: Stéphane Bégaudeau <[email protected]>
  • Loading branch information
sbegaudeau committed Jun 19, 2023
1 parent b686005 commit 2ff4e75
Show file tree
Hide file tree
Showing 29 changed files with 659 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
@Controller
public class AuthenticationTokenController {

private IAuthenticationTokenService authenticationTokenService;
private final IAuthenticationTokenService authenticationTokenService;

public AuthenticationTokenController(IAuthenticationTokenService authenticationTokenService) {
this.authenticationTokenService = Objects.requireNonNull(authenticationTokenService);
Expand All @@ -59,10 +59,9 @@ public Connection<AuthenticationTokenDTO> authenticationTokens(@Argument int pag
var edges = pageData.stream().map(authenticationToken -> {
var value = new Relay().toGlobalId("AuthenticationToken", authenticationToken.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<AuthenticationTokenDTO> edge = new DefaultEdge<>(authenticationToken, cursor);
return edge;
return (Edge<AuthenticationTokenDTO>) new DefaultEdge<>(authenticationToken, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.svalyn.studio.application.controllers.dto.ProfileDTO;
import com.svalyn.studio.application.controllers.organization.dto.OrganizationDTO;
import com.svalyn.studio.application.controllers.project.dto.ProjectDTO;
import com.svalyn.studio.application.controllers.viewer.Viewer;
import com.svalyn.studio.application.services.activity.api.IActivityService;
import graphql.relay.Connection;
import graphql.relay.DefaultConnection;
Expand Down Expand Up @@ -60,7 +61,7 @@ public Connection<ActivityEntryDTO> activityEntries(ProfileDTO profile, @Argumen
Edge<ActivityEntryDTO> edge = new DefaultEdge<>(activityEntry, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand All @@ -73,7 +74,7 @@ public Connection<ActivityEntryDTO> activityEntries(OrganizationDTO organization
Edge<ActivityEntryDTO> edge = new DefaultEdge<>(activityEntry, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand All @@ -86,7 +87,20 @@ public Connection<ActivityEntryDTO> activityEntries(ProjectDTO project, @Argumen
Edge<ActivityEntryDTO> edge = new DefaultEdge<>(activityEntry, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

@SchemaMapping(typeName = "Viewer")
public Connection<ActivityEntryDTO> activityEntries(Viewer viewer, @Argument int page, @Argument int rowsPerPage) {
var pageData = this.activityService.findAllVisibleByUsername(viewer.username(), page, rowsPerPage);
var edges = pageData.stream().map(activityEntry -> {
var value = new Relay().toGlobalId("ActivityEntry", activityEntry.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<ActivityEntryDTO> edge = new DefaultEdge<>(activityEntry, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public Connection<DomainDTO> domains(@Argument int page, @Argument int rowsPerPa
Edge<DomainDTO> edge = new DefaultEdge<>(domain, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public Connection<BranchDTO> branches(ProjectDTO project, @Argument int page, @A
Edge<BranchDTO> edge = new DefaultEdge<>(branch, cursor);
return edge;
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@ public Connection<ChangeDTO> changes(BranchDTO branch, @Argument int page, @Argu
var edges = pageData.stream().map(change -> {
var value = new Relay().toGlobalId("Change", change.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<ChangeDTO> edge = new DefaultEdge<>(change, cursor);
return edge;
return (Edge<ChangeDTO>) new DefaultEdge<>(change, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.size());
return new DefaultConnection<>(edges, pageInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,9 @@ public Connection<ChangeProposalDTO> changeProposals(ProjectDTO project, @Argume
var edges = pageData.stream().map(changeProposal -> {
var value = new Relay().toGlobalId("ChangeProposal", changeProposal.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<ChangeProposalDTO> edge = new DefaultEdge<>(changeProposal, cursor);
return edge;
return (Edge<ChangeProposalDTO>) new DefaultEdge<>(changeProposal, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand All @@ -90,8 +89,7 @@ public Connection<ReviewDTO> reviews(ChangeProposalDTO changeProposal) {
var edges = pageData.stream().map(reviewDTO -> {
var value = new Relay().toGlobalId("Review", reviewDTO.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<ReviewDTO> edge = new DefaultEdge<>(reviewDTO, cursor);
return edge;
return (Edge<ReviewDTO>) new DefaultEdge<>(reviewDTO, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.size());
return new DefaultConnection<>(edges, pageInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ public Connection<ChangeResourceMetadataDTO> resources(ChangeDTO change) {
var edges = pageData.stream().map(changeResourceDTO -> {
var value = new Relay().toGlobalId("ChangeResource", changeResourceDTO.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<ChangeResourceMetadataDTO> edge = new DefaultEdge<>(changeResourceDTO, cursor);
return edge;
return (Edge<ChangeResourceMetadataDTO>) new DefaultEdge<>(changeResourceDTO, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.size());
return new DefaultConnection<>(edges, pageInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,9 @@ public Connection<NotificationDTO> notifications(@Argument List<NotificationStat
var edges = pageData.stream().map(notification -> {
var value = new Relay().toGlobalId("Notification", notification.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<NotificationDTO> edge = new DefaultEdge<>(notification, cursor);
return edge;
return (Edge<NotificationDTO>) new DefaultEdge<>(notification, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,9 @@ public Connection<InvitationDTO> invitations(@Argument int page, @Argument int r
var edges = pageData.stream().map(invitation -> {
var value = new Relay().toGlobalId("Invitation", invitation.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<InvitationDTO> edge = new DefaultEdge<>(invitation, cursor);
return edge;
return (Edge<InvitationDTO>) new DefaultEdge<>(invitation, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand All @@ -74,10 +73,9 @@ public Connection<InvitationDTO> invitations(OrganizationDTO organization, @Argu
var edges = pageData.stream().map(invitation -> {
var value = new Relay().toGlobalId("Invitation", invitation.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<InvitationDTO> edge = new DefaultEdge<>(invitation, cursor);
return edge;
return (Edge<InvitationDTO>) new DefaultEdge<>(invitation, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,9 @@ public Connection<MembershipDTO> memberships(OrganizationDTO organization, @Argu
var edges = pageData.stream().map(membership -> {
var value = new Relay().toGlobalId("Membership", membership.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<MembershipDTO> edge = new DefaultEdge<>(membership, cursor);
return edge;
return (Edge<MembershipDTO>) new DefaultEdge<>(membership, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,9 @@ public Connection<OrganizationDTO> organizations() {
var edges = page.stream().map(organization -> {
var value = new Relay().toGlobalId("Organization", organization.identifier());
var cursor = new DefaultConnectionCursor(value);
Edge<OrganizationDTO> edge = new DefaultEdge<>(organization, cursor);
return edge;
return (Edge<OrganizationDTO>) new DefaultEdge<>(organization, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, page.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, page.hasPrevious(), page.hasNext(), page.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,9 @@ public Connection<ProjectDTO> projects(OrganizationDTO organization, @Argument i
var edges = pageData.stream().map(project -> {
var value = new Relay().toGlobalId("Project", project.identifier());
var cursor = new DefaultConnectionCursor(value);
Edge<ProjectDTO> edge = new DefaultEdge<>(project, cursor);
return edge;
return (Edge<ProjectDTO>) new DefaultEdge<>(project, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,9 @@ public Connection<TagDTO> tags(OrganizationDTO organization, @Argument int page,
var edges = pageData.stream().map(tag -> {
var value = new Relay().toGlobalId("Tag", tag.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<TagDTO> edge = new DefaultEdge<>(tag, cursor);
return edge;
return (Edge<TagDTO>) new DefaultEdge<>(tag, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand All @@ -79,10 +78,9 @@ public Connection<TagDTO> tags(ProjectDTO project, @Argument int page, @Argument
var edges = pageData.stream().map(tag -> {
var value = new Relay().toGlobalId("Tag", tag.id().toString());
var cursor = new DefaultConnectionCursor(value);
Edge<TagDTO> edge = new DefaultEdge<>(tag, cursor);
return edge;
return (Edge<TagDTO>) new DefaultEdge<>(tag, cursor);
}).toList();
var pageInfo = new PageInfoWithCount(null, null, false, false, pageData.getTotalElements());
var pageInfo = new PageInfoWithCount(null, null, pageData.hasPrevious(), pageData.hasNext(), pageData.getTotalElements());
return new DefaultConnection<>(edges, pageInfo);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,18 @@ private Optional<ActivityEntryDTO> toDTO(ActivityEntry activityEntry) {
createdBy));
}

@Override
@Transactional(readOnly = true)
public Page<ActivityEntryDTO> findAllVisibleByUsername(String username, int page, int rowsPerPage) {
return this.accountRepository.findByUsername(username).map(Account::getId).map(userId -> {
var activityEntries = this.activityEntryRepository.findAllVisibleByUserId(userId, page * rowsPerPage, rowsPerPage).stream()
.flatMap(entry -> this.toDTO(entry).stream())
.toList();
var count = this.activityEntryRepository.countAllByUserId(userId);
return new PageImpl<>(activityEntries, PageRequest.of(page, rowsPerPage), count);
}).orElse(new PageImpl<>(List.of()));
}

@Override
@Transactional(readOnly = true)
public Page<ActivityEntryDTO> findAllByUsername(String username, int page, int rowsPerPage) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
*/
public interface IActivityService {

Page<ActivityEntryDTO> findAllVisibleByUsername(String username, int page, int rowsPerPage);

Page<ActivityEntryDTO> findAllByUsername(String username, int page, int rowsPerPage);

Page<ActivityEntryDTO> findAllByOrganizationId(UUID organizationId, int page, int rowsPerPage);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ type Query {

type PageInfo {
count: Int!
hasPreviousPage: Boolean!
hasNextPage: Boolean!
}

type Viewer {
Expand All @@ -26,6 +28,7 @@ type Viewer {
authenticationTokens(page: Int!, rowsPerPage: Int!): ViewerAuthenticationTokensConnection!
domains(page: Int!, rowsPerPage: Int!): ViewerDomainsConnection!
domain(identifier: ID!): Domain
activityEntries(page: Int!, rowsPerPage: Int!): ViewerActivityEntriesConnection!
}

type ViewerInvitationsConnection {
Expand All @@ -45,6 +48,15 @@ type ViewerOrganizationsEdge {
node: Organization!
}

type ViewerActivityEntriesConnection {
edges: [ViewerActivityEntriesEdge!]!
pageInfo: PageInfo!
}

type ViewerActivityEntriesEdge {
node: ActivityEntry!
}

type Profile {
name: String!
username: String!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@
*/
@Repository
public interface IActivityEntryRepository extends PagingAndSortingRepository<ActivityEntry, UUID>, ListCrudRepository<ActivityEntry, UUID> {

@Query(value = """
SELECT activityEntry.*
FROM activity activityEntry
ORDER BY activityEntry.created_on DESC
LIMIT :limit
OFFSET :offset
""")
List<ActivityEntry> findAllVisibleByUserId(UUID userId, long offset, int limit);

@Query(value = """
SELECT activityEntry.*
FROM activity activityEntry
Expand Down
69 changes: 24 additions & 45 deletions frontend/svalyn-studio-app/src/views/home/HomeView.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2022 Stéphane Bégaudeau.
* Copyright (c) 2022, 2023 Stéphane Bégaudeau.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
Expand All @@ -17,50 +17,29 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

import { gql, useQuery } from '@apollo/client';
import { useEffect, useState } from 'react';
import { Navigate } from 'react-router-dom';
import { GetOrganizationsData, GetOrganizationsVariables, HomeViewState } from './HomeView.types';

const getOrganizationsQuery = gql`
query getOrganizations {
viewer {
organizations {
edges {
node {
identifier
}
}
}
}
}
`;
import Box from '@mui/material/Box';
import { Navbar } from '../../navbars/Navbar';
import { HomeViewCenterPanel } from './HomeViewCenterPanel';
import { HomeViewLeftPanel } from './HomeViewLeftPanel';
import { HomeViewRightPanel } from './HomeViewRightPanel';

export const HomeView = () => {
const [state, setState] = useState<HomeViewState>({
organizations: null,
});

const { loading, data } = useQuery<GetOrganizationsData, GetOrganizationsVariables>(getOrganizationsQuery);
useEffect(() => {
if (!loading) {
if (data) {
const {
viewer: { organizations },
} = data;
setState((prevState) => ({ ...prevState, organizations: organizations.edges.map((edge) => edge.node) }));
}
}
}, [loading, data]);

if (state.organizations) {
if (state.organizations.length > 0) {
const organization = state.organizations[0];
return <Navigate to={`/orgs/${organization.identifier}`} />;
} else {
return <Navigate to="/new/organization" />;
}
}

return null;
return (
<Box sx={{ display: 'flex', flexDirection: 'column', minHeight: '100vh' }}>
<Navbar />
<Box
sx={{
display: 'grid',
gridTemplateRows: '1fr',
gridTemplateColumns: '1fr 70% 1fr',
alignItems: 'stretch',
flexGrow: 1,
}}
>
<HomeViewLeftPanel />
<HomeViewCenterPanel />
<HomeViewRightPanel />
</Box>
</Box>
);
};
Loading

0 comments on commit 2ff4e75

Please sign in to comment.