Skip to content

Commit d049656

Browse files
authored
Show repository with current (#2917)
* show embedeed snippet with @WithoutTenant * Show example of @WithoutTenantId in docs
1 parent 3c17b5f commit d049656

File tree

7 files changed

+89
-35
lines changed

7 files changed

+89
-35
lines changed

data-jdbc/src/test/groovy/io/micronaut/data/jdbc/h2/multitenancy/TenancyBook.java

+4-8
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@
77
import io.micronaut.data.annotation.TenantId;
88
import io.micronaut.serde.annotation.Serdeable;
99

10-
@Serdeable // <1>
11-
@MappedEntity // <2>
12-
public record TenancyBook(@Nullable
13-
@Id // <3>
14-
@GeneratedValue // <4>
15-
Long id,
10+
@Serdeable
11+
@MappedEntity
12+
public record TenancyBook(@Nullable @Id @GeneratedValue Long id,
1613
String title,
17-
@TenantId // <5>
18-
String framework) {
14+
@TenantId String framework) {
1915
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
package io.micronaut.data.jdbc.h2.multitenancy;
22

33
import io.micronaut.context.annotation.Requires;
4+
import io.micronaut.http.HttpStatus;
45
import io.micronaut.http.annotation.Controller;
6+
import io.micronaut.http.annotation.Delete;
57
import io.micronaut.http.annotation.Get;
8+
import io.micronaut.http.annotation.Status;
69
import io.micronaut.scheduling.TaskExecutors;
710
import io.micronaut.scheduling.annotation.ExecuteOn;
811

912
import java.util.List;
1013

1114
@Requires(property = "spec.name", value = "TenancyBookControllerSpec")
12-
@Controller("/books") // <1>
15+
@Controller("/books")
1316
class TenancyBookController {
1417
private final TenancyBookRepository bookRepository;
1518

16-
TenancyBookController(TenancyBookRepository bookRepository) { // <2>
19+
TenancyBookController(TenancyBookRepository bookRepository) {
1720
this.bookRepository = bookRepository;
1821
}
1922

20-
@ExecuteOn(TaskExecutors.BLOCKING) // <3>
23+
@ExecuteOn(TaskExecutors.BLOCKING)
2124
@Get
22-
// <4>
2325
List<TenancyBook> index() {
2426
return bookRepository.findAll();
2527
}
28+
29+
@ExecuteOn(TaskExecutors.BLOCKING)
30+
@Delete
31+
@Status(HttpStatus.NO_CONTENT)
32+
void delete() {
33+
bookRepository.deleteAll();
34+
}
2635
}

data-jdbc/src/test/groovy/io/micronaut/data/jdbc/h2/multitenancy/TenancyBookControllerSpec.groovy

+25-2
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,16 @@ class TenancyBookControllerSpec extends Specification {
3939

4040
given:
4141
BlockingHttpClient client = httpClient.toBlocking()
42+
save(bookRepository, client, "Quarkus in Action", "quarkus")
4243
save(bookRepository, client, "Building Microservices with Micronaut", "micronaut")
4344
save(bookRepository, client, "Introducing Micronaut", "micronaut")
4445
save(bookRepository, client, "Grails 3 - Step by Step", "grails")
4546
save(bookRepository, client, "Falando de Grail", "grails")
4647
save(bookRepository, client, "Grails Goodness Notebook", "grails")
4748

49+
expect:
50+
bookRepository.count() == 6
51+
4852
when:
4953
List<TenancyBook> books = fetchBooks(client, "micronaut")
5054
then:
@@ -57,10 +61,29 @@ class TenancyBookControllerSpec extends Specification {
5761
books
5862
books.size() == 3
5963

60-
cleanup:
61-
bookRepository.deleteAll()
64+
when:
65+
deleteBooks(client, "micronaut")
66+
then:
67+
bookRepository.count() == 4
68+
69+
when:
70+
deleteBooks(client, "grails")
71+
72+
then:
73+
bookRepository.count() == 1
74+
75+
when:
76+
bookRepository.removeAll()
77+
then:
78+
bookRepository.count() == 0
6279
}
6380

81+
void deleteBooks(BlockingHttpClient client, String framework) {
82+
HttpRequest<?> request = HttpRequest.DELETE("/books").header("tenantId", framework)
83+
HttpResponse<?> response = client.exchange(request)
84+
assertEquals(HttpStatus.NO_CONTENT, response.getStatus())
85+
86+
}
6487
List<TenancyBook> fetchBooks(BlockingHttpClient client, String framework) {
6588
HttpRequest<?> request = HttpRequest.GET("/books").header("tenantId", framework)
6689
Argument<List<TenancyBook>> responseArgument = Argument.listOf(TenancyBook.class)
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package io.micronaut.data.jdbc.h2.multitenancy;
22

33
import io.micronaut.context.annotation.Requires;
4+
import io.micronaut.data.annotation.Query;
45
import io.micronaut.data.annotation.WithoutTenantId;
56
import io.micronaut.data.jdbc.annotation.JdbcRepository;
67
import io.micronaut.data.model.query.builder.sql.Dialect;
78
import io.micronaut.data.repository.CrudRepository;
89

910
@Requires(property = "spec.name", value = "TenancyBookControllerSpec")
10-
@JdbcRepository(dialect = Dialect.H2) // <1>
11-
public interface TenancyBookRepository extends CrudRepository<TenancyBook, Long> { // <2>
11+
//tag::clazz[]
12+
@JdbcRepository(dialect = Dialect.H2)
13+
public interface TenancyBookRepository extends CrudRepository<TenancyBook, Long> {
1214
Long save(String title);
1315

1416
@WithoutTenantId
15-
@Override
16-
void deleteAll();
17+
long count();
18+
19+
@WithoutTenantId
20+
void removeAll();
1721
}
22+
//end::clazz[]

src/main/docs/guide/shared/multitenancy/discriminatormode.adoc

-16
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,3 @@ When using discriminator column multitenancy, the entity with multitenancy enabl
55
include::doc-examples/jdbc-multitenancy-discriminator-example-java/src/main/java/example/Book.java[tags="book"]
66
----
77

8-
There are specific annotations to alter the behaviour of repositories with api:data.annotation.TenantId[] property and its methods:
9-
10-
[cols=2*]
11-
|===
12-
|*Annotation*
13-
|*Description*
14-
15-
|api:data.annotation.WithoutTenantId[]
16-
|The method's query will not have implicit predicate to include the tenant id
17-
18-
|api:data.annotation.WithTenantId[]
19-
|Modify the tenant id of the query
20-
21-
|===
22-
23-
NOTE: The tenancy annotations are only supported for the discriminator multitenancy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
There are specific annotations to alter the behaviour of repositories with api:data.annotation.TenantId[] property and its methods:
2+
3+
[cols=2*]
4+
|===
5+
|*Annotation*
6+
|*Description*
7+
8+
|api:data.annotation.WithoutTenantId[`@WithTenantId`]
9+
|The method's query will not have implicit predicate to include the tenant id
10+
11+
|api:data.annotation.WithTenantId[`@WithTenantId`]
12+
|Modify the tenant id of the query
13+
14+
|===
15+
16+
NOTE: The tenancy annotations are only supported for the discriminator multitenancy
17+
18+
For example, given the following Entity:
19+
20+
[source,java]
21+
----
22+
include::data-jdbc/src/test/groovy/io/micronaut/data/jdbc/h2/multitenancy/TenancyBook.java[]
23+
----
24+
25+
The following repository's `removeAll` method is annotated with the `@WithoutTenantId` annotation.
26+
27+
[source,java]
28+
----
29+
include::data-jdbc/src/test/groovy/io/micronaut/data/jdbc/h2/multitenancy/TenancyBookRepository.java[tags=clazz]
30+
----
31+
32+
33+
The method `deleteAll`, inherited from `CrudRepository`, executes a query such as: `DELETE FROM tenancy_book WHERE framework = `.
34+
35+
However, the method `removeAll` will execute a query such as: `DELETE FROM tenancy_book`

src/main/docs/guide/toc.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ shared:
3636
kotlinCriteria: Kotlin Criteria API extensions
3737
multitenancy:
3838
title: Multi-tenancy
39-
discriminatormode: Discriminator Mode
39+
discriminatormode:
40+
title: Discriminator Mode
41+
multitenancyannotations: Multi-tenancy annotations
4042
multitenancymodes: Multitenancy modes
4143
datasourcemode: DataSource Mode
4244
schemamode: Schema Mode

0 commit comments

Comments
 (0)