pt. 4 - AngularJS POST and @RepositoryEventHandler

This commit is contained in:
2015-11-24 20:29:13 +01:00
parent 0d55df821d
commit 8d35920888
5 changed files with 101 additions and 10 deletions
@@ -0,0 +1,51 @@
package com.bayer.burp.repository;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.rest.core.annotation.HandleBeforeCreate;
import org.springframework.data.rest.core.annotation.RepositoryEventHandler;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import com.bayer.burp.domain.Burp;
import com.bayer.burp.domain.Tag;
// see https://spring.io/blog/2015/10/28/react-js-and-spring-data-rest-part-5-security
@Component
@RepositoryEventHandler(Burp.class)
public class SpringDataRestEventHandler {
private final UserRepository userRepository;
private final TagRepository tagRepository;
private static final Pattern TAG_PATTERN = Pattern.compile("(?:\\s|\\A|^)[#]+([A-Za-z0-9-_]+)");
@Autowired
public SpringDataRestEventHandler(UserRepository userRepository, TagRepository tagRepository) {
this.userRepository = userRepository;
this.tagRepository = tagRepository;
}
@HandleBeforeCreate
public void applyUserInformationUsingSecurityContext(Burp burp) {
String username = SecurityContextHolder.getContext().getAuthentication().getName();
burp.setUser(userRepository.findByName(username));
Matcher matcher = TAG_PATTERN.matcher(burp.getText());
List<Tag> tags = new ArrayList<Tag>();
while (matcher.find()) {
Tag tag = tagRepository.findByName(matcher.group().replace('#', ' ').trim());
// TODO create tag if doesn't exist
tags.add(tag) ;
}
burp.setTags(tags);
burp.setTimestamp(new Date());
}
}
@@ -1,10 +1,15 @@
package com.bayer.burp.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bayer.burp.domain.Tag;
@PreAuthorize("hasRole('ROLE_USER')")
public interface TagRepository extends PagingAndSortingRepository<Tag, Long> {
@RestResource(exported = false)
Tag findByName(String name);
}
@@ -1,6 +1,7 @@
package com.bayer.burp.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bayer.burp.domain.User;
@@ -16,4 +17,7 @@ public interface UserRepository extends PagingAndSortingRepository<User, Long> {
@Override
void delete(User user);
@RestResource(exported = false)
User findByName(String name);
}
+31 -9
View File
@@ -1,17 +1,39 @@
var burpControllers = angular.module('burpControllers', ['ngResource']);
burpControllers.controller('BurpListCtrl', [ '$scope', '$resource', function($scope, $resource) {
burpControllers.controller('BurpListCtrl', [ '$scope', '$resource', '$http', function($scope, $resource, $http) {
var burps = $resource('/burps/search/findFirst8ByOrderByTimestampDesc').get();
$scope.initList = function() {
var burps = $resource('/burps/search/findFirst8ByOrderByTimestampDesc').get();
burps.$promise.then(function(data) {
$scope.burps = burps._embedded.burps;
for (var i = 0; i < $scope.burps.length; i++) {
$scope.burps[i].user = $resource($scope.burps[i]._links.user.href).get();
$scope.burps[i].tags = $resource($scope.burps[i]._links.tags.href).get();
}
});
}
$scope.doBurp = function() {
// simple HTTP POST
$http.post('/burps', { "text" : $scope.text }).success(function() {
console.log('REFRESH');
$scope.initList();
});
// Resource (might be moved into a service)
// var Burp = $resource('/burps');
//
// var newBurp = new Burp({
// "text" : $scope.text
// });
//
// newBurp.$save();
};
burps.$promise.then(function(data) {
$scope.burps = burps._embedded.burps;
for (var i = 0; i < $scope.burps.length; i++) {
$scope.burps[i].user = $resource($scope.burps[i]._links.user.href).get();
$scope.burps[i].tags = $resource($scope.burps[i]._links.tags.href).get();
}
});
} ]);
burpControllers.controller('TagCtrl', [ '$scope', '$routeParams', '$resource', function($scope, $routeParams, $resource) {
+10 -1
View File
@@ -1,6 +1,15 @@
<div>
<div ng-init="initList()">
<div>
<div>
<form role="form" ng-submit="doBurp()">
<div>
<input type="text" ng-model="text" placeholder="Your thoughts on today's menu" />
</div>
<div>
<input type="submit" value="Send" />
</div>
</form>
<div class="burp" ng-repeat="burp in burps">
<div class="user">{{burp.user.name}}</div>
<div class="date">{{burp.timestamp | date:'HH:mm:ss dd.MM.yyyy'}}</div>