Skip to content

Commit b74341a

Browse files
committed
OCP-DEMO Save, load and search for #tag
1 parent 4b12d00 commit b74341a

File tree

20 files changed

+305
-38
lines changed

20 files changed

+305
-38
lines changed

openshift/message-board/message-board-web/src/app/app-routing.module.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import {RouterModule, Routes} from '@angular/router';
33
import {CommonModule} from '@angular/common';
44

55
import {MessageComponent} from './message/message.component';
6+
import {TagComponent} from './tag/tag.component';
67
import {CreateAccountComponent} from './create-account/create-account.component';
78

89
const routes: Routes = [
910
{ path: '', redirectTo: '/message', pathMatch: 'full' },
1011
{ path: 'message', component: MessageComponent },
1112
{ path: 'message/:userName', component: MessageComponent },
12-
{ path: 'createAccount', component: CreateAccountComponent}
13+
{ path: 'createAccount', component: CreateAccountComponent },
14+
{ path: 'tag', component: TagComponent },
15+
{ path: 'tag/:tag', component: TagComponent }
1316
];
1417

1518
@NgModule({

openshift/message-board/message-board-web/src/app/app.component.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
</span>
55
<ul class="navbar-nav">
66
<li class="nav-item" routerLinkActive="active">
7-
<a class="nav-link" routerLink="/message">Messages</a>
7+
<a class="nav-link" routerLink="/message">User Messages</a>
8+
</li>
9+
<li class="nav-item" routerLinkActive="active">
10+
<a class="nav-link" routerLink="/tag">Search by Tag</a>
811
</li>
912
<li class="nav-item" routerLinkActive="active">
1013
<a class="nav-link" routerLink="/createAccount">Create Account</a>

openshift/message-board/message-board-web/src/app/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { BoardDetailComponent } from './board-detail/board-detail.component';
1515
import { PostMessageComponent } from './post-message/post-message.component';
1616
import { MessageComponent } from './message/message.component';
1717
import { EventComponent } from './event/event.component';
18+
import { TagComponent } from './tag/tag.component';
1819

1920
@NgModule({
2021
imports: [
@@ -29,7 +30,8 @@ import { EventComponent } from './event/event.component';
2930
BoardDetailComponent,
3031
PostMessageComponent,
3132
MessageComponent,
32-
EventComponent
33+
EventComponent,
34+
TagComponent
3335
],
3436
providers: [MessageService, AccountService, EventService],
3537
bootstrap: [AppComponent]

openshift/message-board/message-board-web/src/app/board-detail/board-detail.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<div class="card">
77
<div class="card-body">
88
<p class="card-text">{{ message.body }}</p>
9-
<a *ngFor="let tag of message.tags" href="#" class="card-link text-info">{{ tag }}</a>
109
<button class="btn btn-outline-danger btn-sm" (click)="delete(message.id)">Delete</button>
10+
<a *ngFor="let tag of message.tags" routerLink="/tag/{{tag.name}}" class="card-link text-info">{{ tag.name }}</a>
1111
</div>
1212
</div>
1313
</div>

openshift/message-board/message-board-web/src/app/message.service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ export class MessageService {
2828
.pipe( catchError( this.handleError<Message[]>('findMessagesByUsername', []) ) );
2929
}
3030

31+
findMessagesByTag(term: string): Observable<Message[]> {
32+
if (!term || !term.trim()) {
33+
// if not search term, return empty message array.
34+
return of([]);
35+
}
36+
this.username = term;
37+
return this.http.get<Message[]>(`message-service/messages/tag/${term}`)
38+
.pipe( catchError( this.handleError<Message[]>('findMessagesByTag', []) ) );
39+
}
40+
3141
postMessage(body: string): Observable<any> {
3242
const message = new Message();
3343
message.username = this.username;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class Tag {
2+
name: string;
3+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<div class="container-fluid">
2+
<div class="row">
3+
<div class="col-lg-3">
4+
<div class="float-right">
5+
<label>Tag:
6+
<input [(ngModel)]="tag" placeholder="tag">
7+
</label>
8+
</div>
9+
</div>
10+
<div class="col-lg-9">
11+
<div class="container-fluid">
12+
<div *ngFor="let message of messages" class="container-fluid">
13+
<div class="card">
14+
<div class="card-body">
15+
<p class="card-text">{{ message.body }}</p>
16+
<a routerLink="/message/{{message.username}}" class="card-link text-danger">{{ message.username }}</a>
17+
<a *ngFor="let tag of message.tags" (click)="onSelect(tag)"
18+
routerLink="/tag/{{tag.name}}" class="card-link text-info">{{ tag.name }}</a>
19+
</div>
20+
</div>
21+
</div>
22+
</div>
23+
</div>
24+
</div>
25+
</div>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Component, OnInit, Input } from '@angular/core';
2+
import { ActivatedRoute } from '@angular/router';
3+
4+
import { Message } from '../message';
5+
import { Tag } from '../tag';
6+
import { MessageService } from '../message.service';
7+
8+
@Component({
9+
selector: 'app-tag',
10+
templateUrl: './tag.component.html'
11+
})
12+
export class TagComponent implements OnInit {
13+
14+
private _tag: string;
15+
16+
messages: Message[];
17+
18+
constructor( private route: ActivatedRoute, private service: MessageService ) { }
19+
20+
ngOnInit() {
21+
this.tag = this.route.snapshot.paramMap.get('tag');
22+
}
23+
24+
get tag(): string {
25+
return this._tag;
26+
}
27+
28+
@Input()
29+
set tag(tag: string) {
30+
if (tag) {
31+
this._tag = tag.replace("#","");
32+
}
33+
this.getMessages();
34+
}
35+
36+
getMessages(): void {
37+
this.service.findMessagesByTag(this.tag)
38+
.subscribe(messages => {
39+
this.messages = messages;
40+
console.log(messages);
41+
});
42+
}
43+
44+
onSelect(tag: Tag): void {
45+
this.tag = tag.name;
46+
}
47+
}

openshift/message-board/message-service/src/main/java/org/hibernate/demo/message/post/core/entity/Message.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@
1515
import javax.persistence.GeneratedValue;
1616
import javax.persistence.GenerationType;
1717
import javax.persistence.Id;
18-
import javax.persistence.OneToMany;
18+
import javax.persistence.ManyToMany;
1919
import javax.persistence.SequenceGenerator;
2020
import javax.persistence.Temporal;
2121
import javax.persistence.TemporalType;
22-
23-
import org.hibernate.annotations.Cascade;
24-
import org.hibernate.annotations.CascadeType;
2522
import org.hibernate.validator.constraints.NotEmpty;
2623

2724
/**
@@ -41,8 +38,7 @@ public class Message implements Comparable<Message> {
4138
@NotEmpty
4239
private String body;
4340

44-
@OneToMany(fetch = FetchType.EAGER)
45-
@Cascade(CascadeType.PERSIST)
41+
@ManyToMany(fetch = FetchType.EAGER)
4642
private Set<Tag> tags = new HashSet<>();
4743

4844
@Temporal(TemporalType.TIMESTAMP)
@@ -56,10 +52,6 @@ public Message(String username, String body) {
5652
this.body = body;
5753
}
5854

59-
public void addTag(String tagName) {
60-
this.tags.add( new Tag( tagName ) );
61-
}
62-
6355
public Set<Tag> getTags() {
6456
return tags;
6557
}
@@ -88,6 +80,10 @@ public void setTags(Set<Tag> tags) {
8880
this.tags = tags;
8981
}
9082

83+
public void addTag(Tag tag) {
84+
this.tags.add( tag );
85+
}
86+
9187
@Override
9288
public String toString() {
9389
return "Message{" +

openshift/message-board/message-service/src/main/java/org/hibernate/demo/message/post/core/entity/Tag.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import javax.persistence.Entity;
1010
import javax.persistence.Id;
11+
import javax.validation.constraints.Pattern;
1112

1213
import org.hibernate.validator.constraints.NotEmpty;
1314

@@ -19,6 +20,7 @@ public class Tag {
1920

2021
@Id
2122
@NotEmpty
23+
@Pattern( regexp = "#[\\p{L}0-9-_]+" )
2224
private String name;
2325

2426
private Tag() {
@@ -38,6 +40,14 @@ public boolean equals(Object o) {
3840
return name.equals( tag.name );
3941
}
4042

43+
public String getName() {
44+
return name;
45+
}
46+
47+
public void setName(String name) {
48+
this.name = name;
49+
}
50+
4151
@Override
4252
public int hashCode() {
4353
return name.hashCode();

0 commit comments

Comments
 (0)