Skip to content

Commit

Permalink
OK-365 vastaanottajien sivutus
Browse files Browse the repository at this point in the history
  • Loading branch information
marjakari committed Feb 7, 2024
1 parent 188849e commit d75e4c2
Show file tree
Hide file tree
Showing 14 changed files with 96 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class SecurityConfiguration {
@Bean
def cookieSerializer(): CookieSerializer = {
val serializer = new DefaultCookieSerializer();
serializer.setCookieName("viestinvalitys-raportointi-cookie");
serializer.setCookieName("JSESSIONID");
serializer.setCookiePath(RaportointiAPIConstants.RAPORTOINTI_API_PREFIX)
serializer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,6 @@ class LahetysResource {
else
Optional.of(vastaanottajat.last.kontakti.sahkoposti)
}

ResponseEntity.status(HttpStatus.OK).body(VastaanottajatSuccessResponse(
vastaanottajat.map(vastaanottaja => VastaanottajaResponse(vastaanottaja.tunniste.toString,
Optional.ofNullable(vastaanottaja.kontakti.nimi.getOrElse(null)), vastaanottaja.kontakti.sahkoposti,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,22 @@ object ParametriUtil {
else
Option.apply(parametri.get())

def asValidRaportointitila(parametri: Optional[String]): Option[String] =
// TODO tee fiksummin
if (!parametri.isPresent || !parametri.equals(RaportointiTila.epaonnistui) || !parametri.equals(RaportointiTila.kesken) || !parametri.equals(RaportointiTila.valmis))
Option.empty
def asValidRaportointitila(tila: Optional[String]): Option[String] =
if(tila.isPresent)
tila.get match
case t if RaportointiTila.values.exists(_.toString.equals(t)) => Option.apply(t)
case _ => Option.empty
else
Option.apply(parametri.get())
Option.empty

def valmis(p: VastaanottajanTila): Boolean =
raportointiTilat.valmiit.filter(tila => p.equals(tila)).size > 0
raportointiTilat.valmiit.contains(p)

def kesken(p: VastaanottajanTila): Boolean =
raportointiTilat.kesken.filter(tila => p.equals(tila)).size > 0
raportointiTilat.kesken.contains(p)

def epaonnistui(p: VastaanottajanTila): Boolean =
raportointiTilat.epaonnistuneet.filter(tila => p.equals(tila)).size > 0
raportointiTilat.epaonnistuneet.contains(p)
def getRaportointiTila(tila: VastaanottajanTila): Option[String] =
tila match
case t if valmis(t) => Option.apply("valmis")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -634,10 +634,9 @@ class KantaOperaatiot(db: JdbcBackend.JdbcDatabaseDef) {
sql"""
SELECT lahetykset.tunniste, otsikko, omistaja, lahettavapalvelu, lahettavanvirkailijanoid, lahettajannimi, lahettajansahkoposti, replyto, prioriteetti, to_json(luotu::timestamptz)#>>'{}'
FROM lahetykset
JOIN lahetykset_kayttooikeudet ON lahetykset_kayttooikeudet.lahetys_tunniste=lahetykset.tunniste
JOIN kayttooikeudet ON lahetykset_kayttooikeudet.kayttooikeus_tunniste=kayttooikeudet.tunniste
#${queryUtil.lahetyksenKayttooikeudetJoin(kayttooikeudet)}
WHERE lahetykset.tunniste=${tunniste.toString}::uuid
AND kayttooikeudet.organisaatio || '_' || kayttooikeudet.oikeus IN (#${kayttooikeudet.map(oikeus => "'" + oikeus.organisaatio.get + "_" + oikeus.oikeus + "'").mkString(",")})
#${queryUtil.kayttooikeudetWhere(kayttooikeudet)}
""".as[(String, String, String, String, String, String, String, String, String, String)].headOption), DB_TIMEOUT)
.map((tunniste, otsikko, omistaja, lahettavapalvelu, lahettavanVirkailijanOid, lahettajanNimi, lahettajanSahkoposti, replyto, prioriteetti, luotu) =>
Lahetys(UUID.fromString(tunniste), otsikko, omistaja, lahettavapalvelu, Option.apply(lahettavanVirkailijanOid),
Expand Down
2 changes: 1 addition & 1 deletion viestinvalitys-raportointi/.env.template
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
VIESTINTAPALVELU_URL=http://localhost:8080/
LOGIN_URL=http://localhost:8080/login
# matchattava viestintäpalvelun asettaman raportointisession cookien nimeen
COOKIE_NAME=viestinvalitys-raportointi-cookie
COOKIE_NAME=JSESSIONID
3 changes: 1 addition & 2 deletions viestinvalitys-raportointi/src/app/Lahetykset.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
'use client'
import { Box, Link as MuiLink, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';
import { Link as MuiLink, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';
// importoidaan MUI Link ja Nextjs Link komponentit eri nimillä
import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined';
import NextLink from 'next/link';
import { Lahetys } from './lib/types';
import LocalDateTime from './components/LocalDateTime';
import { LahetysStatus} from './components/LahetysStatus';
import { lahetyksenStatus } from './lib/util';

const LahetyksetTable = ({lahetykset}: {lahetykset: Lahetys[]}) => {
return (
Expand Down
14 changes: 8 additions & 6 deletions viestinvalitys-raportointi/src/app/LahetyksetSivutus.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
'use client'
import { useSearchParams } from "next/navigation"
import { useCallback } from "react"
import { Link as MuiLink } from '@mui/material';
import ChevronRightIcon from '@mui/icons-material/ChevronRight';
import { Button } from '@mui/material';
// importoidaan MUI Link ja Nextjs Link komponentit eri nimillä
import NextLink from 'next/link';

Expand All @@ -18,12 +19,13 @@ const LahetyksetSivutus = ({ seuraavatAlkaen }: { seuraavatAlkaen?: string }) =>
},
[searchParams]
)

return (
seuraavatAlkaen ?
<MuiLink component={NextLink} href={'/?' + createQueryString('seuraavatAlkaen', seuraavatAlkaen)}>
Seuraavat
</MuiLink>
seuraavatAlkaen ?
<Button aria-label="seuraavat" href={'/?' + createQueryString('seuraavatAlkaen', seuraavatAlkaen)}
size="large" component={NextLink} endIcon={<ChevronRightIcon />}>
Seuraavat
</Button>
: <></>
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use client';
import { FormControl, FormLabel, InputLabel, MenuItem, Select, TextField } from '@mui/material';
import { FormControl, FormControlLabel, FormGroup, FormLabel, InputLabel, MenuItem, Select, TextField } from '@mui/material';
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
import { useDebouncedCallback } from 'use-debounce';
import { useCallback } from 'react';
Expand Down Expand Up @@ -36,15 +36,28 @@ export default function VastaanottajaHaku() {
return (
<FormControl fullWidth>
<FormLabel>Hae vastaanottajia</FormLabel>
<TextField
<TextField
id="hakusana"
variant="outlined"
variant="outlined"
disabled
placeholder={'Hae nimellä tai sähköpostiosoitteella'}
onChange={(e) => {
handleTypedSearch(e.target.value);
}}
}}
defaultValue={searchParams?.get('hakutermi')?.toString()}/>
<FormLabel>Tila</FormLabel>
<Select
id='tila'
name='vastaanottotila'
defaultValue={''}
onChange={(e) => {
router.push(pathname + '?' + createQueryString(e.target.name, e.target.value))
}}
>
<MenuItem value={''}>Kaikki</MenuItem>
<MenuItem value={'epaonnistui'} disabled>Lähetys epäonnistui</MenuItem>
<MenuItem value={'kesken'} disabled>Lähetys kesken</MenuItem>
</Select>
</FormControl>
);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use client'
import { DataGrid, GridColDef } from "@mui/x-data-grid";
import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined';
import { VastaanotonTila, Vastaanottaja } from "../../lib/types";
import { getLahetysStatus } from "../../lib/util";
import { Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material";
Expand Down Expand Up @@ -47,4 +47,15 @@ const VastaanottajatTable = ({vastaanottajat}: {vastaanottajat: Vastaanottaja[]}
</TableContainer>
)}

export default VastaanottajatTable
const Vastaanottajat = ({vastaanottajat}: {vastaanottajat: Vastaanottaja[]}) => {

return (
vastaanottajat.length > 0
? <VastaanottajatTable vastaanottajat={vastaanottajat} />
: <div>
<FolderOutlinedIcon fontSize='large'/>
<p>Hakuehdoilla ei löytynyt tuloksia</p>
</div>
)}

export default Vastaanottajat
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export async function retrySend(formData: FormData) {

const rawFormData = {
lahetystunniste: formData.get('lahetysTunniste'),
vastaanottajaTunniste: formData.get('vastaaottajaTunniste'),
vastaanottajaTunniste: formData.get('vastaanottajaTunniste'),
}
// param validation
// api call
Expand Down
28 changes: 20 additions & 8 deletions viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
import { Suspense } from 'react'
import { fetchLahetyksenVastaanottajat, fetchLahetys } from "../../lib/data";
import { FormControl, FormLabel, Grid, Skeleton, TextField } from '@mui/material';
import { Grid, Skeleton } from '@mui/material';
import { Lahetys } from '@/app/lib/types';
import LocalDateTime from '@/app/components/LocalDateTime';
import { lahetyksenStatus } from '@/app/lib/util';
import VastaanottajatTable from './Vastaanottajat';
import Vastaanottajat from './Vastaanottajat';
import { LahetysStatus } from '@/app/components/LahetysStatus';
import VastaanottajaHaku from './VastaanottajaHaku';
import VastaanottajatSivutus from './VastaanottajatSivutus';
import VirheAlert from '@/app/components/VirheAlert';

export default async function Page({ params }: { params: { tunniste: string } }) {
export default async function Page({ params, searchParams }: { params: { tunniste: string },
searchParams?: {
alkaen?: string
sivutustila?: string
hakukentta?: string
hakusana?: string
tila?: string
} }) {
const lahetys: Lahetys = await fetchLahetys(params.tunniste)
const data = await fetchLahetyksenVastaanottajat(params.tunniste)
const data = await fetchLahetyksenVastaanottajat(params.tunniste,
{alkaen: searchParams?.alkaen, sivutustila: searchParams?.sivutustila})
const virheet = data?.virhe
return (
<div>
<h1>Lähetysraportti</h1>
Expand All @@ -26,18 +36,20 @@ import VastaanottajaHaku from './VastaanottajaHaku';
<Grid item xs={9}>{lahetys.replyTo}</Grid>
<Grid item xs={3}><b>Palvelu</b></Grid>
<Grid item xs={9}>{lahetys.lahettavaPalvelu}</Grid>
<Grid item xs={3}><b>Hakuehdot</b></Grid>
<Grid item xs={9}>TODO onko tämä kohta kälisuunnitelmassa lähetyksen metadata???</Grid>
<Grid item xs={3}><b>Metadata-avain TODO</b></Grid>
<Grid item xs={9}>Metadata-avaimen arvot TODO </Grid>
<Grid item xs={3}><b>Lähetystunnus</b></Grid>
<Grid item xs={9}>{lahetys.lahetysTunniste}</Grid>
<Grid item xs={3}><b>Lähetyksen tila</b></Grid>
<Grid item xs={9} display="flex" alignItems="center"><LahetysStatus tilat={lahetys.tilat || []}/></Grid>
<Grid item xs={12}>
<h2>Vastaanottajat</h2>
<VirheAlert virheet={virheet}/>
<LahetysStatus tilat={lahetys.tilat || []}/>
<VastaanottajaHaku />
<Suspense fallback={<Skeleton variant="rectangular" width={210} height={60} />}>
<VastaanottajatTable vastaanottajat={data.vastaanottajat}/>
<Vastaanottajat vastaanottajat={data.vastaanottajat || []}/>
<VastaanottajatSivutus seuraavatAlkaen={data.seuraavatAlkaen} viimeisenTila={data.viimeisenTila}/>
</Suspense>
</Grid>
</Grid>
Expand Down
4 changes: 3 additions & 1 deletion viestinvalitys-raportointi/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { AppRouterCacheProvider } from '@mui/material-nextjs/v13-appRouter';
import './globals.css'
import Link from 'next/link';
import { Roboto } from 'next/font/google'
import HomeIconLink from './components/HomeIconLink';

const roboto = Roboto({
weight: ['400', '500'],
Expand All @@ -25,7 +26,8 @@ export default function RootLayout({
<body>
<header>
<nav>
<Link href="/">Home</Link>
<HomeIconLink />
{/* <Link href="/">Home</Link> */}
</nav>
</header>
<AppRouterCacheProvider options={{ enableCssLayer: true }}>{children}</AppRouterCacheProvider>
Expand Down
20 changes: 12 additions & 8 deletions viestinvalitys-raportointi/src/app/lib/data.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import { cookies, headers } from 'next/headers'
import { LahetysHakuParams } from './types'
import { LahetysHakuParams, VastaanottajatHakuParams } from './types'
import { apiUrl, cookieName, loginUrl } from './configurations'
import { redirect } from 'next/navigation'

const LAHETYKSET_SIVUTUS_KOKO = 20
const VASTAANOTTAJAT_SIVUTUS_KOKO = 10
// TODO apuwrapperi headerien asettamiseen ja virheenkäsittelyyn
export async function fetchLahetykset(hakuParams: LahetysHakuParams) {
export async function fetchLahetykset(hakuParams: LahetysHakuParams) {
const sessionCookie = cookies().get(cookieName)
if (sessionCookie === undefined) {
console.info('no session cookie, redirect to login')
redirect(loginUrl)
}
const fetchUrlBase = `${apiUrl}/lahetykset/lista?enintaan=20`
const fetchUrlBase = `${apiUrl}/lahetykset/lista?enintaan=${LAHETYKSET_SIVUTUS_KOKO}`
console.info(hakuParams)
var fetchParams = hakuParams.seuraavatAlkaen ? `&alkaen=${hakuParams.seuraavatAlkaen}` : ''
if(hakuParams?.hakukentta && hakuParams.hakusana) {
Expand Down Expand Up @@ -48,7 +50,7 @@ export async function fetchLahetykset(hakuParams: LahetysHakuParams) {
cache: 'no-store'
})
console.log(res.status)
if (!res.ok || res.status===400 || res.status===410) {
if (!(res.ok || res.status===400 || res.status===410)) {
if(res.status===401) {
redirect(loginUrl)
}
Expand All @@ -58,22 +60,24 @@ export async function fetchLahetykset(hakuParams: LahetysHakuParams) {
return res.json()
}

export async function fetchLahetyksenVastaanottajat(lahetysTunnus: string) {
export async function fetchLahetyksenVastaanottajat(lahetysTunnus: string, hakuParams: VastaanottajatHakuParams) {
const sessionCookie = cookies().get(cookieName)
if (sessionCookie === undefined) {
console.info('no session cookie, redirect to login')
redirect(loginUrl)
}
const headersInstance = headers()
const url = `${apiUrl}/lahetykset/${lahetysTunnus}/vastaanottajat`
const url = `${apiUrl}/lahetykset/${lahetysTunnus}/vastaanottajat?enintaan=${VASTAANOTTAJAT_SIVUTUS_KOKO}`
console.log(url)
var fetchParams = hakuParams.alkaen ? `&alkaen=${hakuParams.alkaen}&sivutustila=${hakuParams.sivutustila || 'kesken'}` : ''
console.log(url.concat(fetchParams))
const cookieParam = sessionCookie.name+'='+sessionCookie.value
const res = await fetch(url,{
const res = await fetch(url.concat(fetchParams),{
headers: { cookie: cookieParam ?? '' }, // Forward the authorization header
cache: 'no-store'
})
console.log(res.status)
if (!res.ok) {
if (!(res.ok || res.status===400 || res.status===410)) {
if(res.status===401) {
redirect(loginUrl)
}
Expand Down
8 changes: 8 additions & 0 deletions viestinvalitys-raportointi/src/app/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ export type LahetysHakuParams = {
hakusana?: string
}

export type VastaanottajatHakuParams = {
alkaen?: string
sivutustila?: string
hakukentta?: string
hakusana?: string
tila?: string
}

export type LahetyksenVastaanottoTila = {
vastaanottotila: VastaanotonTila
vastaanottajaLkm: number
Expand Down

0 comments on commit d75e4c2

Please sign in to comment.