|
@@ -90,9 +90,9 @@ function getDynamicBagOwner(bagId: DynamicBagId) {
|
|
|
|
|
|
function getStaticBagId(bagId: StaticBagId): string {
|
|
function getStaticBagId(bagId: StaticBagId): string {
|
|
if (bagId.isCouncil) {
|
|
if (bagId.isCouncil) {
|
|
- return `CO`
|
|
|
|
|
|
+ return `static:council`
|
|
} else if (bagId.isWorkingGroup) {
|
|
} else if (bagId.isWorkingGroup) {
|
|
- return `WG-${bagId.asWorkingGroup.type}`
|
|
|
|
|
|
+ return `static:wg:${bagId.asWorkingGroup.type.toLowerCase()}`
|
|
} else {
|
|
} else {
|
|
throw new Error(`Unexpected static bag type: ${bagId.type}`)
|
|
throw new Error(`Unexpected static bag type: ${bagId.type}`)
|
|
}
|
|
}
|
|
@@ -100,9 +100,9 @@ function getStaticBagId(bagId: StaticBagId): string {
|
|
|
|
|
|
function getDynamicBagId(bagId: DynamicBagId): string {
|
|
function getDynamicBagId(bagId: DynamicBagId): string {
|
|
if (bagId.isChannel) {
|
|
if (bagId.isChannel) {
|
|
- return `CH-${bagId.asChannel.toString()}`
|
|
|
|
|
|
+ return `dynamic:channel:${bagId.asChannel.toString()}`
|
|
} else if (bagId.isMember) {
|
|
} else if (bagId.isMember) {
|
|
- return `M-${bagId.asMember.toString()}`
|
|
|
|
|
|
+ return `dynamic:member:${bagId.asMember.toString()}`
|
|
} else {
|
|
} else {
|
|
throw new Error(`Unexpected dynamic bag type: ${bagId.type}`)
|
|
throw new Error(`Unexpected dynamic bag type: ${bagId.type}`)
|
|
}
|
|
}
|
|
@@ -180,7 +180,16 @@ async function getDistributionBucketFamilyWithMetadata(
|
|
return family
|
|
return family
|
|
}
|
|
}
|
|
|
|
|
|
-// BUCKETS
|
|
|
|
|
|
+async function getStorageSystem(store: DatabaseManager) {
|
|
|
|
+ const storageSystem = await store.get(StorageSystemParameters, {})
|
|
|
|
+ if (!storageSystem) {
|
|
|
|
+ throw new Error('Storage system entity is missing!')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return storageSystem
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// STORAGE BUCKETS
|
|
|
|
|
|
export async function storage_StorageBucketCreated({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_StorageBucketCreated({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [
|
|
const [
|
|
@@ -196,6 +205,8 @@ export async function storage_StorageBucketCreated({ event, store }: EventContex
|
|
acceptingNewBags: acceptingNewBags.isTrue,
|
|
acceptingNewBags: acceptingNewBags.isTrue,
|
|
dataObjectCountLimit: new BN(dataObjectCountLimit.toString()),
|
|
dataObjectCountLimit: new BN(dataObjectCountLimit.toString()),
|
|
dataObjectsSizeLimit: new BN(dataObjectSizeLimit.toString()),
|
|
dataObjectsSizeLimit: new BN(dataObjectSizeLimit.toString()),
|
|
|
|
+ dataObjectsCount: new BN(0),
|
|
|
|
+ dataObjectsSize: new BN(0),
|
|
})
|
|
})
|
|
if (invitedWorkerId.isSome) {
|
|
if (invitedWorkerId.isSome) {
|
|
const operatorStatus = new StorageBucketOperatorStatusInvited()
|
|
const operatorStatus = new StorageBucketOperatorStatusInvited()
|
|
@@ -297,10 +308,33 @@ export async function storage_StorageBucketsUpdatedForBag({
|
|
await Promise.all(assignmentsToAdd.map((a) => store.save<StorageBagStorageAssignment>(a)))
|
|
await Promise.all(assignmentsToAdd.map((a) => store.save<StorageBagStorageAssignment>(a)))
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+export async function storage_VoucherChanged({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
|
|
+ const [bucketId, voucher] = new Storage.VoucherChangedEvent(event).params
|
|
|
|
+ const bucket = await getById(store, StorageBucket, bucketId.toString())
|
|
|
|
+
|
|
|
|
+ bucket.dataObjectCountLimit = voucher.objectsLimit
|
|
|
|
+ bucket.dataObjectsSizeLimit = voucher.sizeLimit
|
|
|
|
+ bucket.dataObjectsCount = voucher.objectsUsed
|
|
|
|
+ bucket.dataObjectsSize = voucher.sizeUsed
|
|
|
|
+
|
|
|
|
+ await store.save<StorageBucket>(bucket)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+export async function storage_StorageBucketVoucherLimitsSet({
|
|
|
|
+ event,
|
|
|
|
+ store,
|
|
|
|
+}: EventContext & StoreContext): Promise<void> {
|
|
|
|
+ const [bucketId, sizeLimit, countLimit] = new Storage.StorageBucketVoucherLimitsSetEvent(event).params
|
|
|
|
+ const bucket = await getById(store, StorageBucket, bucketId.toString())
|
|
|
|
+ bucket.dataObjectsSizeLimit = sizeLimit
|
|
|
|
+ bucket.dataObjectCountLimit = countLimit
|
|
|
|
+
|
|
|
|
+ await store.save<StorageBucket>(bucket)
|
|
|
|
+}
|
|
|
|
+
|
|
export async function storage_StorageBucketDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_StorageBucketDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [bucketId] = new Storage.StorageBucketDeletedEvent(event).params
|
|
const [bucketId] = new Storage.StorageBucketDeletedEvent(event).params
|
|
- // TODO: Delete or just change status?
|
|
|
|
- // TODO: Cascade remove on db level?
|
|
|
|
|
|
+ // TODO: Cascade remove on db level (would require changes in Hydra / comitting autogenerated files)
|
|
const assignments = await store.getMany(StorageBagStorageAssignment, {
|
|
const assignments = await store.getMany(StorageBagStorageAssignment, {
|
|
where: { storageBucket: { id: bucketId.toString() } },
|
|
where: { storageBucket: { id: bucketId.toString() } },
|
|
})
|
|
})
|
|
@@ -320,10 +354,8 @@ export async function storage_DynamicBagCreated({ event, store }: EventContext &
|
|
|
|
|
|
export async function storage_DynamicBagDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_DynamicBagDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [, bagId] = new Storage.DynamicBagDeletedEvent(event).params
|
|
const [, bagId] = new Storage.DynamicBagDeletedEvent(event).params
|
|
- // TODO: Delete or just change status?
|
|
|
|
- // TODO: Cascade remove on db level?
|
|
|
|
const storageBag = await getDynamicBag(store, bagId, ['objects'])
|
|
const storageBag = await getDynamicBag(store, bagId, ['objects'])
|
|
- await Promise.all((storageBag.objects || []).map((o) => store.remove<StorageDataObject>(o)))
|
|
|
|
|
|
+ // The bag should already be empty, so no cascade-remove required
|
|
await store.remove<StorageBag>(storageBag)
|
|
await store.remove<StorageBag>(storageBag)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -373,24 +405,10 @@ export async function storage_DataObjectsMoved({ event, store }: EventContext &
|
|
export async function storage_DataObjectsDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_DataObjectsDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [, bagId, dataObjectIds] = new Storage.DataObjectsDeletedEvent(event).params
|
|
const [, bagId, dataObjectIds] = new Storage.DataObjectsDeletedEvent(event).params
|
|
const dataObjects = await getDataObjectsInBag(store, bagId, dataObjectIds)
|
|
const dataObjects = await getDataObjectsInBag(store, bagId, dataObjectIds)
|
|
- // TODO: Delete them or just change status?
|
|
|
|
- // (may not be so optimal if we expect a large amount of data objects)
|
|
|
|
await Promise.all(dataObjects.map((o) => store.remove<StorageDataObject>(o)))
|
|
await Promise.all(dataObjects.map((o) => store.remove<StorageDataObject>(o)))
|
|
}
|
|
}
|
|
|
|
|
|
-// BLACKLIST
|
|
|
|
-export async function storage_UpdateBlacklist({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
|
|
- const [removedContentIds, addedContentIds] = new Storage.UpdateBlacklistEvent(event).params
|
|
|
|
- const storageSystem = await store.get(StorageSystemParameters, {})
|
|
|
|
- if (!storageSystem) {
|
|
|
|
- throw new Error('StorageSystemParameters entity not found!')
|
|
|
|
- }
|
|
|
|
- storageSystem.blacklist = storageSystem.blacklist
|
|
|
|
- .filter((cid) => !Array.from(removedContentIds).some((id) => id.eq(cid)))
|
|
|
|
- .concat(Array.from(addedContentIds).map((id) => id.toString()))
|
|
|
|
-
|
|
|
|
- await store.save<StorageSystemParameters>(storageSystem)
|
|
|
|
-}
|
|
|
|
|
|
+// DISTRIBUTION FAMILY
|
|
|
|
|
|
export async function storage_DistributionBucketFamilyCreated({
|
|
export async function storage_DistributionBucketFamilyCreated({
|
|
event,
|
|
event,
|
|
@@ -405,6 +423,18 @@ export async function storage_DistributionBucketFamilyCreated({
|
|
await store.save<DistributionBucketFamily>(family)
|
|
await store.save<DistributionBucketFamily>(family)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+export async function storage_DistributionBucketFamilyMetadataSet({
|
|
|
|
+ event,
|
|
|
|
+ store,
|
|
|
|
+}: EventContext & StoreContext): Promise<void> {
|
|
|
|
+ const [familyId, metadataBytes] = new Storage.DistributionBucketFamilyMetadataSetEvent(event).params
|
|
|
|
+
|
|
|
|
+ const family = await getDistributionBucketFamilyWithMetadata(store, familyId.toString())
|
|
|
|
+ family.metadata = await processDistributionBucketFamilyMetadata(store, family.metadata, metadataBytes)
|
|
|
|
+
|
|
|
|
+ await store.save<DistributionBucketFamily>(family)
|
|
|
|
+}
|
|
|
|
+
|
|
export async function storage_DistributionBucketFamilyDeleted({
|
|
export async function storage_DistributionBucketFamilyDeleted({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
@@ -416,6 +446,8 @@ export async function storage_DistributionBucketFamilyDeleted({
|
|
await store.remove(family)
|
|
await store.remove(family)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// DISTRIBUTION BUCKET
|
|
|
|
+
|
|
export async function storage_DistributionBucketCreated({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_DistributionBucketCreated({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [familyId, acceptingNewBags, bucketId] = new Storage.DistributionBucketCreatedEvent(event).params
|
|
const [familyId, acceptingNewBags, bucketId] = new Storage.DistributionBucketCreatedEvent(event).params
|
|
|
|
|
|
@@ -444,8 +476,7 @@ export async function storage_DistributionBucketStatusUpdated({
|
|
|
|
|
|
export async function storage_DistributionBucketDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
export async function storage_DistributionBucketDeleted({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
const [, bucketId] = new Storage.DistributionBucketDeletedEvent(event).params
|
|
const [, bucketId] = new Storage.DistributionBucketDeletedEvent(event).params
|
|
- // TODO: Delete or just change status?
|
|
|
|
- // TODO: Cascade remove on db level?
|
|
|
|
|
|
+ // TODO: Cascade remove on db level (would require changes in Hydra / comitting autogenerated files)
|
|
const assignments = await store.getMany(StorageBagDistributionAssignment, {
|
|
const assignments = await store.getMany(StorageBagDistributionAssignment, {
|
|
where: { distributionBucket: { id: bucketId.toString() } },
|
|
where: { distributionBucket: { id: bucketId.toString() } },
|
|
})
|
|
})
|
|
@@ -548,7 +579,7 @@ export async function storage_DistributionBucketOperatorRemoved({
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
const [, bucketId, workerId] = new Storage.DistributionBucketOperatorRemovedEvent(event).params
|
|
const [, bucketId, workerId] = new Storage.DistributionBucketOperatorRemovedEvent(event).params
|
|
|
|
|
|
- // TODO: Cascade remove
|
|
|
|
|
|
+ // TODO: Cascade remove on db level (would require changes in Hydra / comitting autogenerated files)
|
|
|
|
|
|
const operator = await getDistributionBucketOperatorWithMetadata(store, `${bucketId}-${workerId}`)
|
|
const operator = await getDistributionBucketOperatorWithMetadata(store, `${bucketId}-${workerId}`)
|
|
await store.remove<DistributionBucketOperator>(operator)
|
|
await store.remove<DistributionBucketOperator>(operator)
|
|
@@ -563,74 +594,75 @@ export async function storage_DistributionBucketOperatorRemoved({
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-export async function storage_DistributionBucketFamilyMetadataSet({
|
|
|
|
- event,
|
|
|
|
- store,
|
|
|
|
-}: EventContext & StoreContext): Promise<void> {
|
|
|
|
- const [familyId, metadataBytes] = new Storage.DistributionBucketFamilyMetadataSetEvent(event).params
|
|
|
|
|
|
+// STORAGE SYSTEM GLOBAL PARAMS
|
|
|
|
|
|
- const family = await getDistributionBucketFamilyWithMetadata(store, familyId.toString())
|
|
|
|
- family.metadata = await processDistributionBucketFamilyMetadata(store, family.metadata, metadataBytes)
|
|
|
|
|
|
+export async function storage_UpdateBlacklist({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
|
|
+ const [removedContentIds, addedContentIds] = new Storage.UpdateBlacklistEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
+ storageSystem.blacklist = storageSystem.blacklist
|
|
|
|
+ .filter((cid) => !Array.from(removedContentIds).some((id) => id.eq(cid)))
|
|
|
|
+ .concat(Array.from(addedContentIds).map((id) => id.toString()))
|
|
|
|
|
|
- await store.save<DistributionBucketFamily>(family)
|
|
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|
|
|
|
|
|
export async function storage_DistributionBucketsPerBagLimitUpdated({
|
|
export async function storage_DistributionBucketsPerBagLimitUpdated({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
- // To be implemented
|
|
|
|
|
|
+ const [newLimit] = new Storage.DistributionBucketsPerBagLimitUpdatedEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
+
|
|
|
|
+ storageSystem.distributionBucketsPerBagLimit = newLimit.toNumber()
|
|
|
|
+
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|
|
|
|
|
|
-export async function storage_FamiliesInDynamicBagCreationPolicyUpdated({
|
|
|
|
|
|
+export async function storage_StorageBucketsPerBagLimitUpdated({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
- // To be implemented
|
|
|
|
|
|
+ const [newLimit] = new Storage.StorageBucketsPerBagLimitUpdatedEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
+
|
|
|
|
+ storageSystem.storageBucketsPerBagLimit = newLimit.toNumber()
|
|
|
|
+
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|
|
|
|
|
|
-export async function storage_StorageBucketVoucherLimitsSet({
|
|
|
|
|
|
+export async function storage_StorageBucketsVoucherMaxLimitsUpdated({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
- // To be implemented
|
|
|
|
|
|
+ const [sizeLimit, countLimit] = new Storage.StorageBucketsVoucherMaxLimitsUpdatedEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
+
|
|
|
|
+ storageSystem.storageBucketMaxObjectsSizeLimit = sizeLimit
|
|
|
|
+ storageSystem.storageBucketMaxObjectsCountLimit = countLimit
|
|
|
|
+
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|
|
|
|
|
|
export async function storage_UploadingBlockStatusUpdated({
|
|
export async function storage_UploadingBlockStatusUpdated({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
- // To be implemented
|
|
|
|
-}
|
|
|
|
|
|
+ const [isBlocked] = new Storage.UploadingBlockStatusUpdatedEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
|
|
-export async function storage_DataObjectPerMegabyteFeeUpdated({
|
|
|
|
- event,
|
|
|
|
- store,
|
|
|
|
-}: EventContext & StoreContext): Promise<void> {
|
|
|
|
- // To be implemented
|
|
|
|
-}
|
|
|
|
|
|
+ storageSystem.uploadingBlocked = isBlocked.isTrue
|
|
|
|
|
|
-export async function storage_StorageBucketsPerBagLimitUpdated({
|
|
|
|
- event,
|
|
|
|
- store,
|
|
|
|
-}: EventContext & StoreContext): Promise<void> {
|
|
|
|
- // To be implemented
|
|
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|
|
|
|
|
|
-export async function storage_StorageBucketsVoucherMaxLimitsUpdated({
|
|
|
|
|
|
+export async function storage_DataObjectPerMegabyteFeeUpdated({
|
|
event,
|
|
event,
|
|
store,
|
|
store,
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
}: EventContext & StoreContext): Promise<void> {
|
|
- // To be implemented
|
|
|
|
-}
|
|
|
|
|
|
+ const [newFee] = new Storage.DataObjectPerMegabyteFeeUpdatedEvent(event).params
|
|
|
|
+ const storageSystem = await getStorageSystem(store)
|
|
|
|
|
|
-export async function storage_VoucherChanged({ event, store }: EventContext & StoreContext): Promise<void> {
|
|
|
|
- // To be implemented
|
|
|
|
-}
|
|
|
|
|
|
+ storageSystem.dataObjectFeePerMb = newFee
|
|
|
|
|
|
-export async function storage_NumberOfStorageBucketsInDynamicBagCreationPolicyUpdated({
|
|
|
|
- event,
|
|
|
|
- store,
|
|
|
|
-}: EventContext & StoreContext): Promise<void> {
|
|
|
|
- // To be implemented
|
|
|
|
|
|
+ await store.save<StorageSystemParameters>(storageSystem)
|
|
}
|
|
}
|