MongoDBItemPersistenceMapper.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { ContentType, Dates, MapperInterface, Timestamps, UniqueEntityId, Uuid } from '@standardnotes/domain-core'
  2. import { BSON } from 'mongodb'
  3. import { MongoDBItem } from '../../../Infra/TypeORM/MongoDBItem'
  4. import { Item } from '../../../Domain/Item/Item'
  5. import { SharedVaultAssociation } from '../../../Domain/SharedVault/SharedVaultAssociation'
  6. import { KeySystemAssociation } from '../../../Domain/KeySystem/KeySystemAssociation'
  7. export class MongoDBItemPersistenceMapper implements MapperInterface<Item, MongoDBItem> {
  8. toDomain(projection: MongoDBItem): Item {
  9. const uuidOrError = Uuid.create(projection._id.toHexString())
  10. if (uuidOrError.isFailed()) {
  11. throw new Error(`Failed to create item from projection: ${uuidOrError.getError()}`)
  12. }
  13. const uuid = uuidOrError.getValue()
  14. let duplicateOf = null
  15. if (projection.duplicateOf) {
  16. const duplicateOfOrError = Uuid.create(projection.duplicateOf)
  17. if (duplicateOfOrError.isFailed()) {
  18. throw new Error(`Failed to create item from projection: ${duplicateOfOrError.getError()}`)
  19. }
  20. duplicateOf = duplicateOfOrError.getValue()
  21. }
  22. const contentTypeOrError = ContentType.create(projection.contentType)
  23. if (contentTypeOrError.isFailed()) {
  24. throw new Error(`Failed to create item from projection: ${contentTypeOrError.getError()}`)
  25. }
  26. const contentType = contentTypeOrError.getValue()
  27. const userUuidOrError = Uuid.create(projection.userUuid)
  28. if (userUuidOrError.isFailed()) {
  29. throw new Error(`Failed to create item from projection: ${userUuidOrError.getError()}`)
  30. }
  31. const userUuid = userUuidOrError.getValue()
  32. const datesOrError = Dates.create(projection.createdAt, projection.updatedAt)
  33. if (datesOrError.isFailed()) {
  34. throw new Error(`Failed to create item from projection: ${datesOrError.getError()}`)
  35. }
  36. const dates = datesOrError.getValue()
  37. const timestampsOrError = Timestamps.create(projection.createdAtTimestamp, projection.updatedAtTimestamp)
  38. if (timestampsOrError.isFailed()) {
  39. throw new Error(`Failed to create item from projection: ${timestampsOrError.getError()}`)
  40. }
  41. const timestamps = timestampsOrError.getValue()
  42. let sharedVaultAssociation: SharedVaultAssociation | undefined = undefined
  43. if (projection.sharedVaultUuid && projection.lastEditedBy) {
  44. const sharedVaultUuidOrError = Uuid.create(projection.sharedVaultUuid)
  45. if (sharedVaultUuidOrError.isFailed()) {
  46. throw new Error(`Failed to create item from projection: ${sharedVaultUuidOrError.getError()}`)
  47. }
  48. const sharedVaultUuid = sharedVaultUuidOrError.getValue()
  49. const lastEditedByOrError = Uuid.create(projection.lastEditedBy)
  50. if (lastEditedByOrError.isFailed()) {
  51. throw new Error(`Failed to create item from projection: ${lastEditedByOrError.getError()}`)
  52. }
  53. const lastEditedBy = lastEditedByOrError.getValue()
  54. const sharedVaultAssociationOrError = SharedVaultAssociation.create({
  55. sharedVaultUuid,
  56. lastEditedBy,
  57. })
  58. if (sharedVaultAssociationOrError.isFailed()) {
  59. throw new Error(`Failed to create item from projection: ${sharedVaultAssociationOrError.getError()}`)
  60. }
  61. sharedVaultAssociation = sharedVaultAssociationOrError.getValue()
  62. }
  63. let keySystemAssociation: KeySystemAssociation | undefined = undefined
  64. if (projection.keySystemIdentifier) {
  65. const keySystemAssociationOrError = KeySystemAssociation.create(projection.keySystemIdentifier)
  66. if (keySystemAssociationOrError.isFailed()) {
  67. throw new Error(`Failed to create item from projection: ${keySystemAssociationOrError.getError()}`)
  68. }
  69. keySystemAssociation = keySystemAssociationOrError.getValue()
  70. }
  71. let updatedWithSession = null
  72. if (projection.updatedWithSession) {
  73. const updatedWithSessionOrError = Uuid.create(projection.updatedWithSession)
  74. if (updatedWithSessionOrError.isFailed()) {
  75. throw new Error(`Failed to create item from projection: ${updatedWithSessionOrError.getError()}`)
  76. }
  77. updatedWithSession = updatedWithSessionOrError.getValue()
  78. }
  79. const itemOrError = Item.create(
  80. {
  81. duplicateOf,
  82. itemsKeyId: projection.itemsKeyId,
  83. content: projection.content,
  84. contentType,
  85. contentSize: projection.contentSize ?? undefined,
  86. encItemKey: projection.encItemKey,
  87. authHash: projection.authHash,
  88. userUuid,
  89. deleted: projection.deleted,
  90. dates,
  91. timestamps,
  92. updatedWithSession,
  93. sharedVaultAssociation,
  94. keySystemAssociation,
  95. },
  96. new UniqueEntityId(uuid.value),
  97. )
  98. if (itemOrError.isFailed()) {
  99. throw new Error(`Failed to create item from projection: ${itemOrError.getError()}`)
  100. }
  101. return itemOrError.getValue()
  102. }
  103. toProjection(domain: Item): MongoDBItem {
  104. const mongoDbItem = new MongoDBItem()
  105. mongoDbItem._id = BSON.UUID.createFromHexString(domain.uuid.value)
  106. mongoDbItem.duplicateOf = domain.props.duplicateOf ? domain.props.duplicateOf.value : null
  107. mongoDbItem.itemsKeyId = domain.props.itemsKeyId
  108. mongoDbItem.content = domain.props.content
  109. mongoDbItem.contentType = domain.props.contentType.value
  110. mongoDbItem.contentSize = domain.props.contentSize ?? null
  111. mongoDbItem.encItemKey = domain.props.encItemKey
  112. mongoDbItem.authHash = domain.props.authHash
  113. mongoDbItem.userUuid = domain.props.userUuid.value
  114. mongoDbItem.deleted = domain.props.deleted
  115. mongoDbItem.createdAt = domain.props.dates.createdAt
  116. mongoDbItem.updatedAt = domain.props.dates.updatedAt
  117. mongoDbItem.createdAtTimestamp = domain.props.timestamps.createdAt
  118. mongoDbItem.updatedAtTimestamp = domain.props.timestamps.updatedAt
  119. mongoDbItem.updatedWithSession = domain.props.updatedWithSession ? domain.props.updatedWithSession.value : null
  120. mongoDbItem.lastEditedBy = domain.props.sharedVaultAssociation
  121. ? domain.props.sharedVaultAssociation.props.lastEditedBy.value
  122. : null
  123. mongoDbItem.sharedVaultUuid = domain.props.sharedVaultAssociation
  124. ? domain.props.sharedVaultAssociation.props.sharedVaultUuid.value
  125. : null
  126. mongoDbItem.keySystemIdentifier = domain.props.keySystemAssociation
  127. ? domain.props.keySystemAssociation.props.keySystemIdentifier
  128. : null
  129. return mongoDbItem
  130. }
  131. }