/** * Create an internal call callcontext using an existing account to retrieve tenant and account record ids * <p/> * This is used for r/w operations - we need the account id to populate the account_record_id field * * @param accountId account id * @param context original call callcontext * @return internal call callcontext */ public InternalCallContext createInternalCallContext(final UUID accountId, final CallContext context) { return createInternalCallContext(accountId, ObjectType.ACCOUNT, context); }
private InternalCallContext createCallContextFromBundleId(final UUID bundleId, final CallContext context) { return internalCallContextFactory.createInternalCallContext(bundleId, ObjectType.BUNDLE, context); }
protected InternalCallContext createCallContext(final UUID userToken, final Long accountRecordId, final Long tenantRecordId) { return internalCallContextFactory.createInternalCallContext(tenantRecordId, accountRecordId, "OverdueService", CallOrigin.INTERNAL, UserType.SYSTEM, userToken); }
private InternalCallContext createCallContext(final UUID userToken, final Long accountRecordId, final Long tenantRecordId) { return internalCallContextFactory.createInternalCallContext(tenantRecordId, accountRecordId, "OverdueService", CallOrigin.INTERNAL, UserType.SYSTEM, userToken); }
private InternalCallContext createCallContextFromAccountId(final UUID accountId, final CallContext context) { return internalCallContextFactory.createInternalCallContext(accountId, ObjectType.ACCOUNT, context); }
/** * Create an internal call callcontext * <p/> * This is used by notification queue and persistent bus - accountRecordId is expected to be non null * * @param tenantRecordId tenant record id - if null, the default tenant record id value will be used * @param accountRecordId account record id (can be null in specific use-cases, e.g. config change events in BeatrixListener) * @param userName user name * @param callOrigin call origin * @param userType user type * @param userToken user token, if any * @return internal call callcontext */ public InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, @Nullable final Long accountRecordId, final String userName, final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken) { return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null, null, null); }
@Override public void removeTags(final UUID objectId, final ObjectType objectType, final Collection<UUID> tagDefinitionIds, final CallContext context) throws TagApiException { // TODO: consider making this batch for (final UUID tagDefinitionId : tagDefinitionIds) { tagDao.deleteTag(objectId, objectType, tagDefinitionId, internalCallContextFactory.createInternalCallContext(objectId, objectType, context)); } }
public InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final String userName, final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken, final Long tenantRecordId) { final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, tenantRecordId); return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null, null, null); }
@Override public void exportDataForAccount(final UUID accountId, final DatabaseExportOutputStream out, final CallContext context) { final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(accountId, context); exportDao.exportDataForAccount(out, internalContext); }
@Override public void removeTag(final UUID objectId, final ObjectType objectType, final UUID tagDefinitionId, final CallContext context) throws TagApiException { tagDao.deleteTag(objectId, objectType, tagDefinitionId, internalCallContextFactory.createInternalCallContext(objectId, objectType, context)); }
@Override public void removeCustomFields(final List<CustomField> customFields, final CallContext context) throws CustomFieldApiException { if (!customFields.isEmpty()) { final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(customFields.get(0).getObjectId(), customFields.get(0).getObjectType(), context); final Iterable<UUID> curstomFieldIds = Iterables.transform(customFields, new Function<CustomField, UUID>() { @Override public UUID apply(final CustomField input) { return input.getId(); } }); customFieldDao.deleteCustomFields(curstomFieldIds, internalCallContext); } }
@Override public void updateCustomFields(final List<CustomField> customFields, final CallContext context) throws CustomFieldApiException { if (!customFields.isEmpty()) { final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(customFields.get(0).getObjectId(), customFields.get(0).getObjectType(), context); final Iterable<CustomFieldModelDao> customFieldIds = Iterables.transform(customFields, new Function<CustomField, CustomFieldModelDao>() { @Override public CustomFieldModelDao apply(final CustomField input) { return new CustomFieldModelDao(input.getId(), internalCallContext.getCreatedDate(), internalCallContext.getUpdatedDate(), input.getFieldName(), input.getFieldValue(), input.getObjectId(), input.getObjectType()); } }); customFieldDao.updateCustomFields(customFieldIds, internalCallContext); } }
private void updateAccount(final UUID accountId, final AccountData account, final boolean treatNullValueAsReset, final CallContext context) throws AccountApiException { final AccountModelDao updatedAccountModelDao = new AccountModelDao(accountId, null, null, account, false); accountDao.update(updatedAccountModelDao, treatNullValueAsReset, internalCallContextFactory.createInternalCallContext(accountId, context)); }
@Override public void addEmail(final UUID accountId, final AccountEmail email, final CallContext context) throws AccountApiException { accountDao.addEmail(new AccountEmailModelDao(email), internalCallContextFactory.createInternalCallContext(accountId, context)); }
@Override public void removeEmail(final UUID accountId, final AccountEmail email, final CallContext context) { accountDao.removeEmail(new AccountEmailModelDao(email, false), internalCallContextFactory.createInternalCallContext(accountId, context)); }
@Override public void addCustomFields(final List<CustomField> customFields, final CallContext context) throws CustomFieldApiException { if (!customFields.isEmpty()) { final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(customFields.get(0).getObjectId(), customFields.get(0).getObjectType(), context); final Iterable<CustomFieldModelDao> transformed = Iterables.transform(customFields, new Function<CustomField, CustomFieldModelDao>() { @Override public CustomFieldModelDao apply(final CustomField input) { // Respect user-specified ID // TODO See https://github.com/killbill/killbill/issues/35 if (input.getId() != null) { return new CustomFieldModelDao(input.getId(), context.getCreatedDate(), context.getCreatedDate(), input.getFieldName(), input.getFieldValue(), input.getObjectId(), input.getObjectType()); } else { return new CustomFieldModelDao(context.getCreatedDate(), input.getFieldName(), input.getFieldValue(), input.getObjectId(), input.getObjectType()); } } }); ((DefaultCustomFieldDao) customFieldDao).create(transformed, internalCallContext); } }
@Override public void handleReadyNotification(final NotificationEvent inputKey, final DateTime eventDateTime, final UUID fromNotificationQueueUserToken, final Long accountRecordId, final Long tenantRecordId) { if (!(inputKey instanceof SubscriptionNotificationKey)) { log.error("SubscriptionBase service received an unexpected event className='{}'", inputKey.getClass().getName()); return; } final SubscriptionNotificationKey key = (SubscriptionNotificationKey) inputKey; final SubscriptionBaseEvent event = dao.getEventById(key.getEventId(), internalCallContextFactory.createInternalTenantContext(tenantRecordId, accountRecordId)); if (event == null) { // This can be expected if the event is soft deleted (is_active = 0) log.debug("Failed to extract event for notification key {}", inputKey); return; } final InternalCallContext context = internalCallContextFactory.createInternalCallContext(tenantRecordId, accountRecordId, "SubscriptionEventQueue", CallOrigin.INTERNAL, UserType.SYSTEM, fromNotificationQueueUserToken); processEventReady(event, key.getSeqId(), context); } };
@Override public void addTag(final UUID objectId, final ObjectType objectType, final UUID tagDefinitionId, final CallContext context) throws TagApiException { if (SystemTags.isSystemTag(tagDefinitionId)) { // TODO Create a proper ErrorCode instaed throw new IllegalStateException(String.format("Failed to add tag for tagDefinitionId='%s': System tags are reserved for the system.", tagDefinitionId)); } final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(objectId, objectType, context); final TagModelDao tag = new TagModelDao(context.getCreatedDate(), tagDefinitionId, objectId, objectType); try { tagDao.create(tag, internalContext); } catch (TagApiException e) { // Be lenient here and make the addTag method idempotent if (ErrorCode.TAG_ALREADY_EXISTS.getCode() != e.getCode()) { throw e; } } }
public BillingState billingState(final InternalCallContext context) throws OverdueException { if ((overdueable.getParentAccountId() != null) && (overdueable.isPaymentDelegatedToParent())) { // calculate billing state from parent account final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(overdueable.getParentAccountId(), context); final InternalCallContext parentAccountContext = internalCallContextFactory.createInternalCallContext(internalTenantContext.getAccountRecordId(), context); return billingStateCalcuator.calculateBillingState(overdueable, parentAccountContext); } return billingStateCalcuator.calculateBillingState(overdueable, context); } }
@Override public void recordRolledUpUsage(final SubscriptionUsageRecord record, final CallContext callContext) throws UsageApiException { final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(record.getSubscriptionId(), ObjectType.SUBSCRIPTION, callContext); // check if we have (at least) one row with the supplied tracking id if(!Strings.isNullOrEmpty(record.getTrackingId()) && recordsWithTrackingIdExist(record, internalCallContext)){ throw new UsageApiException(ErrorCode.USAGE_RECORD_TRACKING_ID_ALREADY_EXISTS, record.getTrackingId()); } final List<RolledUpUsageModelDao> usages = new ArrayList<RolledUpUsageModelDao>(); for (final UnitUsageRecord unitUsageRecord : record.getUnitUsageRecord()) { for (final UsageRecord usageRecord : unitUsageRecord.getDailyAmount()) { usages.add(new RolledUpUsageModelDao(record.getSubscriptionId(), unitUsageRecord.getUnitType(), usageRecord.getDate(), usageRecord.getAmount(), record.getTrackingId())); } } rolledUpUsageDao.record(usages, internalCallContext); }