Skip to content
Snippets Groups Projects
Commit 0c5d85e3 authored by ywb16155's avatar ywb16155
Browse files

commit #18 - updating lecturer services for create/delete of papers and templates

parent d72b6284
No related branches found
No related tags found
No related merge requests found
Showing
with 266 additions and 112 deletions
......@@ -34,4 +34,29 @@ public class LecturerController {
public List<MinutePaperEntity> getClassPapers(@RequestBody Map<String,String> request) {
return lecturerInfoService.getClassPapers(request.get("username"),request.get("classCode"));
}
@PostMapping(value = "/createPaper",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void createPaper(@RequestBody MinutePaperEntity request) {
lecturerInfoService.create(request,false);
}
@PostMapping(value = "/deletePaper",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void deletePaper(@RequestBody Map<String,String> request) {
lecturerInfoService.delete(request.get("paperId"),false);
}
@PostMapping(value = "/createTemplate",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void createTemplate(@RequestBody MinutePaperEntity request) {
lecturerInfoService.create(request,true);
}
@PostMapping(value = "/deleteTemplate",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void deleteTemplate(@RequestBody Map<String,String> request) {
lecturerInfoService.delete(request.get("paperId"),true);
}
}
package com.diss.omppapp.api;
import com.diss.omppapp.entities.AnswerEntity;
import com.diss.omppapp.entities.QuestionEntity;
import com.diss.omppapp.pojo.AnswerSet;
import com.diss.omppapp.pojo.StudentResponseWrapper;
import com.diss.omppapp.services.MinutePaperService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
......@@ -33,21 +31,4 @@ public class MinutePaperController {
return minutePaperService.getAnswerSets(request.get("paperId"));
}
@PostMapping(value = "/getStudentAnswers",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<AnswerEntity> getStudentAnswers(@RequestBody Map<String,String> request) {
return minutePaperService.getStudentAnswers(request.get("username"),request.get("paperId"));
}
@PostMapping(value = "/saveDraft",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String,String> saveDraft(@RequestBody StudentResponseWrapper answers) {
return minutePaperService.saveDraft(answers);
}
@PostMapping(value = "/submitResponse",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String,String> submitResponse(@RequestBody StudentResponseWrapper answers) {
return minutePaperService.submitResponse(answers);
}
}
package com.diss.omppapp.api;
import com.diss.omppapp.entities.AnswerEntity;
import com.diss.omppapp.entities.ClassEntity;
import com.diss.omppapp.entities.MinutePaperEntity;
import com.diss.omppapp.pojo.StudentResponseWrapper;
import com.diss.omppapp.services.ClassInfoService;
import com.diss.omppapp.services.StudentInfoService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -38,4 +40,22 @@ public class StudentController {
return studentInfoService.getClassPapers(request.get("username"),request.get("classCode"),true);
}
@PostMapping(value = "/getStudentAnswers",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<AnswerEntity> getStudentAnswers(@RequestBody Map<String,String> request) {
return studentInfoService.getStudentAnswers(request.get("username"),request.get("paperId"));
}
@PostMapping(value = "/saveDraft",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void saveDraft(@RequestBody StudentResponseWrapper answers) {
studentInfoService.save(answers,true);
}
@PostMapping(value = "/submitResponse",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void submitResponse(@RequestBody StudentResponseWrapper answers) {
studentInfoService.save(answers,false);
}
}
......@@ -12,7 +12,7 @@ import java.util.Date;
public class MinutePaperEntity implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int paperId;
@Column
......
......@@ -8,7 +8,7 @@ import java.io.Serializable;
public class QuestionEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int questionId;
@Column
......
......@@ -14,4 +14,5 @@ public interface AnswerEntityRepository extends CrudRepository<AnswerEntity, Int
Optional<List<AnswerEntity>> findAllByUsernameAndPaperIdOrderByAnswerIdAsc(String username, int paperId);
boolean existsByUsernameAndPaperIdAndQuestionId(String username, int paperId, int QuestionId);
Optional<AnswerEntity> findByUsernameAndPaperIdAndQuestionId(String username, int paperId, int QuestionId);
void deleteByPaperId(int paperId);
}
......@@ -11,6 +11,7 @@ import java.util.Optional;
public interface MinutePaperEntityRepository extends CrudRepository<MinutePaperEntity, Integer> {
Optional<MinutePaperEntity> findByPaperId(int paperId);
Optional<MinutePaperEntity> findByPaperIdAndAnonymous(int paperId, boolean anonymous);
Optional<List<MinutePaperEntity>> findAllByClassCode(String classCode);
Optional<List<MinutePaperEntity>> findAllByClassCodeAndTemplate(String classCode, Boolean isTemplate);
Optional<List<MinutePaperEntity>> findAllByUsernameAndClassCodeAndTemplate(String username, String classCode, boolean template);
void deleteByPaperId(int paperId);
}
......@@ -10,5 +10,6 @@ import java.util.Optional;
@Repository
public interface QuestionEntityRepository extends CrudRepository<QuestionEntity, Integer> {
Optional<List<QuestionEntity>> findAllByPaperIdOrderByQuestionIdAsc(int paperId);
void deleteByPaperId(int paperId);
int countAllByPaperId(int paperId);
}
package com.diss.omppapp.services;
import com.diss.omppapp.entities.AnswerEntity;
import com.diss.omppapp.entities.MinutePaperEntity;
import com.diss.omppapp.repositories.AnswerEntityRepository;
import com.diss.omppapp.repositories.MinutePaperEntityRepository;
import com.diss.omppapp.repositories.QuestionEntityRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
......@@ -15,6 +19,12 @@ public class LecturerInfoService {
@Autowired
private MinutePaperEntityRepository minutePaperEntityRepository;
@Autowired
private QuestionEntityRepository questionEntityRepository;
@Autowired
private AnswerEntityRepository answerEntityRepository;
public List<MinutePaperEntity> getClassPapers(String username, String classCode) {
if((username == null || username.isEmpty()) || (classCode == null || classCode.isEmpty())) {
return new ArrayList<>();
......@@ -23,4 +33,44 @@ public class LecturerInfoService {
Optional<List<MinutePaperEntity>> papers = minutePaperEntityRepository.findAllByUsernameAndClassCodeAndTemplate(username,classCode, false);
return papers.orElseGet(ArrayList::new);
}
public void create(MinutePaperEntity paper, Boolean isTemplate) {
try {
MinutePaperEntity entity = new MinutePaperEntity();
entity.setUsername(paper.getUsername());
entity.setClassCode(paper.getClassCode());
entity.setTopic(paper.getTopic());
entity.setCreationDate(new Date());
entity.setTemplate(isTemplate);
entity.setAnonymous(paper.isAnonymous());
minutePaperEntityRepository.save(entity);
} catch (Exception e) {
//Tear down
}
}
//TODO replace non-template delete with CASCADE TRIGGERS
public void delete(String paperId, Boolean isTemplate) {
int id = parseId(paperId);
if(paperId != null && !paperId.isEmpty()) {
if(isTemplate) {
minutePaperEntityRepository.deleteByPaperId(id);
} else {
minutePaperEntityRepository.deleteByPaperId(id);
questionEntityRepository.deleteByPaperId(id);
answerEntityRepository.deleteByPaperId(id);
}
}
}
private int parseId(String paperId) {
int id = 0;
try {
id = Integer.parseInt(paperId);
} catch (NumberFormatException nfe) {
return -1;
}
return id;
}
}
......@@ -3,7 +3,6 @@ package com.diss.omppapp.services;
import com.diss.omppapp.entities.AnswerEntity;
import com.diss.omppapp.entities.QuestionEntity;
import com.diss.omppapp.pojo.AnswerSet;
import com.diss.omppapp.pojo.StudentResponseWrapper;
import com.diss.omppapp.repositories.AnswerEntityRepository;
import com.diss.omppapp.repositories.MinutePaperEntityRepository;
import com.diss.omppapp.repositories.QuestionEntityRepository;
......@@ -72,90 +71,10 @@ public class MinutePaperService {
return answerEntities.orElseGet(ArrayList::new);
}
public List<AnswerEntity> getStudentAnswers(String username, String paperId) {
if ((username == null || username.isEmpty()) || (paperId == null || paperId.isEmpty())) {
return new ArrayList<>();
}
Optional<List<AnswerEntity>> answerEntities = answerEntityRepository.findAllByUsernameAndPaperIdOrderByAnswerIdAsc(username,parseId(paperId));
return answerEntities.orElseGet(ArrayList::new);
}
public Map<String,String> saveDraft(StudentResponseWrapper answers) {
if(answers.getResponses() == null) {
return getResponse(false);
}
if(!save(answers,true)) {
return getResponse(false);
}
return getResponse(true);
}
public Map<String,String> submitResponse(StudentResponseWrapper answers) {
if(answers.getResponses() == null) {
return getResponse(false);
}
if(!save(answers,false)) {
return getResponse(false);
}
return getResponse(true);
}
private Boolean isAnonymous(int paperId) {
return minutePaperEntityRepository.findByPaperIdAndAnonymous(paperId, true).isPresent();
}
private Boolean save(StudentResponseWrapper answers, Boolean isDraft) {
if(answers.getResponses().size() > 0) {
try {
answers.getResponses().forEach(r -> {
AnswerEntity entity = new AnswerEntity();
int existing = hasExistingAnswer(r.getUsername(),parseId(r.getPaperId()),parseId(r.getQuestionId()));
if( existing != -1) {
entity.setAnswerId(existing);
}
entity.setAnswerText(r.getAnswerText());
entity.setUsername(r.getUsername());
entity.setSubmitted(isDraft);
entity.setPaperId(parseId(r.getPaperId()));
entity.setQuestionId(parseId(r.getQuestionId()));
entity.setSubmissionDate(new Date());
answerEntityRepository.save(entity);
});
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
private int hasExistingAnswer(String username, int paperId, int questionId) {
if(answerEntityRepository.existsByUsernameAndPaperIdAndQuestionId(username,paperId,questionId)) {
AnswerEntity entity = answerEntityRepository.findByUsernameAndPaperIdAndQuestionId(username,paperId,questionId).get();
if(entity.getSubmitted()) {
return -1;
}
return entity.getAnswerId();
}
return -1;
}
private Map<String,String> getResponse(Boolean isGood) {
Map<String,String> response = new HashMap<>();
if (isGood) {
response.put("response", "true");
return response;
}
response.put("response", "false");
return response;
}
private int parseId(String paperId) {
int id = 0;
......
......@@ -2,6 +2,7 @@ package com.diss.omppapp.services;
import com.diss.omppapp.entities.AnswerEntity;
import com.diss.omppapp.entities.MinutePaperEntity;
import com.diss.omppapp.pojo.StudentResponseWrapper;
import com.diss.omppapp.repositories.AnswerEntityRepository;
import com.diss.omppapp.repositories.MinutePaperEntityRepository;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -43,7 +44,7 @@ public class StudentInfoService {
}
List<MinutePaperEntity> result = new ArrayList<>();
Optional<List<MinutePaperEntity>> possiblePapers = minutePaperEntityRepository.findAllByClassCode(classCode);
Optional<List<MinutePaperEntity>> possiblePapers = minutePaperEntityRepository.findAllByClassCodeAndTemplate(classCode,false);
Optional<List<AnswerEntity>> possibleSubmissions = answerEntityRepository.findAllByUsernameAndSubmitted(username,submitted);
Set<Integer> paperIds = new LinkedHashSet<>();
......@@ -57,4 +58,59 @@ public class StudentInfoService {
return result;
}
public List<AnswerEntity> getStudentAnswers(String username, String paperId) {
if ((username == null || username.isEmpty()) || (paperId == null || paperId.isEmpty())) {
return new ArrayList<>();
}
Optional<List<AnswerEntity>> answerEntities = answerEntityRepository.findAllByUsernameAndPaperIdOrderByAnswerIdAsc(username,parseId(paperId));
return answerEntities.orElseGet(ArrayList::new);
}
public void save(StudentResponseWrapper answers, Boolean isDraft) {
if(answers.getResponses().size() > 0) {
try {
answers.getResponses().forEach(r -> {
AnswerEntity entity = new AnswerEntity();
int existing = hasExistingAnswer(r.getUsername(),parseId(r.getPaperId()),parseId(r.getQuestionId()));
if( existing != -1) {
entity.setAnswerId(existing);
}
entity.setAnswerText(r.getAnswerText());
entity.setUsername(r.getUsername());
entity.setSubmitted(isDraft);
entity.setPaperId(parseId(r.getPaperId()));
entity.setQuestionId(parseId(r.getQuestionId()));
entity.setSubmissionDate(new Date());
answerEntityRepository.save(entity);
});
} catch (Exception e) {
//Tear down
}
}
}
private int hasExistingAnswer(String username, int paperId, int questionId) {
if(answerEntityRepository.existsByUsernameAndPaperIdAndQuestionId(username,paperId,questionId)) {
AnswerEntity entity = answerEntityRepository.findByUsernameAndPaperIdAndQuestionId(username,paperId,questionId).get();
if(entity.getSubmitted()) {
return -1;
}
return entity.getAnswerId();
}
return -1;
}
private int parseId(String paperId) {
int id = 0;
try {
id = Integer.parseInt(paperId);
} catch (NumberFormatException nfe) {
return -1;
}
return id;
}
}
......@@ -4,6 +4,7 @@ import {OmpClassDao} from 'src/app/dao/omp-class.dao';
import {LecturerInfoService} from 'src/app/services/lecturer-info.service';
import {ActivatedRoute, Router} from '@angular/router';
import {LecturerDataService} from '../../services/lecturer-data.service';
import {LecturerViewService} from '../../services/lecturer-view.service';
@Component({
selector: 'app-lecturer-dashboard',
......@@ -18,6 +19,7 @@ export class LecturerDashboardComponent implements OnInit, OnDestroy {
constructor(private lecturerInfoService: LecturerInfoService,
private lecturerDataService: LecturerDataService,
private lecturerViewService: LecturerViewService,
private router: Router,
private route: ActivatedRoute) {
}
......@@ -36,6 +38,7 @@ export class LecturerDashboardComponent implements OnInit, OnDestroy {
public goToPaperView(classCode: String) {
this.classList = [];
this.lecturerDataService.classCode = classCode;
this.lecturerViewService.changeToDashboard(false);
this.router.navigate(['/paperview']);
}
......
<app-navbar></app-navbar>
<div class="container">
<div *ngFor="let pair of questionAnswerPairs; let i = index" [attr.data-index]="i">
<div class="row">
<span>Question {{i+1}}:</span>
</div>
<div class="row">
<span>{{pair.question.questionText}}</span>
</div>
<div class="row">
<span>Your response:</span>
</div>
<div class="row">
<span>{{pair.answer.answerText}}</span>
</div>
</div>
</div>
import {Component, OnDestroy, OnInit} from '@angular/core';
import {LecturerDataService} from 'src/app/services/lecturer-data.service';
import {Router} from '@angular/router';
import {MinutePaperDao} from 'src/app/dao/minute-paper.dao';
import {QuestionAnswerPairDao} from 'src/app/dao/question-answer-pair.dao';
@Component({
selector: 'app-lecturer-response-view',
templateUrl: './lecturer-response-view.component.html',
styleUrls: ['./lecturer-response-view.component.css']
})
export class LecturerResponseViewComponent implements OnInit, OnDestroy {
public username: String;
public classCode: String;
public currentPaper: MinutePaperDao;
public questionAnswerPairs: QuestionAnswerPairDao[];
constructor(private lecturerDataService: LecturerDataService,
private router: Router) {
}
ngOnInit(): void {
this.classCode = this.lecturerDataService.classCode;
this.currentPaper = this.lecturerDataService.currentPaper;
this.username = this.lecturerDataService.currentAnswerSet.answerSets[0].username;
this.questionAnswerPairs = [];
this.generatePairs();
}
ngOnDestroy(): void {
this.questionAnswerPairs = [];
}
private generatePairs() {
for (let i = 0; i < this.lecturerDataService.currentQuestions.length; i++) {
if (this.lecturerDataService.currentQuestions[i] && this.lecturerDataService.currentAnswerSet.answerSets[i]) {
this.questionAnswerPairs.push(new QuestionAnswerPairDao(this.lecturerDataService.currentQuestions[i],
this.lecturerDataService.currentAnswerSet.answerSets[i]));
}
}
}
}
......@@ -7,8 +7,9 @@
</div>
<div *ngFor="let set of answers; let i = index" [attr.data-index]="i">
<div class="container">
<span class="row">This is an answer set </span>
<span class="row"><button (click)="test(set)">View</button></span>
<span class="row">{{set.answerSets[i].username}}</span>
<span class="row">{{set.answerSets[i].submissionDate}}</span>
<span class="row"><button (click)="goToResponse(set)">View</button></span>
</div>
</div>
</div>
......
......@@ -38,8 +38,10 @@ export class LecturerSubmissionsViewComponent implements OnInit, OnDestroy {
this.answers = [];
}
public test(set: AnswerSetDao) {
console.log(set.answerSets);
public goToResponse(set: AnswerSetDao): void {
this.lecturerDataService.currentAnswerSet = set;
this.lecturerDataService.currentQuestions = this.questions;
this.router.navigate(['responseview']);
}
private getPaperQuestions(): void {
......
<app-navbar></app-navbar>
<div class="container-fluid">
<div>
<div *ngIf="onDashboard">
<app-lecturer-dashboard></app-lecturer-dashboard>
</div>
<router-outlet></router-outlet>
......
import {Component} from '@angular/core';
import {Component, OnDestroy, OnInit} from '@angular/core';
import {StudentViewService} from '../services/student-view.service';
import {takeWhile} from 'rxjs/operators';
import {LecturerViewService} from '../services/lecturer-view.service';
@Component({
selector: 'app-lecturer-root',
templateUrl: './lecturer-root.component.html',
styleUrls: ['./lecturer-root.component.css']
})
export class LecturerRootComponent {
export class LecturerRootComponent implements OnInit, OnDestroy {
public onDashboard: Boolean;
public onClassView: Boolean;
public onCompletedView: Boolean;
public onSubmissionView: Boolean;
public isAlive = true;
constructor(private lecturerViewService: LecturerViewService) {
}
ngOnInit(): void {
this.lecturerViewService.onDashboard$.subscribe(flag => {
this.onDashboard = flag;
}).add(takeWhile(() => this.isAlive));
this.onDashboard = true;
this.onClassView = false;
this.onCompletedView = false;
this.onSubmissionView = false;
this.lecturerViewService.changeToDashboard(this.onDashboard);
}
ngOnDestroy(): void {
this.isAlive = false;
}
}
......@@ -9,13 +9,15 @@ import {LecturerInfoService} from 'src/app/services/lecturer-info.service';
import {LecturerPaperViewComponent} from 'src/app/LecturerComponents/LecturerPaperView/lecturer-paper-view.component';
import {LecturerDataService} from 'src/app/services/lecturer-data.service';
import {LecturerSubmissionsViewComponent} from 'src/app/LecturerComponents/LecturerSubmissionsView/lecturer-submissions-view.component';
import {LecturerResponseViewComponent} from 'src/app/LecturerComponents/LecturerResponseView/lecturer-response-view.component';
@NgModule({
declarations: [
LecturerRootComponent,
LecturerDashboardComponent,
LecturerPaperViewComponent,
LecturerSubmissionsViewComponent
LecturerSubmissionsViewComponent,
LecturerResponseViewComponent
],
imports: [
CommonModule,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment