wiki:UseCaseImplementations

Version 3 (modified by 211012, 3 months ago) ( diff )

--

Имплементација на корисничките сценарија во техничкиот прототип

Во досега имплементираниот технички прототип на апликацијата имплементирани се следните сценарија:

ID UseCase
1 Пријавува учество на партија и кандидати
2 Гласа онлајн
3 Прегледува вкупна излезност
4 Прегледува вкунпи резултати од избори со кандидат
5 Прегледува избирачки список
6 Прегледува изборни единици
7 Ажурира изборни единици
8 Прегледува гласачки места
9 Ажурира изборни единици
10 Прегледува гласачки места
11 Креира инстанца од избори
12 Прегледува типови на избори
13 Ажурира типови на избори

Гласа онлајн

За да ја користи оваа функционалност, корисникот треба да пристапи до страницата /vote каде што го добива следниот приказ:

За ова е одговорен следниот контролер

    @GetMapping("/vote")
    public String showVote(@RequestParam(required = false) Boolean error,
                           Model m) {
        m.addAttribute("replaceTemplate", "vote_form");
        m.addAttribute("error", error);
        return "index";
    }

По успешен внес на потребните податоци во формуларот (број на лична карта и ЕМБГ), истиот се поднесува со клик на копчето „Продолжи“, при што се испраќа POST барање кое го пречекува следниот контролер:

    @PostMapping("/vote")
    public String vote(
            Model m,
            @RequestParam String numberLicence,
            @RequestParam String embg,
            HttpServletRequest httpServletRequest) {
        Citizen citizen = citizenService.validateCitizen(embg, numberLicence);
        if (citizen != null) {
            httpServletRequest.getSession(true).setAttribute("citizenId", citizen.getId());
            m.addAttribute("candidacies", candidacyService.findAll());
            m.addAttribute("replaceTemplate", "candidacy_list");
            return "redirect:/vote/available";
        } else {
            m.addAttribute("replaceTemplate", "vote_form");
            return "redirect:/vote?error=true";
        }
    }

Овде, најпрвин се прави валидација на корисникот преку повикување на соодветната функција од сервисот за граѓани

    @Override
    public Citizen validateCitizen(String idNum, String documentNumber)
    {
        try {
            Citizen citizen = findByIdNum(idNum);
            return citizen.getDocument().getDocumentNumber().equals(documentNumber) ? citizen : null;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

За спречување злопупотреба целиот процес на гласање се одвива преку чување на потребните атрибути во сесија на серверот, па така, по успешна валидација на граѓанинот, се креира нова сесија, како атрибут се запишува неговиот идентификатор и корисникот се пренасочува до страницата за избор на инстанца од избори на која ќе гласата (/vote/available). Во спротивно, корисникот се враќа на страницата за најава и се испишува соодветна порака за грешка. По пренасочувањето, корисникот го добива следниот приказ, а за ова барање е одговорен контролерот:

    @GetMapping("/vote/available")
    public String getAvailableElections(Model m,
                                        HttpServletRequest httpServletRequest) {
        if (httpServletRequest.getSession(false) == null) {
            return "redirect:/vote";
        }
        Long citizenId = (Long) httpServletRequest.getSession().getAttribute("citizenId");
        List<CandidatesElectionRealization> availableElections = candidatesElectionRealizationService.findAvailable(citizenId);
        m.addAttribute("realizations", availableElections);
        m.addAttribute("replaceTemplate", "elections_choice");
        return "index";
    }
    @Override
    public List<CandidatesElectionRealization> findAvailable(Long citizenId) {
        Citizen citizen = citizenService.findById(citizenId);
        return repository.availableElections(citizen, citizen.getAddress().getMunicipality());
    }
    @Query(value = "select distinct elections from CandidatesElectionRealization elections join Candidacy candidacy on candidacy.candidatesElectionRealization = elections where elections.date >= current_date and elections not in (select v.electionRealization from Vote v where v.citizen = :citizen) and (candidacy.municipality is null or candidacy.municipality = :municipality)")
    List<CandidatesElectionRealization> availableElections(@Param("citizen") Citizen citizen,
                                                           @Param("municipality") Municipality municipality);

Од безбедносни причини споменати погоре, идентификаторот на корисникот се зема од сесијата и соодветно од сервисот се бара листа на избори на кои најавениот корисник има право да гласа. Преку соодветниот репозиториум и прашалникот наведен во претходните фази и напишан во JPQL погоре, од базата се земаат потребните податоци. Истите се прикажуваат во паѓачка листа. Доколку корисникот се обиде да пристапи до оваа страница без претходна успешна валидација, по проверката за постоење на сесијата и валиден идентификатор, истиот ќе биде пренасочен кон страницата за најава.

Attachments (5)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.