Project

General

Profile

« Previous | Next » 

Revision 60587

[Notificaton Service | Trunk]: Create notification methods to create get and read notification

View differences:

modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/utils/Utils.java
1
package eu.dnetlib.uoanotificationservice.utils;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.security.AuthorizationService;
4
import eu.dnetlib.uoanotificationservice.dao.NotificationDAO;
5
import eu.dnetlib.uoanotificationservice.entities.Notification;
6
import eu.dnetlib.uoanotificationservice.services.NotificationService;
7
import org.apache.log4j.Logger;
8
import org.springframework.beans.factory.annotation.Autowired;
9
import org.springframework.stereotype.Component;
10

  
11
import java.util.HashSet;
12
import java.util.Set;
13

  
14
@Component("Utils")
15
public class Utils {
16

  
17
    Logger logger = Logger.getLogger(Utils.class);
18

  
19
    @Autowired
20
    private AuthorizationService authorizationService;
21

  
22
    @Autowired
23
    private NotificationDAO notificationDAO;
24

  
25
    public boolean canRead(String id) {
26
        Set<String> groups = new HashSet<>(authorizationService.getRoles());
27
        groups.add("all");
28
        groups.add(authorizationService.getAaiId());
29
        return notificationDAO.findByIdAndUserNotAndGroupsIn(id, authorizationService.getAaiId(), groups) != null;
30
    }
31

  
32
    /*public boolean hasValidGroups(Set<String> groups) {
33
        Set<String> roles = new HashSet<>(authorizationService.getRoles());
34
        if(roles.contains(authorizationService.PORTAL_ADMIN)) {
35
            return true;
36
        }
37
        for(String group : groups) {
38

  
39
        }
40
        return false;
41
    }*/
42
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/dao/UserDAO.java
1
package eu.dnetlib.uoanotificationservice.dao;
2

  
3
import eu.dnetlib.uoanotificationservice.entities.User;
4
import org.springframework.data.mongodb.repository.MongoRepository;
5
import org.springframework.stereotype.Repository;
6

  
7
import java.util.Collection;
8
import java.util.List;
9

  
10
@Repository
11
public interface UserDAO extends MongoRepository<User, String> {
12

  
13
    List<User> findAll();
14

  
15
    User findById(String Id);
16

  
17
    List<User> findByReadContains(String id);
18

  
19
    User save(User user);
20

  
21
    void deleteAll();
22

  
23
    void delete(String id);
24
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/dao/NotificationDAO.java
1
package eu.dnetlib.uoanotificationservice.dao;
2

  
3
import eu.dnetlib.uoanotificationservice.entities.Notification;
4
import org.springframework.data.mongodb.repository.MongoRepository;
5
import org.springframework.stereotype.Repository;
6

  
7
import java.util.Collection;
8
import java.util.Date;
9
import java.util.List;
10

  
11
@Repository
12
public interface NotificationDAO extends MongoRepository<Notification, String> {
13

  
14
    Notification findById(String Id);
15

  
16
    Notification findByIdAndUserNotAndGroupsIn(String id, String user, Collection<String> groups);
17

  
18
    List<Notification> findByOrderByDateDesc();
19

  
20
    List<Notification> findByUserNotAndServicesInAndGroupsInOrderByDateDesc(String user, Collection<String> services, Collection<String> groups);
21

  
22
    List<Notification> findByDateBefore(Date date);
23
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/services/NotificationService.java
1
package eu.dnetlib.uoanotificationservice.services;
2

  
3
import eu.dnetlib.uoanotificationservice.dao.NotificationDAO;
4
import eu.dnetlib.uoanotificationservice.dao.UserDAO;
5
import eu.dnetlib.uoanotificationservice.entities.Notification;
6
import eu.dnetlib.uoanotificationservice.entities.User;
7
import org.apache.log4j.Logger;
8
import org.springframework.beans.factory.annotation.Autowired;
9
import org.springframework.scheduling.annotation.Scheduled;
10
import org.springframework.stereotype.Service;
11

  
12
import java.util.Calendar;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Set;
16

  
17
@Service
18
public class NotificationService {
19

  
20
    Logger logger = Logger.getLogger(NotificationService.class);
21

  
22
    @Autowired
23
    private NotificationDAO notificationDAO;
24

  
25
    @Autowired
26
    private UserDAO userDAO;
27

  
28
    public List<Notification> getAllNotifications() {
29
        return notificationDAO.findByOrderByDateDesc();
30
    }
31

  
32
    public List<Notification> getMyNotifications(String userId, String service, List<String> roles) {
33
        logger.info("Getting notifications of user " + userId);
34
        Set<String> services = new HashSet<>();
35
        services.add(service);
36
        services.add("all");
37
        Set<String> groups = new HashSet<>(roles);
38
        groups.add(userId);
39
        groups.add("all");
40
        List<Notification> notifications = notificationDAO.findByUserNotAndServicesInAndGroupsInOrderByDateDesc(userId, services, groups);
41
        User user = userDAO.findById(userId);
42
        if(user != null) {
43
            notifications.forEach(notification -> {
44
                notification.setRead(user.getRead().contains(notification.getId()));
45
            });
46
        }
47
        return notifications;
48
    }
49

  
50
    public Notification save(Notification notification) {
51
        return notificationDAO.save(notification);
52
    }
53

  
54
    public User readNotification(String userId, String id) {
55
        logger.info("Read notification " + id + " for  user " + userId);
56
        User user = userDAO.findById(userId);
57
        if(user == null) {
58
            user = new User();
59
            user.setId(userId);
60
            user.setRead(new HashSet<>());
61
        }
62
        user.getRead().add(id);
63
        return userDAO.save(user);
64
    }
65

  
66
    public void delete(String id) {
67
        List<User> users = userDAO.findByReadContains(id);
68
        users.forEach(user -> {
69
            user.getRead().remove(id);
70
            userDAO.save(user);
71
        });
72
        notificationDAO.delete(id);
73
    }
74

  
75
    // every min for testing
76
    //@Scheduled(cron = "0 * * * * *"
77
    // every day at midnight
78
    @Scheduled(cron = "0 0 0 1/1 * ?")
79
    protected void deleteNotifications() {
80
        logger.info("Deleting notifications that have been created more than a week ago");
81
        Calendar calendar = Calendar.getInstance();
82
        calendar.add(Calendar.DAY_OF_MONTH, -7);
83
        List<Notification> notifications = notificationDAO.findByDateBefore(calendar.getTime());
84
        notifications.forEach(notification -> {
85
            delete(notification.getId());
86
        });
87
    }
88
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/entities/Notification.java
1
package eu.dnetlib.uoanotificationservice.entities;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import org.springframework.data.annotation.Id;
5

  
6
import java.util.Date;
7
import java.util.Set;
8

  
9
public class Notification {
10

  
11
    @Id
12
    @JsonProperty("_id")
13
    private String id;
14
    private String actionType;
15
    private Set<String> services;
16
    private String user;
17
    private String name;
18
    private String surname;
19
    private String title;
20
    private String message;
21
    private String stakeholder;
22
    private String stakeholderType;
23
    private String entity;
24
    private String entityType;
25
    private Date date;
26
    private Set<String> groups;
27
    private Boolean isRead;
28

  
29
    public Notification() {
30
    }
31

  
32
    public String getId() {
33
        return id;
34
    }
35

  
36
    public void setId(String id) {
37
        this.id = id;
38
    }
39

  
40
    public String getActionType() {
41
        return actionType;
42
    }
43

  
44
    public void setActionType(String actionType) {
45
        this.actionType = actionType;
46
    }
47

  
48
    public Set<String> getServices() {
49
        return services;
50
    }
51

  
52
    public void setServices(Set<String> service) {
53
        this.services = service;
54
    }
55

  
56
    public String getUser() {
57
        return user;
58
    }
59

  
60
    public void setUser(String user) {
61
        this.user = user;
62
    }
63

  
64
    public String getName() {
65
        return name;
66
    }
67

  
68
    public void setName(String name) {
69
        this.name = name;
70
    }
71

  
72
    public String getSurname() {
73
        return surname;
74
    }
75

  
76
    public void setSurname(String surname) {
77
        this.surname = surname;
78
    }
79

  
80
    public String getTitle() {
81
        return title;
82
    }
83

  
84
    public void setTitle(String title) {
85
        this.title = title;
86
    }
87

  
88
    public String getMessage() {
89
        return message;
90
    }
91

  
92
    public void setMessage(String message) {
93
        this.message = message;
94
    }
95

  
96
    public String getStakeholder() {
97
        return stakeholder;
98
    }
99

  
100
    public void setStakeholder(String stakeholder) {
101
        this.stakeholder = stakeholder;
102
    }
103

  
104
    public String getStakeholderType() {
105
        return stakeholderType;
106
    }
107

  
108
    public void setStakeholderType(String stakeholderType) {
109
        this.stakeholderType = stakeholderType;
110
    }
111

  
112
    public String getEntity() {
113
        return entity;
114
    }
115

  
116
    public void setEntity(String entity) {
117
        this.entity = entity;
118
    }
119

  
120
    public String getEntityType() {
121
        return entityType;
122
    }
123

  
124
    public void setEntityType(String entityType) {
125
        this.entityType = entityType;
126
    }
127

  
128
    public Date getDate() {
129
        return date;
130
    }
131

  
132
    public void setDate(Date date) {
133
        this.date = date;
134
    }
135

  
136
    public Set<String> getGroups() {
137
        return groups;
138
    }
139

  
140
    public void setGroups(Set<String> groups) {
141
        this.groups = groups;
142
    }
143

  
144
    public Boolean getRead() {
145
        return isRead;
146
    }
147

  
148
    public void setRead(Boolean read) {
149
        isRead = read;
150
    }
151
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/entities/User.java
1
package eu.dnetlib.uoanotificationservice.entities;
2

  
3
import com.fasterxml.jackson.annotation.JsonProperty;
4
import org.springframework.data.annotation.Id;
5

  
6
import java.util.Set;
7

  
8
public class User {
9

  
10
    @Id
11
    @JsonProperty("_id")
12
    private String id;
13
    private Set<String> read;
14

  
15
    public User() {
16
    }
17

  
18
    public String getId() {
19
        return id;
20
    }
21

  
22
    public void setId(String id) {
23
        this.id = id;
24
    }
25

  
26
    public Set<String> getRead() {
27
        return read;
28
    }
29

  
30
    public void setRead(Set<String> read) {
31
        this.read = read;
32
    }
33
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/controllers/NotificationController.java
1
package eu.dnetlib.uoanotificationservice.controllers;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.security.AuthorizationService;
4
import eu.dnetlib.uoanotificationservice.entities.Notification;
5
import eu.dnetlib.uoanotificationservice.entities.User;
6
import eu.dnetlib.uoanotificationservice.services.NotificationService;
7
import org.springframework.beans.factory.annotation.Autowired;
8
import org.springframework.security.access.prepost.PreAuthorize;
9
import org.springframework.web.bind.annotation.*;
10

  
11
import java.util.Date;
12
import java.util.List;
13

  
14
@RestController
15
@RequestMapping("/notification")
16
@CrossOrigin(origins =  "*")
17
public class NotificationController {
18

  
19
    @Autowired
20
    private NotificationService notificationService;
21

  
22
    @Autowired
23
    private AuthorizationService authorizationService;
24

  
25
    @PreAuthorize("hasAuthority(@AuthorizationService.REGISTERED_USER)")
26
    @RequestMapping(value = {"/all"}, method = RequestMethod.GET)
27
    public List<Notification> getAllNotifications() {
28
        return notificationService.getAllNotifications();
29
    }
30

  
31
    @PreAuthorize("hasAuthority(@AuthorizationService.REGISTERED_USER)")
32
    @RequestMapping(value = {"/{service}"}, method = RequestMethod.GET)
33
    public List<Notification> getMyNotifications(@PathVariable String service) {
34
        return notificationService.getMyNotifications(authorizationService.getAaiId(), service, authorizationService.getRoles());
35
    }
36

  
37
    @PreAuthorize("hasAuthority(@AuthorizationService.REGISTERED_USER)")
38
    @RequestMapping(value = {"/save"}, method = RequestMethod.POST)
39
    public Notification save(@RequestBody Notification notification) {
40
        notification.setUser(authorizationService.getAaiId());
41
        notification.setDate(new Date());
42
        notification.setRead(false);
43
        return notificationService.save(notification);
44
    }
45

  
46
    @PreAuthorize("hasAuthority(@AuthorizationService.REGISTERED_USER) && @Utils.canRead(#id)")
47
    @RequestMapping(value = {"/{id}"}, method = RequestMethod.PUT)
48
    public User readNotification(@PathVariable String id) {
49
        return notificationService.readNotification(authorizationService.getAaiId(), id);
50
    }
51

  
52

  
53
}
54

  
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/configuration/MongoConfig.java
1
package eu.dnetlib.uoanotificationservice.configuration;
2

  
3
import org.springframework.boot.context.properties.ConfigurationProperties;
4

  
5
@ConfigurationProperties("notification.mongodb")
6
public class MongoConfig {
7

  
8
    private String host;
9
    private String database;
10
    private String username;
11
    private String password;
12
    private int port;
13

  
14

  
15
    public String getHost() {
16
        return host;
17
    }
18

  
19
    public void setHost(String host) {
20
        this.host = host;
21
    }
22

  
23
    public String getDatabase() {
24
        return database;
25
    }
26

  
27
    public void setDatabase(String database) {
28
        this.database = database;
29
    }
30

  
31
    public String getUsername() {
32
        return username;
33
    }
34

  
35
    public void setUsername(String username) {
36
        this.username = username;
37
    }
38

  
39
    public String getPassword() {
40
        return password;
41
    }
42

  
43
    public void setPassword(String password) {
44
        this.password = password;
45
    }
46

  
47
    public int getPort() {
48
        return port;
49
    }
50

  
51
    public void setPort(int port) {
52
        this.port = port;
53
    }
54
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/configuration/NotificationMongoConnection.java
1
package eu.dnetlib.uoanotificationservice.configuration;
2

  
3
import com.mongodb.MongoClient;
4
import com.mongodb.MongoCredential;
5
import com.mongodb.ServerAddress;
6
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.context.annotation.Bean;
8
import org.springframework.context.annotation.Configuration;
9
import org.springframework.data.mongodb.MongoDbFactory;
10
import org.springframework.data.mongodb.core.MongoTemplate;
11
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
12
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
13

  
14
import java.util.Collections;
15

  
16
@Configuration
17
@EnableMongoRepositories(basePackages = {"eu.dnetlib.uoanotificationservice.dao"}, mongoTemplateRef = "notificationTemplate")
18
public class NotificationMongoConnection {
19

  
20
    @Autowired
21
    private MongoConfig mongoConfig;
22

  
23
    @Bean
24
    public MongoDbFactory NotificationFactory() {
25
        return new SimpleMongoDbFactory(getMongoClient(), mongoConfig.getDatabase());
26
    }
27

  
28
    @Bean(name = "notificationTemplate")
29
    public MongoTemplate getNotificationTemplate() {
30
        return new MongoTemplate(NotificationFactory());
31
    }
32

  
33
    private MongoClient getMongoClient() {
34
        if(mongoConfig.getUsername() != null && mongoConfig.getPassword() != null){
35
            return new MongoClient(Collections.singletonList(
36
                    new ServerAddress(mongoConfig.getHost(), mongoConfig.getPort())),
37
                    Collections.singletonList(MongoCredential.createCredential(mongoConfig.getUsername(), mongoConfig.getDatabase(), mongoConfig.getPassword().toCharArray())));
38
        } else {
39
            return new MongoClient(Collections.singletonList(new ServerAddress(mongoConfig.getHost(), mongoConfig.getPort())));
40
        }
41
    }
42
}
modules/uoa-notification-service/trunk/src/main/java/eu/dnetlib/uoanotificationservice/configuration/NotificationConfiguration.java
1
package eu.dnetlib.uoanotificationservice.configuration;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.configuration.AuthorizationConfiguration;
4
import org.springframework.boot.context.properties.EnableConfigurationProperties;
5
import org.springframework.context.annotation.*;
6
import org.springframework.scheduling.annotation.EnableScheduling;
7

  
8
@Configuration
9
@PropertySources({
10
        @PropertySource("classpath:notification.properties"),
11
        @PropertySource(value = "classpath:dnet-override.properties", ignoreResourceNotFound = true)
12
})
13
@EnableConfigurationProperties({MongoConfig.class})
14
@EnableScheduling
15
@ComponentScan(basePackages = { "eu.dnetlib.uoanotificationservice"})
16
@Import({AuthorizationConfiguration.class})
17
public class NotificationConfiguration { }
modules/uoa-notification-service/trunk/src/main/resources/notification.properties
1
notification.mongodb.host = localhost
2
notification.mongodb.port = 27017
3
notification.mongodb.database = openaire_notification
modules/uoa-notification-service/trunk/src/main/resources/log4j.properties
1
log4j.rootLogger = DEBUG, R
2

  
3
log4j.logger.eu.dnetlib = DEBUG
4
log4j.logger.org.springframework = DEBUG, S
5

  
6
log4j.additivity.org.springframework = false
7

  
8
log4j.appender.R=org.apache.log4j.RollingFileAppender
9
log4j.appender.R.File=/var/log/dnet/uoa-notification-service/uoa-notification-service.log
10
log4j.appender.R.MaxFileSize=10MB
11
log4j.appender.R.MaxBackupIndex=10
12
log4j.appender.R.layout=org.apache.log4j.PatternLayout
13
log4j.appender.R.layout.ConversionPattern= %d %p %t [%c] - %m%n
14

  
15
log4j.appender.S=org.apache.log4j.RollingFileAppender
16
log4j.appender.S.File=/var/log/dnet/uoa-notification-service/uoa-notification-service-spring.log
17
log4j.appender.S.MaxFileSize=10MB
18
log4j.appender.S.MaxBackupIndex=10
19
log4j.appender.S.layout=org.apache.log4j.PatternLayout
20
log4j.appender.S.layout.ConversionPattern= %d %p %t [%c] - %m%n
modules/uoa-notification-service/trunk/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4
	<modelVersion>4.0.0</modelVersion>
5

  
6
	<groupId>eu.dnetlib</groupId>
7
	<artifactId>uoa-notification-service</artifactId>
8
	<version>1.0.0-SNAPSHOT</version>
9
	<packaging>jar</packaging>
10

  
11
	<name>uoa-notification-service</name>
12

  
13
	<parent>
14
		<groupId>org.springframework.boot</groupId>
15
		<artifactId>spring-boot-starter-parent</artifactId>
16
		<version>1.5.8.RELEASE</version>
17
		<relativePath/> <!-- lookup parent from repository -->
18
	</parent>
19

  
20
	<properties>
21
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
23
		<java.version>1.8</java.version>
24
	</properties>
25

  
26
	<dependencies>
27
		<dependency>
28
			<groupId>org.springframework.boot</groupId>
29
			<artifactId>spring-boot-starter-web</artifactId>
30
			<exclusions>
31
				<exclusion>
32
					<groupId> org.springframework.boot</groupId>
33
					<artifactId>spring-boot-starter-logging</artifactId>
34
				</exclusion>
35
			</exclusions>
36
		</dependency>
37
		<dependency>
38
			<groupId>org.springframework.boot</groupId>
39
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
40
		</dependency>
41
		<!-- Starter for using Spring Security -->
42
		<dependency>
43
			<groupId>org.springframework.boot</groupId>
44
			<artifactId>spring-boot-starter-security</artifactId>
45
		</dependency>
46
		<dependency>
47
			<groupId>eu.dnetlib</groupId>
48
			<artifactId>uoa-authorization-library</artifactId>
49
			<version>1.0.0-SNAPSHOT</version>
50
		</dependency>
51
		<dependency>
52
			<groupId>com.google.code.gson</groupId>
53
			<artifactId>gson</artifactId>
54
			<version>2.8.2</version>
55
		</dependency>
56
		<dependency>
57
			<groupId>log4j</groupId>
58
			<artifactId>log4j</artifactId>
59
			<version>1.2.17</version>
60
		</dependency>
61
    </dependencies>
62
	<build>
63
		<plugins>
64
		</plugins>
65
        <finalName>uoa-notification-service</finalName>
66
	</build>
67
</project>

Also available in: Unified diff