55package app.accrescent.server.parcelo.api.console
66
77import app.accrescent.console.v1alpha1.ErrorReason
8+ import app.accrescent.console.v1alpha1.GetOrganizationRequest
9+ import app.accrescent.console.v1alpha1.GetOrganizationResponse
810import app.accrescent.console.v1alpha1.ListOrganizationsRequest
911import app.accrescent.console.v1alpha1.ListOrganizationsResponse
1012import app.accrescent.console.v1alpha1.OrganizationService
13+ import app.accrescent.console.v1alpha1.getOrganizationResponse
1114import app.accrescent.console.v1alpha1.listOrganizationsResponse
1215import app.accrescent.console.v1alpha1.organization
1316import app.accrescent.parcelo.impl.v1.ListOrganizationsPageToken
1417import app.accrescent.parcelo.impl.v1.listOrganizationsPageToken
1518import app.accrescent.server.parcelo.api.error.ConsoleApiError
19+ import app.accrescent.server.parcelo.data.App
1620import app.accrescent.server.parcelo.data.Organization
1721import app.accrescent.server.parcelo.security.AuthnContextKey
1822import app.accrescent.server.parcelo.security.GrpcAuthenticationInterceptor
1923import app.accrescent.server.parcelo.security.GrpcRateLimitInterceptor
2024import app.accrescent.server.parcelo.security.GrpcRequestValidationInterceptor
25+ import app.accrescent.server.parcelo.security.HasPermissionRequest
26+ import app.accrescent.server.parcelo.security.PermissionService
2127import com.google.protobuf.InvalidProtocolBufferException
2228import io.quarkus.grpc.GrpcService
2329import io.quarkus.grpc.RegisterInterceptor
2430import io.smallrye.mutiny.Uni
31+ import jakarta.inject.Inject
2532import jakarta.transaction.Transactional
2633import kotlin.io.encoding.Base64
2734
@@ -32,7 +39,46 @@ private const val MAX_PAGE_SIZE = 50u
3239@RegisterInterceptor(GrpcAuthenticationInterceptor ::class )
3340@RegisterInterceptor(GrpcRequestValidationInterceptor ::class )
3441@RegisterInterceptor(GrpcRateLimitInterceptor ::class )
35- class OrganizationServiceImpl : OrganizationService {
42+ class OrganizationServiceImpl @Inject constructor(
43+ private val permissionService : PermissionService ,
44+ ) : OrganizationService {
45+ @Transactional
46+ override fun getOrganization (request : GetOrganizationRequest ): Uni <GetOrganizationResponse > {
47+ val userId = AuthnContextKey .USER_ID .get()
48+
49+ val canView = permissionService
50+ .hasPermission(HasPermissionRequest .ViewOrganization (request.organizationId, userId))
51+ if (! canView) {
52+ val exists = Organization .existsById(request.organizationId)
53+ val canViewExistence = permissionService.hasPermission(
54+ HasPermissionRequest .ViewOrganizationExistence (request.organizationId, userId)
55+ )
56+
57+ throw if (! exists || ! canViewExistence) {
58+ organizationNotFoundException(request.organizationId)
59+ } else {
60+ ConsoleApiError (
61+ ErrorReason .ERROR_REASON_INSUFFICIENT_PERMISSION ,
62+ " insufficient permission to view organization" ,
63+ )
64+ .toStatusRuntimeException()
65+ }
66+ }
67+
68+ val organization = Organization
69+ .findById(request.organizationId)
70+ ? : throw organizationNotFoundException(request.organizationId)
71+ val response = getOrganizationResponse {
72+ this .organization = organization {
73+ id = organization.id
74+ publishedAppLimit = organization.publishedAppLimit
75+ publishedAppCount = App .countInOrganization(organization.id).toInt()
76+ }
77+ }
78+
79+ return Uni .createFrom().item { response }
80+ }
81+
3682 @Transactional
3783 override fun listOrganizations (
3884 request : ListOrganizationsRequest ,
@@ -67,6 +113,8 @@ class OrganizationServiceImpl : OrganizationService {
67113 .map { organization ->
68114 organization {
69115 id = organization.id
116+ publishedAppLimit = organization.publishedAppLimit
117+ publishedAppCount = App .countInOrganization(organization.id).toInt()
70118 }
71119 }
72120
@@ -94,5 +142,11 @@ class OrganizationServiceImpl : OrganizationService {
94142 " provided page token is invalid" ,
95143 )
96144 .toStatusRuntimeException()
145+
146+ private fun organizationNotFoundException (organizationId : String ) = ConsoleApiError (
147+ ErrorReason .ERROR_REASON_RESOURCE_NOT_FOUND ,
148+ " organization \" $organizationId \" not found" ,
149+ )
150+ .toStatusRuntimeException()
97151 }
98152}
0 commit comments