Details
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
index 46f72e6..43c3f65 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
@@ -195,4 +195,16 @@ public class DefaultAccountUserApi extends DefaultAccountApiBase implements Acco
public void removeEmail(final UUID accountId, final AccountEmail email, final CallContext context) {
accountDao.removeEmail(new AccountEmailModelDao(email, false), internalCallContextFactory.createInternalCallContext(accountId, context));
}
+
+ @Override
+ public List<Account> getChildAccounts(final UUID parentAccountId, final TenantContext context) throws AccountApiException {
+ getAccountById(parentAccountId, context);
+ return ImmutableList.<Account>copyOf(Collections2.transform(accountDao.getAccountsByParentId(parentAccountId, internalCallContextFactory.createInternalTenantContext(context)),
+ new Function<AccountModelDao, Account>() {
+ @Override
+ public Account apply(final AccountModelDao input) {
+ return new DefaultAccount(input);
+ }
+ }));
+ }
}
diff --git a/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
index c5cae6d..1446204 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/AccountDao.java
@@ -52,4 +52,6 @@ public interface AccountDao extends EntityDao<AccountModelDao, Account, AccountA
List<AccountEmailModelDao> getEmailsByAccountId(UUID accountId, InternalTenantContext context);
Integer getAccountBCD(UUID accountId, InternalTenantContext context);
+
+ List<AccountModelDao> getAccountsByParentId(UUID parentAccountId, InternalTenantContext context);
}
diff --git a/account/src/main/java/org/killbill/billing/account/dao/AccountSqlDao.java b/account/src/main/java/org/killbill/billing/account/dao/AccountSqlDao.java
index 5395c85..d474747 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/AccountSqlDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/AccountSqlDao.java
@@ -16,6 +16,7 @@
package org.killbill.billing.account.dao;
+import java.util.List;
import java.util.UUID;
import org.killbill.billing.account.api.Account;
@@ -55,4 +56,8 @@ public interface AccountSqlDao extends EntitySqlDao<AccountModelDao, Account> {
public void updatePaymentMethod(@Bind("id") String accountId,
@Bind("paymentMethodId") String paymentMethodId,
@BindBean final InternalCallContext context);
+
+ @SqlQuery
+ List<AccountModelDao> getAccountsByParentId(@Bind("parentAccountId") UUID parentAccountId,
+ @BindBean final InternalTenantContext context);
}
diff --git a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
index 31c33e3..e713194 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
@@ -255,4 +255,14 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
}
});
}
+
+ @Override
+ public List<AccountModelDao> getAccountsByParentId(final UUID parentAccountId, final InternalTenantContext context) {
+ return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<AccountModelDao>>() {
+ @Override
+ public List<AccountModelDao> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+ return entitySqlDaoWrapperFactory.become(AccountSqlDao.class).getAccountsByParentId(parentAccountId, context);
+ }
+ });
+ }
}
diff --git a/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg b/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
index d63c10b..d95575a 100644
--- a/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
+++ b/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
@@ -108,3 +108,8 @@ getIdFromKey() ::= <<
WHERE external_key = :externalKey <AND_CHECK_TENANT()>;
>>
+getAccountsByParentId() ::= <<
+ select <allTableFields()>
+ from accounts
+ where parent_account_id = :parentAccountId <AND_CHECK_TENANT()>;
+>>
\ No newline at end of file
diff --git a/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
index a06aa3f..4561d58 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/MockAccountDao.java
@@ -50,6 +50,7 @@ import com.google.inject.Inject;
public class MockAccountDao extends MockEntityDaoBase<AccountModelDao, Account, AccountApiException> implements AccountDao {
+ private final MockEntityDaoBase<AccountModelDao, Account, AccountApiException> accountSqlDao = new MockEntityDaoBase<AccountModelDao, Account, AccountApiException>();
private final MockEntityDaoBase<AccountEmailModelDao, AccountEmail, AccountApiException> accountEmailSqlDao = new MockEntityDaoBase<AccountEmailModelDao, AccountEmail, AccountApiException>();
private final PersistentBus eventBus;
@@ -171,4 +172,13 @@ public class MockAccountDao extends MockEntityDaoBase<AccountModelDao, Account,
return account != null ? account.getBillingCycleDayLocal() : 0;
}
+ @Override
+ public List<AccountModelDao> getAccountsByParentId(final UUID parentAccountId, final InternalTenantContext context) {
+ return ImmutableList.<AccountModelDao>copyOf(Iterables.<AccountModelDao>filter(accountSqlDao.getAll(context), new Predicate<AccountModelDao>() {
+ @Override
+ public boolean apply(final AccountModelDao input) {
+ return input.getParentAccountId().equals(parentAccountId);
+ }
+ }));
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index 3a83f47..d0cbe08 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -1207,4 +1207,33 @@ public class AccountResource extends JaxRsResourceBase {
protected ObjectType getObjectType() {
return ObjectType.ACCOUNT;
}
+
+ // -------------------------------------
+ // Parent and child accounts
+ // -------------------------------------
+
+ @TimedResource
+ @GET
+ @Path("/{accountId:" + UUID_PATTERN + "}/" + CHILDS)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "List child accounts", response = AccountJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid parent account id supplied"),
+ @ApiResponse(code = 404, message = "Parent Account not found")})
+ public Response getChildAccounts(@PathParam("accountId") final String parentAccountId,
+ @QueryParam(QUERY_ACCOUNT_WITH_BALANCE) @DefaultValue("false") final Boolean accountWithBalance,
+ @QueryParam(QUERY_ACCOUNT_WITH_BALANCE_AND_CBA) @DefaultValue("false") final Boolean accountWithBalanceAndCBA,
+ @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+
+ final TenantContext tenantContext = context.createContext(request);
+ final List<Account> accounts = accountUserApi.getChildAccounts(UUID.fromString(parentAccountId), tenantContext);
+
+ final List<AccountJson> accountJson = new ArrayList<AccountJson>();
+ for (final Account account : accounts) {
+ final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(account.getId(), auditMode.getLevel(), tenantContext);
+ accountJson.add(getAccount(account, accountWithBalance, accountWithBalanceAndCBA, accountAuditLogs, tenantContext));
+ }
+ return Response.status(Status.OK).entity(accountJson).build();
+ }
+
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index 2fdd31e..e6ba0f4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -239,4 +239,7 @@ public interface JaxrsResource {
public static final String COMBO = "combo";
+ public static final String CHILDS = "childs";
+ public static final String CHILDS_PATH = PREFIX + "/" + CHILDS;
+
}