Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 10 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# iStudent
Design Patterns Course UBB 2017-2018
Analytics and Reporting - Course related analytics #7

1. User management & Course subscriptions
2. Assignments, tests and gradings/ & Test/Assignment design
3. Analytics & Reporting
4. University Blog - push notifications etc.
Statistics based on number of students that graduated the course compared to total number of students
Statistics based on graduation of students broken down to student country of residence
Statistics based on age groups and graduation (18-29, 30-39,40-60, 60+)
Statistics based on graduation and gender

# Build Status
[![wercker status](https://app.wercker.com/status/158f0fee4804c3da09b80f23ca8f29d6/m/master "wercker status")](https://app.wercker.com/project/byKey/158f0fee4804c3da09b80f23ca8f29d6)

# Project Details
## Prerequisites
- __[JDK 1.8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)__

## How to build and run the project?

-> first install mongodb
-> before running the application, start mongo instance. Make sure the port corresponds with the one from Mongo Config
-> I recommend to install also a native MongoDB management tool like Robo 3T

### Windows
```java
step 1:
Expand All @@ -36,16 +36,3 @@ http://localhost:8080
step 4:
Enjoy coding :)
```

# Logistics
## __[Slack channel](https://ubbdesignpatterns2017.slack.com/)__ ([Invitation link](https://join.slack.com/t/ubbdesignpatterns2017/shared_invite/enQtMjU4ODcyMDc3MjcwLWQ3ZmFmMDIzYmU4YmYwZGRkMWQxMTU1YjUyYTE3YmJlMWExMTAzY2JiYzY0MDdiN2VkMzVlMzc4ZGVjMGJhY2M))

## Courses
- __[Course 1](https://docs.google.com/presentation/d/1vQ-MAlstyvX_rapYVQ4uLOabJwdJ7010YurVI_bQYpM): Solid Principles and Creational Patterns (Factory, Builder, Prototype, Singleton)__
- __[Course 2](https://docs.google.com/presentation/d/1xZhmu2bT6TYEeAyY02-e5vRRglJ_5G-UnXmGUIlpNPg): Structural Patterns (Adapter, Bridge, Composite, Decorator, Facade, Proxy)__
- __[Course 3](https://docs.google.com/presentation/d/1udyA-FaIrRZ9EQUn-biKbpMH8yDvkEsIEr1CbYGMW7s): Behavioral Patterns (Chain of Responsibility, Command, Iterator, Mediator, Observer)__
- __[Course 4](https://docs.google.com/presentation/d/1fzrjC-HwMg7WEsOtEXUHubnNU1c8CU1OaFyv4UXRJfA): Behavioral Patterns (State, Strategy, Template)__

## __[Attendance status](https://docs.google.com/spreadsheets/d/1lzO3BhkjEk6xRPxoFb3Yq5RtlE43MPsmJ1ofIl_kk9M/edit?usp=sheets_home&ths=true)__ of students

## __[Self-scheduling for labs](https://docs.google.com/spreadsheets/d/16gnOL0lQRFnXmxHOGag_XkTWqVXekKKYTLMFK_mtWec/edit#gid=0)__, for a more balanced number of students at each laboratory
11 changes: 9 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
classpath "io.franzbecker:gradle-lombok:1.11"
}
}

apply plugin: "io.franzbecker.gradle-lombok"
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
Expand All @@ -37,19 +39,24 @@ repositories {
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
maven { url 'http://repo.maven.apache.org/maven2' }
maven { url 'https://jitpack.io' }
maven { url 'https://repo.spring.io/libs-release' }
}

configurations {
providedRuntime
}


dependencies {
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-data-mongodb')
compile("de.flapdoodle.embed:de.flapdoodle.embed.mongo")
runtime('com.h2database:h2')
runtime('mysql:mysql-connector-java')
compile group: 'com.rabbitmq', name: 'amqp-client', version: '5.0.0'
compile 'org.mongodb:mongodb-driver:3.5.0'
// https://mvnrepository.com/artifact/com.google.guava/guava
compile group: 'com.google.guava', name: 'guava', version: '23.5-jre'

providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
testCompile('org.springframework.boot:spring-boot-starter-test')

Expand Down
3 changes: 1 addition & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#Sun Oct 01 18:38:57 EEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip
6 changes: 3 additions & 3 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/main/java/ro/ubb/istudent/IStudentApplication.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package ro.ubb.istudent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import ro.ubb.istudent.dto.CourseDto;
import ro.ubb.istudent.service.CourseService;
import ro.ubb.istudent.service.StudentService;
import ro.ubb.istudent.service.TestService;

@SpringBootApplication
public class IStudentApplication {
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/ro/ubb/istudent/config/MongoConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ro.ubb.istudent.config;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(basePackages = "ro.ubb.istudent.repository")
public class MongoConfig extends AbstractMongoConfiguration {

@Override
protected String getDatabaseName() {
return "istudent";
}

@Override
public Mongo mongo() throws Exception {
return new MongoClient("127.0.0.1", 27017);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import ro.ubb.istudent.dto.CourseDto;
import ro.ubb.istudent.dto.StudentDto;
import ro.ubb.istudent.dto.TestDto;
import ro.ubb.istudent.service.CourseService;
import ro.ubb.istudent.service.StudentService;
import ro.ubb.istudent.service.TestService;

import java.util.Arrays;

@Controller
public class GreetingController {
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/ro/ubb/istudent/converters/CountryConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ro.ubb.istudent.converters;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ro.ubb.istudent.domain.CountryEntity;
import ro.ubb.istudent.dto.CountryDto;

import java.util.Collections;

@Component
public class CountryConverter extends GenericConverter<CountryEntity, CountryDto> {

@Autowired
private StudentConverter studentConverter;

@Override
public CountryEntity createFromDto(CountryDto dto) {
CountryEntity countryEntity = CountryEntity.builder()
.countryName(dto.getCountryName())
.build();

countryEntity.setId(dto.getId());

return countryEntity;
}

@Override
public CountryDto createFromEntity(CountryEntity entity) {
CountryDto countryDto = CountryDto.builder()
.countryName(entity.getCountryName())
.build();

countryDto.setId(entity.getId());

return countryDto;
}

@Override
public CountryEntity updateEntity(CountryEntity entity, CountryDto dto) {
entity.setCountryName(dto.getCountryName());

return entity;
}
}
45 changes: 45 additions & 0 deletions src/main/java/ro/ubb/istudent/converters/CourseConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ro.ubb.istudent.converters;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ro.ubb.istudent.domain.CourseEntity;
import ro.ubb.istudent.dto.CourseDto;

import java.util.Collections;

@Component
public class CourseConverter extends GenericConverter<CourseEntity, CourseDto> {

@Autowired
private StudentConverter studentConverter;

@Override
public CourseEntity createFromDto(CourseDto dto) {
CourseEntity courseEntity = CourseEntity.builder()
.name(dto.getName())
.minimumGrade(dto.getMinimumGrade())
.build();
courseEntity.setId(dto.getId());

return courseEntity;
}

@Override
public CourseDto createFromEntity(CourseEntity entity) {
CourseDto courseDto = CourseDto.builder()
.name(entity.getName())
.minimumGrade(entity.getMinimumGrade())
.build();
courseDto.setId(entity.getId());

return courseDto;
}

@Override
public CourseEntity updateEntity(CourseEntity entity, CourseDto dto) {
entity.setName(dto.getName());
entity.setMinimumGrade(dto.getMinimumGrade());

return entity;
}
}
26 changes: 26 additions & 0 deletions src/main/java/ro/ubb/istudent/converters/GenericConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ro.ubb.istudent.converters;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public abstract class GenericConverter<E, D> {

public abstract E createFromDto(D dto);

public abstract D createFromEntity(E entity);

public abstract E updateEntity(E entity, D dto);

public List<D> createFromEntities(final Collection<E> entities) {
return entities.stream()
.map(this::createFromEntity)
.collect(Collectors.toList());
}

public List<E> createFromDtos(final Collection<D> dtos) {
return dtos.stream()
.map(this::createFromDto)
.collect(Collectors.toList());
}
}
56 changes: 56 additions & 0 deletions src/main/java/ro/ubb/istudent/converters/StudentConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package ro.ubb.istudent.converters;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ro.ubb.istudent.domain.StudentEntity;
import ro.ubb.istudent.dto.StudentDto;

import java.util.Collections;

@Component
public class StudentConverter extends GenericConverter<StudentEntity, StudentDto> {

@Autowired
private TestConverter testConverter;

@Autowired
private CountryConverter countryConverter;

@Override
public StudentEntity createFromDto(StudentDto dto) {
StudentEntity studentEntity = StudentEntity.builder()
.age(dto.getAge())
.gender(dto.getGender())
.name(dto.getName())
.country(countryConverter.createFromDto(dto.getCountryDto()))
.tests(testConverter.createFromDtos(dto.getTests() != null ? dto.getTests() : Collections.emptyList()))
.build();
studentEntity.setId(dto.getId());

return studentEntity;
}

@Override
public StudentDto createFromEntity(StudentEntity entity) {
StudentDto studentDto = StudentDto.builder()
.age(entity.getAge())
.gender(entity.getGender())
.name(entity.getName())
.countryDto(countryConverter.createFromEntity(entity.getCountry()))
.tests(testConverter.createFromEntities(entity.getTests() != null ? entity.getTests() : Collections.emptyList()))
.build();
studentDto.setId(entity.getId());

return studentDto;
}

@Override
public StudentEntity updateEntity(StudentEntity entity, StudentDto dto) {
entity.setAge(dto.getAge());
entity.setName(dto.getName());
entity.setGender(dto.getGender());
entity.setTests(testConverter.createFromDtos(dto.getTests()));

return entity;
}
}
41 changes: 41 additions & 0 deletions src/main/java/ro/ubb/istudent/converters/TestConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ro.ubb.istudent.converters;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import ro.ubb.istudent.domain.CourseEntity;
import ro.ubb.istudent.domain.TestEntity;
import ro.ubb.istudent.dto.TestDto;

import java.util.List;

@Component
public class TestConverter extends GenericConverter<TestEntity, TestDto> {

@Autowired
private CourseConverter courseConverter;

@Override
public TestEntity createFromDto(TestDto dto) {
return TestEntity.builder()
.grade(dto.getGrade())
.course(courseConverter.createFromDto(dto.getCourseDto()))
.build();
}

@Override
public TestDto createFromEntity(TestEntity entity) {
return TestDto.builder()
.grade(entity.getGrade())
.courseDto(courseConverter.createFromEntity(entity.getCourse()))
.build();
}

@Override
public TestEntity updateEntity(TestEntity entity, TestDto dto) {
entity.setCourse(courseConverter.createFromDto(dto.getCourseDto()));
entity.setGrade(dto.getGrade());

return entity;
}
}
Loading