diff --git a/BoxSDK.xcodeproj/project.pbxproj b/BoxSDK.xcodeproj/project.pbxproj index f76da0ab1..3d00379ad 100644 --- a/BoxSDK.xcodeproj/project.pbxproj +++ b/BoxSDK.xcodeproj/project.pbxproj @@ -10,6 +10,17 @@ 0501990C282423970085003B /* BoxClientIntegrationSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0501990B282423970085003B /* BoxClientIntegrationSpecs.swift */; }; 05031BFA274EA93D00BB9A19 /* GetWebLinkSharedLink_VanityNameEnabled.json in Resources */ = {isa = PBXBuildFile; fileRef = 05031BF8274EA93D00BB9A19 /* GetWebLinkSharedLink_VanityNameEnabled.json */; }; 05070D2D2757DBD7000AFE20 /* BaseIntegrationSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05070D2C2757DBD7000AFE20 /* BaseIntegrationSpecs.swift */; }; + 0508660428A258F30073DC77 /* FileRequestsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508660328A258F30073DC77 /* FileRequestsModule.swift */; }; + 0508660A28A261700073DC77 /* FileRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508660528A261700073DC77 /* FileRequest.swift */; }; + 0508660C28A261700073DC77 /* FileRequestCopyRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508660728A261700073DC77 /* FileRequestCopyRequest.swift */; }; + 0508660E28A261700073DC77 /* FileRequestUpdateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508660928A261700073DC77 /* FileRequestUpdateRequest.swift */; }; + 0508661028A278ED0073DC77 /* ResourceTypeEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508660F28A278ED0073DC77 /* ResourceTypeEntity.swift */; }; + 0508661228A27C6D0073DC77 /* FolderEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508661128A27C6D0073DC77 /* FolderEntity.swift */; }; + 0508661428A289770073DC77 /* FileRequestSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508661328A289770073DC77 /* FileRequestSpecs.swift */; }; + 0508665A28A296E30073DC77 /* GetFileRequest.json in Resources */ = {isa = PBXBuildFile; fileRef = 0508663628A296E20073DC77 /* GetFileRequest.json */; }; + 0508665F28A2A19D0073DC77 /* FileRequestsModuleSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0508665E28A2A19D0073DC77 /* FileRequestsModuleSpecs.swift */; }; + 0508666128A2A62B0073DC77 /* UpdateFileRequest.json in Resources */ = {isa = PBXBuildFile; fileRef = 0508666028A2A62B0073DC77 /* UpdateFileRequest.json */; }; + 0508666328A2B1240073DC77 /* CopyFileRequest.json in Resources */ = {isa = PBXBuildFile; fileRef = 0508666228A2B1240073DC77 /* CopyFileRequest.json */; }; 052A03F328772E2F0063513C /* UserAvatarUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 052A03F228772E2F0063513C /* UserAvatarUpload.swift */; }; 052A03F5287885860063513C /* MimeTypeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 052A03F4287885860063513C /* MimeTypeProvider.swift */; }; 052A03F828788CAF0063513C /* MimeTypeProviderSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 052A03F628788C7C0063513C /* MimeTypeProviderSpecs.swift */; }; @@ -611,6 +622,17 @@ 0501990B282423970085003B /* BoxClientIntegrationSpecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxClientIntegrationSpecs.swift; sourceTree = ""; }; 05031BF8274EA93D00BB9A19 /* GetWebLinkSharedLink_VanityNameEnabled.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = GetWebLinkSharedLink_VanityNameEnabled.json; sourceTree = ""; }; 05070D2C2757DBD7000AFE20 /* BaseIntegrationSpecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseIntegrationSpecs.swift; sourceTree = ""; }; + 0508660328A258F30073DC77 /* FileRequestsModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileRequestsModule.swift; sourceTree = ""; }; + 0508660528A261700073DC77 /* FileRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileRequest.swift; sourceTree = ""; }; + 0508660728A261700073DC77 /* FileRequestCopyRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileRequestCopyRequest.swift; sourceTree = ""; }; + 0508660928A261700073DC77 /* FileRequestUpdateRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileRequestUpdateRequest.swift; sourceTree = ""; }; + 0508660F28A278ED0073DC77 /* ResourceTypeEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceTypeEntity.swift; sourceTree = ""; }; + 0508661128A27C6D0073DC77 /* FolderEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderEntity.swift; sourceTree = ""; }; + 0508661328A289770073DC77 /* FileRequestSpecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileRequestSpecs.swift; sourceTree = ""; }; + 0508663628A296E20073DC77 /* GetFileRequest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = GetFileRequest.json; sourceTree = ""; }; + 0508665E28A2A19D0073DC77 /* FileRequestsModuleSpecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileRequestsModuleSpecs.swift; sourceTree = ""; }; + 0508666028A2A62B0073DC77 /* UpdateFileRequest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = UpdateFileRequest.json; sourceTree = ""; }; + 0508666228A2B1240073DC77 /* CopyFileRequest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CopyFileRequest.json; sourceTree = ""; }; 052A03F228772E2F0063513C /* UserAvatarUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAvatarUpload.swift; sourceTree = ""; }; 052A03F4287885860063513C /* MimeTypeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MimeTypeProvider.swift; sourceTree = ""; }; 052A03F628788C7C0063513C /* MimeTypeProviderSpecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MimeTypeProviderSpecs.swift; sourceTree = ""; }; @@ -1180,6 +1202,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0508661528A296E20073DC77 /* FileRequests */ = { + isa = PBXGroup; + children = ( + 0508666228A2B1240073DC77 /* CopyFileRequest.json */, + 0508666028A2A62B0073DC77 /* UpdateFileRequest.json */, + 0508663628A296E20073DC77 /* GetFileRequest.json */, + ); + path = FileRequests; + sourceTree = ""; + }; 052D63C027182D7C00C76281 /* SignRequests */ = { isa = PBXGroup; children = ( @@ -1310,31 +1342,32 @@ 0C6398A52253A53C004021D3 /* Modules */ = { isa = PBXGroup; children = ( - 22C41456231ED1A500D3992C /* MetadataCascadePolicyModuleSpecs.swift */, - 22E335102316A36E0000E231 /* TasksModuleSpecs.swift */, + 0C66A63622832925008D5AEB /* AuthModuleSpecs.swift */, 2278C546231D78F00048FF45 /* CollaborationAllowlistModuleSpecs.swift */, - 22E39EDA22F09E820061E182 /* TrashModuleSpecs.swift */, - 228B36A322BBC1E200078283 /* MetadataModuleSpecs.swift */, + 0C506CA822A6AA76007F18A4 /* CollaborationsModuleSpecs.swift */, 22D0041322AFB25500478F1E /* CollectionsModuleSpecs.swift */, - 0C6398992253A536004021D3 /* FilesModuleSpecs.swift */, - 0C63989A2253A536004021D3 /* FolderModuleSpecs.swift */, - 0C63989B2253A536004021D3 /* UsersModuleSpecs.swift */, - 0C66A63622832925008D5AEB /* AuthModuleSpecs.swift */, 8069D1DF22A84090006B5611 /* CommentsModuleSpecs.swift */, - 9731D2C0227D0C2D0092BCCE /* SearchModuleSpecs.swift */, - 8053E2CD22AF2392000B42E1 /* SharedItemsModuleSpecs.swift */, - 0C506CA822A6AA76007F18A4 /* CollaborationsModuleSpecs.swift */, - 9DC6D81322F4630100A72284 /* EventsModuleSpecs.swift */, - 8093D29322FA381D00DB628E /* WebLinksModuleSpecs.swift */, 80E567E72315EE5200798E3A /* DevicePinsModuleSpecs.swift */, - F99D41242314A68A00327698 /* RecentItemsModuleSpecs.swift */, + 9DC6D81322F4630100A72284 /* EventsModuleSpecs.swift */, + 0508665E28A2A19D0073DC77 /* FileRequestsModuleSpecs.swift */, + 0C6398992253A536004021D3 /* FilesModuleSpecs.swift */, + 0C63989A2253A536004021D3 /* FolderModuleSpecs.swift */, 80FEB7C5232174250037331C /* GroupsModuleSpecs.swift */, - F99D41462318930F00327698 /* WebhooksModuleSpecs.swift */, - 9D472E6E231BEE7B004C8023 /* RetentionPolicyModuleSpecs.swift */, - 80BC841D232C535600010E08 /* TermsOfServicesModuleSpecs.swift */, F929D5EE2331AAF00039E452 /* LegalHoldsModuleSpecs.swift */, - F969D38A233A7242001301FC /* StoragePoliciesModuleSpecs.swift */, + 22C41456231ED1A500D3992C /* MetadataCascadePolicyModuleSpecs.swift */, + 228B36A322BBC1E200078283 /* MetadataModuleSpecs.swift */, + F99D41242314A68A00327698 /* RecentItemsModuleSpecs.swift */, + 9D472E6E231BEE7B004C8023 /* RetentionPolicyModuleSpecs.swift */, + 9731D2C0227D0C2D0092BCCE /* SearchModuleSpecs.swift */, + 8053E2CD22AF2392000B42E1 /* SharedItemsModuleSpecs.swift */, 052D85CA271734FC00648C70 /* SignRequestsModuleSpecs.swift */, + F969D38A233A7242001301FC /* StoragePoliciesModuleSpecs.swift */, + 22E335102316A36E0000E231 /* TasksModuleSpecs.swift */, + 80BC841D232C535600010E08 /* TermsOfServicesModuleSpecs.swift */, + 22E39EDA22F09E820061E182 /* TrashModuleSpecs.swift */, + 0C63989B2253A536004021D3 /* UsersModuleSpecs.swift */, + F99D41462318930F00327698 /* WebhooksModuleSpecs.swift */, + 8093D29322FA381D00DB628E /* WebLinksModuleSpecs.swift */, ); path = Modules; sourceTree = ""; @@ -1531,10 +1564,14 @@ 225639132253897D00D951B5 /* BodyData */ = { isa = PBXGroup; children = ( - 225639162253897D00D951B5 /* SharedLinkData.swift */, - 97A4E5F72294F05E00A03307 /* MultipartForm.swift */, - 9717866A22F0B868004A5F6D /* LockData.swift */, 80FEB7B9232031280037331C /* ConfigurablePermissionData.swift */, + 0508660728A261700073DC77 /* FileRequestCopyRequest.swift */, + 0508660928A261700073DC77 /* FileRequestUpdateRequest.swift */, + 0508661128A27C6D0073DC77 /* FolderEntity.swift */, + 9717866A22F0B868004A5F6D /* LockData.swift */, + 97A4E5F72294F05E00A03307 /* MultipartForm.swift */, + 0508660F28A278ED0073DC77 /* ResourceTypeEntity.swift */, + 225639162253897D00D951B5 /* SharedLinkData.swift */, 05610A9827107079009F92CC /* SignRequestCreateParameters.swift */, ); path = BodyData; @@ -1543,29 +1580,33 @@ 225639192253897D00D951B5 /* Responses */ = { isa = PBXGroup; children = ( - 2278C538231D6D5A0048FF45 /* CollaborationAllowlistEntry.swift */, - 2278C537231D6D560048FF45 /* CollaborationAllowlistExemptTarget.swift */, 22D003FD22AFB19200478F1E /* BoxCollection.swift */, 2256391F2253897D00D951B5 /* BoxModel.swift */, 228C361A2255F82800AC8888 /* BoxResponse.swift */, 2246BEE92285D2230040E8A6 /* BoxResponseDescription.swift */, + F95D6F84245C9DFF008B09CF /* Classification.swift */, 0CD4841A22946A0400E61C35 /* Collaboration.swift */, + 2278C538231D6D5A0048FF45 /* CollaborationAllowlistEntry.swift */, + 2278C537231D6D560048FF45 /* CollaborationAllowlistExemptTarget.swift */, 0C10B2CD22AA8D130035371D /* CollaborationItem.swift */, 97F04DB222B97E500034B9A3 /* Collaborator.swift */, 0CD4841F229567DD00E61C35 /* Comment.swift */, 804F3BFA22A5934E008CF915 /* CommentItem.swift */, + 80E567D82315D9C500798E3A /* DevicePin.swift */, 220C791422AFECA100CD3723 /* EmailAlias.swift */, 0C6398762253A4ED004021D3 /* Enterprise.swift */, 2256391E2253897D00D951B5 /* EntryContainer.swift */, 80F652C922BAC65D00F38485 /* EntryContainerInnerModel.swift */, - 1772A47F230EBEBC00546866 /* EventContainer.swift */, 9DE5D7DD22EF388E0081A031 /* Event.swift */, + 1772A47F230EBEBC00546866 /* EventContainer.swift */, 9DE5D7DF22EF53E30081A031 /* EventItemType.swift */, 9DD7C36822F3150A004DC0D5 /* EventType.swift */, 0C6398782253A4ED004021D3 /* ExpiringEmbedLink.swift */, 2256391D2253897D00D951B5 /* File.swift */, 22D6760222F322F700C7E51B /* FileRepresentation.swift */, + 0508660528A261700073DC77 /* FileRequest.swift */, 0C63987A2253A4ED004021D3 /* FileVersion.swift */, + F929D5E623319E640039E452 /* FileVersionLegalHold.swift */, 9D472E6C231BE5FF004C8023 /* FileVersionRetention.swift */, 2256391A2253897D00D951B5 /* Folder.swift */, 225639232253897D00D951B5 /* FolderItem.swift */, @@ -1574,20 +1615,40 @@ 97F04DB422B97EF90034B9A3 /* Group.swift */, 80FEB7AC231EF2130037331C /* GroupMembership.swift */, 0CD342242289D36100BAFF4B /* Invite.swift */, + F929D5E823319E820039E452 /* LegalHoldPolicy.swift */, + F929D5EA23319E9D0039E452 /* LegalHoldPolicyAssignment.swift */, + F929D5EC2331AAB10039E452 /* LegalHoldPolicyAssignmentItem.swift */, 0CD4842E2295A28100E61C35 /* Lock.swift */, + 22C41458231FDB4B00D3992C /* MetadataCascadePolicy.swift */, + 228B36AA22BC243900078283 /* MetadataField.swift */, + F928142B233DA3AB00E42EEE /* MetadataFieldFilter.swift */, + 223C6DAE22C636C100F4023C /* MetadataObject.swift */, 228B36A522BC234D00078283 /* MetadataTemplate.swift */, 2256391C2253897D00D951B5 /* PathCollection.swift */, + 9D9B12FA22F4964A002BB04C /* PollingResult.swift */, 9DC6D81122F423E000A72284 /* PollingURLInfo.swift */, + F99D4120231495BC00327698 /* RecentItem.swift */, 172A4F222317F543009F5293 /* RetentionPolicy.swift */, 9D472E68231BD9C4004C8023 /* RetentionPolicyAssignment.swift */, 9D472E66231B15A0004C8023 /* RetentionPolicyAssignmentItem.swift */, 176CADFA231D4BEB004269F5 /* RetentionPolicyEntry.swift */, 0C6398792253A4ED004021D3 /* Scope.swift */, + B41D9DB425D3347C000BFE59 /* SearchResult.swift */, 8053E2CB22AF15F7000B42E1 /* SharedItem.swift */, 225639202253897D00D951B5 /* SharedLink.swift */, + 05610A942710612A009F92CC /* SignRequest.swift */, + 05610A9A271099A7009F92CC /* SignRequestPrefillTag.swift */, + 05610A9627106ACA009F92CC /* SignRequestSigner.swift */, + 054D789827158DAB00E1E273 /* SignRequestSignerDecision.swift */, + 05610A9C27109BFB009F92CC /* SignRequestSignerInput.swift */, + 054D789A2715989800E1E273 /* SignRequestSignFiles.swift */, + F969D380233A71B4001301FC /* StoragePolicy.swift */, + F969D385233A71EF001301FC /* StoragePolicyAssignment.swift */, 0CD4842422956C2200E61C35 /* Task.swift */, 97F04DAE22B96BA60034B9A3 /* TaskAssignment.swift */, 1730672C23171A530033EAFD /* TaskItem.swift */, + 80BC8419232C52FF00010E08 /* TermsOfService.swift */, + 80BC841B232C531E00010E08 /* TermsOfServiceUserStatus.swift */, 0C63987C2253A4ED004021D3 /* Token.swift */, 225639222253897D00D951B5 /* TokenInfo.swift */, 22DCC3C422E0D19E007F74E2 /* TrackingCode.swift */, @@ -1596,37 +1657,14 @@ 2256391B2253897D00D951B5 /* User.swift */, 052A03F228772E2F0063513C /* UserAvatarUpload.swift */, 92514E6D2319C477002D44A8 /* Watermark.swift */, - 225639212253897D00D951B5 /* WebLink.swift */, - 228B36AA22BC243900078283 /* MetadataField.swift */, - 223C6DAE22C636C100F4023C /* MetadataObject.swift */, - 9D9B12FA22F4964A002BB04C /* PollingResult.swift */, - 80E567D82315D9C500798E3A /* DevicePin.swift */, - F99D4120231495BC00327698 /* RecentItem.swift */, - 22C41458231FDB4B00D3992C /* MetadataCascadePolicy.swift */, F99D41372318495700327698 /* Webhook.swift */, F99D413B231857D200327698 /* WebhookItem.swift */, - 80BC8419232C52FF00010E08 /* TermsOfService.swift */, - 80BC841B232C531E00010E08 /* TermsOfServiceUserStatus.swift */, - F929D5E623319E640039E452 /* FileVersionLegalHold.swift */, - F929D5E823319E820039E452 /* LegalHoldPolicy.swift */, - F929D5EA23319E9D0039E452 /* LegalHoldPolicyAssignment.swift */, - F929D5EC2331AAB10039E452 /* LegalHoldPolicyAssignmentItem.swift */, - F969D380233A71B4001301FC /* StoragePolicy.swift */, - F969D385233A71EF001301FC /* StoragePolicyAssignment.swift */, - F928142B233DA3AB00E42EEE /* MetadataFieldFilter.swift */, - F95D6F84245C9DFF008B09CF /* Classification.swift */, + 225639212253897D00D951B5 /* WebLink.swift */, B40558AD25AD28C80068784E /* ZipDownload.swift */, - B40558B625AE54680068784E /* ZipDownloadStatus.swift */, - B40558B825AE54810068784E /* ZipDownloadItem.swift */, B492C0AA25B78A4500F3823D /* ZipDownloadConflict.swift */, B492C0AC25B78A6A00F3823D /* ZipDownloadConflictItem.swift */, - B41D9DB425D3347C000BFE59 /* SearchResult.swift */, - 05610A942710612A009F92CC /* SignRequest.swift */, - 05610A9627106ACA009F92CC /* SignRequestSigner.swift */, - 05610A9A271099A7009F92CC /* SignRequestPrefillTag.swift */, - 05610A9C27109BFB009F92CC /* SignRequestSignerInput.swift */, - 054D789827158DAB00E1E273 /* SignRequestSignerDecision.swift */, - 054D789A2715989800E1E273 /* SignRequestSignFiles.swift */, + B40558B825AE54810068784E /* ZipDownloadItem.swift */, + B40558B625AE54680068784E /* ZipDownloadStatus.swift */, ); path = Responses; sourceTree = ""; @@ -1642,6 +1680,7 @@ 804F3BF622A59250008CF915 /* CommentsModule.swift */, 80E567DA2315DBA000798E3A /* DevicePinsModule.swift */, 9DE5D7DB22EF2CBC0081A031 /* EventsModule.swift */, + 0508660328A258F30073DC77 /* FileRequestsModule.swift */, 225639262253897D00D951B5 /* FilesModule.swift */, 22640BB2230571E500C19ECA /* FilesModule+ChunkedUpload.swift */, 22D675FD22F2E51F00C7E51B /* FilesModule+Representations.swift */, @@ -1691,32 +1730,33 @@ 225639C3225389B100D951B5 /* Resources */ = { isa = PBXGroup; children = ( - 052D63C027182D7C00C76281 /* SignRequests */, - 22C4144F231ED19700D3992C /* MetadataCascadePolicy */, - F969D396233A72D2001301FC /* Storage Policies */, - 80BC8423232C53F200010E08 /* TermsOfService */, - F929D5F62331ABE40039E452 /* Legal Holds */, - F99D413D2318901600327698 /* Webhooks */, - 9D472E73231BF30D004C8023 /* RetentionPolicy */, + 0C506CAC22A6AB30007F18A4 /* Collaborations */, 2278C548231D808D0048FF45 /* CollaborationWhitelist */, - 92514E932319C9C0002D44A8 /* Watermarking */, + 22D0041822AFB30400478F1E /* Collections */, + 804F3BFF22A594E2008CF915 /* Comments */, 80E567DC2315E49900798E3A /* DevicePins */, - F99D41262314A9F000327698 /* Recent Items */, - 22D6761322F473F100C7E51B /* Trash */, 9DC6D81622F46F2700A72284 /* Events */, - 2268B33322BD880700ABBD47 /* Metadata */, - 97F04DB622B981130034B9A3 /* Groups */, - 97F04DA922B969F30034B9A3 /* Tasks */, - 97F04DA222B866C50034B9A3 /* Web Links */, 97D3FFB422B1C890008C1CE6 /* File Versions */, - 804F3BFF22A594E2008CF915 /* Comments */, - 22D0041822AFB30400478F1E /* Collections */, - 0C506CAC22A6AB30007F18A4 /* Collaborations */, + 0508661528A296E20073DC77 /* FileRequests */, + 225639C7225389B100D951B5 /* Files */, + 225639CB225389B100D951B5 /* Folders */, + 97F04DB622B981130034B9A3 /* Groups */, + F929D5F62331ABE40039E452 /* Legal Holds */, + 2268B33322BD880700ABBD47 /* Metadata */, + 22C4144F231ED19700D3992C /* MetadataCascadePolicy */, + F99D41262314A9F000327698 /* Recent Items */, + 9D472E73231BF30D004C8023 /* RetentionPolicy */, 9731D2C2227D19570092BCCE /* Search */, 228687962260C7C500C7774A /* Sessions */, + 052D63C027182D7C00C76281 /* SignRequests */, + F969D396233A72D2001301FC /* Storage Policies */, + 97F04DA922B969F30034B9A3 /* Tasks */, + 80BC8423232C53F200010E08 /* TermsOfService */, + 22D6761322F473F100C7E51B /* Trash */, 225639C4225389B100D951B5 /* Users */, - 225639C7225389B100D951B5 /* Files */, - 225639CB225389B100D951B5 /* Folders */, + 92514E932319C9C0002D44A8 /* Watermarking */, + 97F04DA222B866C50034B9A3 /* Web Links */, + F99D413D2318901600327698 /* Webhooks */, ); path = Resources; sourceTree = ""; @@ -2035,6 +2075,7 @@ 80E567DF2315E4E400798E3A /* DevicePinSpecs.swift */, 05A58A4626FB487500AB309C /* EventTypeSpecs.swift */, 05F59F0526FC740100D9A539 /* FileRepresentationSpecs.swift */, + 0508661328A289770073DC77 /* FileRequestSpecs.swift */, 97C8B57622B05BB100F36435 /* FileSpecs.swift */, F929D5F02331AB2A0039E452 /* FileVersionLegalHoldSpecs.swift */, F9281452233E98B300E42EEE /* FileVersionRetentionSpecs.swift */, @@ -2566,6 +2607,7 @@ 9DD6F54022DDB89300F9D2D5 /* GetFolderSharedLink_PasswordNotEnabled.json in Resources */, 22720E9D2316BE9F00887AA4 /* GetTask.json in Resources */, 80F652CD22BC0D5000F38485 /* GetRepresentations.json in Resources */, + 0508666128A2A62B0073DC77 /* UpdateFileRequest.json in Resources */, 2278C54F231D808E0048FF45 /* CreateCollaborationWhitelistEntry.json in Resources */, 2280E3332301630B00F98892 /* GetTrashedItems.json in Resources */, 97F04DAB22B96A140034B9A3 /* FullTask.json in Resources */, @@ -2616,6 +2658,7 @@ 2278C551231D808E0048FF45 /* GetCollaborationWhitelistEntries.json in Resources */, F929D6112331AE280039E452 /* FullLegalHoldPolicy.json in Resources */, 052A0407287D9A730063513C /* UploadUserAvatar.json in Resources */, + 0508666328A2B1240073DC77 /* CopyFileRequest.json in Resources */, 80E567A0230368DC00798E3A /* GetWebLinkSharedLink_PasswordNotEnabled.json in Resources */, 22643AC922B952D1009497CA /* AddFileToFavorites.json in Resources */, F929D6122331AE280039E452 /* FullPolicyAssignment.json in Resources */, @@ -2652,6 +2695,7 @@ 0CA0651E22980EE900A751B1 /* image.png in Resources */, F99D416F2319CDC800327698 /* GetWebhooks.json in Resources */, 05EE814027184A4B006A2329 /* GetSignRequest.json in Resources */, + 0508665A28A296E30073DC77 /* GetFileRequest.json in Resources */, 9D472E79231BF499004C8023 /* CreateRetentionPolicy.json in Resources */, 2262403E227214820048E638 /* GetFolderItemsOffsetIterator2.json in Resources */, 22C95BD5230AD650004F5C18 /* ChunkedUploadSessionNewFileVersion.json in Resources */, @@ -2830,6 +2874,7 @@ 9771D4E522B02AF700B76DF8 /* BoxEnum.swift in Sources */, 9DE5D7E022EF53E30081A031 /* EventItemType.swift in Sources */, 8053E2CC22AF15F7000B42E1 /* SharedItem.swift in Sources */, + 0508660E28A261700073DC77 /* FileRequestUpdateRequest.swift in Sources */, 172A4F212317F464009F5293 /* RetentionPolicyModule.swift in Sources */, F95A81C124606DC300C46E98 /* UIColorExtension.swift in Sources */, 2228B19322C0C8F5001F759D /* Lock.swift in Sources */, @@ -2877,6 +2922,7 @@ B492C0AD25B78A6A00F3823D /* ZipDownloadConflictItem.swift in Sources */, 225639AE2253897D00D951B5 /* FoldersModule.swift in Sources */, 0C4A9D18226DBCB4002D069D /* BoxSDKConfiguration.swift in Sources */, + 0508661028A278ED0073DC77 /* ResourceTypeEntity.swift in Sources */, 8053E2C622AF06FF000B42E1 /* SharedItemsModule.swift in Sources */, 2278C53D231D6D5A0048FF45 /* CollaborationAllowlistEntry.swift in Sources */, 0CCBC2AA2284301E00640FA8 /* KeychainStoreQueryable.swift in Sources */, @@ -2913,6 +2959,7 @@ B40558B925AE54810068784E /* ZipDownloadItem.swift in Sources */, 1772A480230EBEBC00546866 /* EventContainer.swift in Sources */, 0C10B2CE22AA8D130035371D /* CollaborationItem.swift in Sources */, + 0508660C28A261700073DC77 /* FileRequestCopyRequest.swift in Sources */, 05610A9B271099A7009F92CC /* SignRequestPrefillTag.swift in Sources */, 05610A9D27109BFB009F92CC /* SignRequestSignerInput.swift in Sources */, 97F04DB322B97E500034B9A3 /* Collaborator.swift in Sources */, @@ -2923,6 +2970,7 @@ 054D536428367A7C00CC2CBC /* AsyncHelper.swift in Sources */, 2256398A2253897D00D951B5 /* File.swift in Sources */, 225639722253897D00D951B5 /* SharedLinkData.swift in Sources */, + 0508660428A258F30073DC77 /* FileRequestsModule.swift in Sources */, 0C66A62D2283147F008D5AEB /* OAuthWebAuthentication.swift in Sources */, 2261F82C228477B8008E7BD0 /* UIDeviceExtension.swift in Sources */, 9D472E69231BD9C4004C8023 /* RetentionPolicyAssignment.swift in Sources */, @@ -2971,6 +3019,7 @@ 0C3DA58722A6819200199AAD /* MemoryTokenStore.swift in Sources */, 225639922253897D00D951B5 /* BoxModel.swift in Sources */, 80FEB7AB231EE5D50037331C /* GroupsModule.swift in Sources */, + 0508661228A27C6D0073DC77 /* FolderEntity.swift in Sources */, 054D53662836992000CC2CBC /* BoxSDK+Async.swift in Sources */, 2256398E2253897D00D951B5 /* EntryContainer.swift in Sources */, 054D789927158DAB00E1E273 /* SignRequestSignerDecision.swift in Sources */, @@ -2984,6 +3033,7 @@ 9DC6D81222F423E000A72284 /* PollingURLInfo.swift in Sources */, 225639962253897D00D951B5 /* SharedLink.swift in Sources */, 2246BEE52285D2080040E8A6 /* BoxRequestDescription.swift in Sources */, + 0508660A28A261700073DC77 /* FileRequest.swift in Sources */, 22D0040A22AFB19200478F1E /* BoxCollection.swift in Sources */, 22643AC222B92270009497CA /* AnyCodable.swift in Sources */, 2256397E2253897D00D951B5 /* Folder.swift in Sources */, @@ -3017,6 +3067,7 @@ 97FA4FE0234D123A00A615B8 /* BoxJSONDecoderSpecs.swift in Sources */, 0C78709D228771F0006FBDAE /* OAuth2SessionSpecs.swift in Sources */, 05A58A1C26FB19F400AB309C /* TaskItemSpecs.swift in Sources */, + 0508661428A289770073DC77 /* FileRequestSpecs.swift in Sources */, 80FEB7BF23203ABB0037331C /* GroupMembershipSpecs.swift in Sources */, 9731D2C5227D1DB20092BCCE /* SearchModuleSpecs.swift in Sources */, 05A58A5826FB6F0700AB309C /* WatermarkSpecs.swift in Sources */, @@ -3063,6 +3114,7 @@ 05F770DB26F3879500BDECA2 /* ThreadSafeQueueSpecs.swift in Sources */, 052A03F828788CAF0063513C /* MimeTypeProviderSpecs.swift in Sources */, 22D0041422AFB25500478F1E /* CollectionsModuleSpecs.swift in Sources */, + 0508665F28A2A19D0073DC77 /* FileRequestsModuleSpecs.swift in Sources */, 052BC90426F8AD09001E64D2 /* CommentsModuleSpecs.swift in Sources */, F99D418D2319CE7E00327698 /* WebhooksModuleSpecs.swift in Sources */, 0C28DCC022AF099B0005AC46 /* JSONComparer.swift in Sources */, diff --git a/Sources/Client/BoxClient.swift b/Sources/Client/BoxClient.swift index c8bc87afd..21b768ca2 100755 --- a/Sources/Client/BoxClient.swift +++ b/Sources/Client/BoxClient.swift @@ -51,6 +51,8 @@ public class BoxClient { public private(set) lazy var storagePolicies = StoragePoliciesModule(boxClient: self) /// Provides sign requests functionality. public private(set) lazy var signRequests = SignRequestsModule(boxClient: self) + /// Provides file requests functionality. + public private(set) lazy var fileRequests = FileRequestsModule(boxClient: self) /// Provides network communication with the Box APIs. private var networkAgent: NetworkAgentProtocol diff --git a/Sources/Modules/FileRequestsModule.swift b/Sources/Modules/FileRequestsModule.swift new file mode 100644 index 000000000..c0faa5487 --- /dev/null +++ b/Sources/Modules/FileRequestsModule.swift @@ -0,0 +1,98 @@ +// +// FileRequestsModule.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © 2022 box. All rights reserved. +// + +import Foundation + +/// Provides management of FileRequests +public class FileRequestsModule { + /// Required for communicating with Box APIs. + weak var boxClient: BoxClient! + // swiftlint:disable:previous implicitly_unwrapped_optional + + /// Initializer + /// + /// - Parameter boxClient: Required for communicating with Box APIs. + init(boxClient: BoxClient) { + self.boxClient = boxClient + } + + /// Retrieves the information about a file request by ID. + /// + /// - Parameters: + /// - fileRequestId: The unique identifier that represent a file request. + /// - completion: Returns a FileRequest response object if successful otherwise a BoxSDKError. + public func get( + fileRequestId: String, + completion: @escaping Callback + ) { + boxClient.get( + url: URL.boxAPIEndpoint("/2.0/file_requests/\(fileRequestId)", configuration: boxClient.configuration), + completion: ResponseHandler.default(wrapping: completion) + ) + } + + /// Updates a file request. This can be used to activate or deactivate a file request. + /// + /// - Parameters: + /// - fileRequestId: The unique identifier that represent a file request. + /// - ifMatch: Ensures this item hasn't recently changed before making changes. + /// Pass in the item's last observed `etag` value into this header and the endpoint will fail with a `412 Precondition Failed` if it has changed since. (optional) + /// - updateRequest: The `FileRequestUpdateRequest` object which provides the fields that can be updated. + /// - completion: Returns a FileRequest response object if successful otherwise a BoxSDKError. + public func update( + fileRequestId: String, + ifMatch: String? = nil, + updateRequest: FileRequestUpdateRequest, + completion: @escaping Callback + ) { + var headers: BoxHTTPHeaders = [:] + if let unwrappedIfMatch = ifMatch { + headers[BoxHTTPHeaderKey.ifMatch] = unwrappedIfMatch + } + + boxClient.put( + url: URL.boxAPIEndpoint("/2.0/file_requests/\(fileRequestId)", configuration: boxClient.configuration), + httpHeaders: headers, + json: updateRequest.bodyDict, + completion: ResponseHandler.default(wrapping: completion) + ) + } + + /// Copies an existing file request that is already present on one folder, and applies it to another folder. + /// + /// - Parameters: + /// - fileRequestId: The unique identifier that represent a file request. + /// - copyRequest: The `FileRequestCopyRequest` object which provides required and optional fields used when copying, like: folder(required), title(optional), etc. + /// - completion: Returns a FileRequest response object if successful otherwise a BoxSDKError. + public func copy( + fileRequestId: String, + copyRequest: FileRequestCopyRequest, + completion: @escaping Callback + ) { + boxClient.post( + url: URL.boxAPIEndpoint("/2.0/file_requests/\(fileRequestId)/copy", configuration: boxClient.configuration), + json: copyRequest.bodyDict, + completion: ResponseHandler.default(wrapping: completion) + ) + } + + /// Deletes a file request permanently. + /// + /// - Parameters: + /// - fileRequestId: The unique identifier that represent a file request. + /// - completion: Returns response object if successful otherwise a BoxSDKError. + public func delete( + fileRequestId: String, + completion: @escaping Callback + ) { + boxClient.delete( + url: URL.boxAPIEndpoint("/2.0/file_requests/\(fileRequestId)", configuration: boxClient.configuration), + completion: ResponseHandler.default(wrapping: completion) + ) + } +} diff --git a/Sources/Requests/BodyData/FileRequestCopyRequest.swift b/Sources/Requests/BodyData/FileRequestCopyRequest.swift new file mode 100644 index 000000000..4ddef6705 --- /dev/null +++ b/Sources/Requests/BodyData/FileRequestCopyRequest.swift @@ -0,0 +1,63 @@ +// +// FileRequestCopyRequest.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © Box. All rights reserved. +// + +import Foundation + +// The request body to copy a file request. +public struct FileRequestCopyRequest: Encodable { + + // MARK: - Properties + + /// An optional new title for the file request. + /// This can be used to change the title of the file request. + public let title: String? + /// An optional new description for the file request. + /// This can be used to change the description of the file request. + public let description: String? + /// An optional new status of the file request. + public let status: FileRequestStatus? + /// Whether a file request submitter is required to provide their email address. + /// When this setting is set to true, the Box UI will show an email field on the file request form. + public let isEmailRequired: Bool? + /// Whether a file request submitter is required to provide a description of the files they are submitting. + /// When this setting is set to true, the Box UI will show a description field on the file request form. + public let isDescriptionRequired: Bool? + /// The date after which a file request will no longer accept new submissions. + /// After this date, the `status` will automatically be set to `inactive`. + public let expiresAt: Date? + /// The folder to associate the new file request to. + public let folder: FolderEntity + + /// Initializer. + /// + /// - Parameters: + /// - title: An optional new title for the file request. + /// - description: An optional new description for the file request. + /// - status: An optional new status of the file request. + /// - isEmailRequired: Whether a file request submitter is required to provide their email address. + /// - isDescriptionRequired: Whether a file request submitter is required to provide a description of the files they are submitting. + /// - expiresAt: The date after which a file request will no longer accept new submissions. + /// - folder: The folder to associate the new file request to. + public init( + title: String? = nil, + description: String? = nil, + status: FileRequestStatus? = nil, + isEmailRequired: Bool? = nil, + isDescriptionRequired: Bool? = nil, + expiresAt: Date? = nil, + folder: FolderEntity + ) { + self.title = title + self.description = description + self.status = status + self.isEmailRequired = isEmailRequired + self.isDescriptionRequired = isDescriptionRequired + self.expiresAt = expiresAt + self.folder = folder + } +} diff --git a/Sources/Requests/BodyData/FileRequestUpdateRequest.swift b/Sources/Requests/BodyData/FileRequestUpdateRequest.swift new file mode 100644 index 000000000..8b96306ae --- /dev/null +++ b/Sources/Requests/BodyData/FileRequestUpdateRequest.swift @@ -0,0 +1,58 @@ +// +// FileRequestUpdateRequest.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © Box. All rights reserved. +// + +import Foundation + +// The request body to update a file request. +public struct FileRequestUpdateRequest: Encodable { + + // MARK: - Properties + + /// An optional new title for the file request. + /// This can be used to change the title of the file request. + public let title: String? + /// An optional new description for the file request. + /// This can be used to change the description of the file request. + public let description: String? + /// An optional new status of the file request. + public let status: FileRequestStatus? + /// Whether a file request submitter is required to provide their email address. + /// When this setting is set to true, the Box UI will show an email field on the file request form. + public let isEmailRequired: Bool? + /// Whether a file request submitter is required to provide a description of the files they are submitting. + /// When this setting is set to true, the Box UI will show a description field on the file request form. + public let isDescriptionRequired: Bool? + /// The date after which a file request will no longer accept new submissions. + /// After this date, the `status` will automatically be set to `inactive`. + public let expiresAt: Date? + + /// Initializer. + /// + /// - Parameters: + /// - title: An optional new title for the file request. + /// - description: An optional new description for the file request. + /// - status: An optional new status of the file request. + /// - isEmailRequired: Whether a file request submitter is required to provide their email address. + /// - isDescriptionRequired: Whether a file request submitter is required to provide a description of the files they are submitting. + /// - expiresAt: The date after which a file request will no longer accept new submissions. + public init( + title: String? = nil, + description: String? = nil, + status: FileRequestStatus? = nil, + isEmailRequired: Bool? = nil, + isDescriptionRequired: Bool? = nil, + expiresAt: Date? = nil + ) { + self.title = title + self.description = description + self.status = status + self.isEmailRequired = isEmailRequired + self.isDescriptionRequired = isDescriptionRequired + self.expiresAt = expiresAt + } +} diff --git a/Sources/Requests/BodyData/FolderEntity.swift b/Sources/Requests/BodyData/FolderEntity.swift new file mode 100644 index 000000000..987db1a69 --- /dev/null +++ b/Sources/Requests/BodyData/FolderEntity.swift @@ -0,0 +1,24 @@ +// +// FolderEntity.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © 2022 box. All rights reserved. +// + +import Foundation + +/// Represents folder resource +public struct FolderEntity: ResourceTypeEntity { + public private(set) var type: String + public private(set) var id: String + + /// Initializer. + /// + /// - Parameters: + /// - id: Identifier of the folder. + public init(id: String) { + self.id = id + type = "folder" + } +} diff --git a/Sources/Requests/BodyData/ResourceTypeEntity.swift b/Sources/Requests/BodyData/ResourceTypeEntity.swift new file mode 100644 index 000000000..c1fee175f --- /dev/null +++ b/Sources/Requests/BodyData/ResourceTypeEntity.swift @@ -0,0 +1,18 @@ +// +// ResourceTypeEntity.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © 2022 box. All rights reserved. +// + +import Foundation + +/// Represents simple resource type abstraction +public protocol ResourceTypeEntity: Encodable { + /// The resource type of the assiociated object. + var type: String { get } + + /// The id of the assiociated object + var id: String { get } +} diff --git a/Sources/Responses/FileRequest.swift b/Sources/Responses/FileRequest.swift new file mode 100644 index 000000000..372288476 --- /dev/null +++ b/Sources/Responses/FileRequest.swift @@ -0,0 +1,116 @@ +// +// FileRequest.swift +// BoxSDK-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © Box. All rights reserved. +// + +import Foundation + +/// The status of the file request. +public enum FileRequestStatus: BoxEnum { + /// The file request can accept new submissions. + case active + /// The file request can't accept new submissions, and any visitor to the file request URL will receive a `HTTP 404` status code. + case inactive + /// Custom value for enum values not yet implemented in the SDK + case customValue(String) + + public init(_ value: String) { + switch value { + case "active": + self = .active + case "inactive": + self = .inactive + default: + self = .customValue(value) + } + } + + public var description: String { + switch self { + case .active: + return "active" + case .inactive: + return "inactive" + case let .customValue(value): + return value + } + } +} + +// A standard representation of a file request, as returned from any file request API endpoints by default. +public final class FileRequest: BoxModel { + + // MARK: - BoxModel + + private static var resourceType: String = "file_request" + /// Box item type + public var type: String + public private(set) var rawData: [String: Any] + + // MARK: - Properties + + /// The unique identifier for this file request. + public let id: String + /// The title of file request. This is shown in the Box UI to users uploading files. + public let title: String? + /// The optional description of this file request. This is shown in the Box UI to users uploading files. + public let description: String? + /// The status of the file request. + public let status: FileRequestStatus? + /// Whether a file request submitter is required to provide their email address. When this setting is set to true, the Box UI will show an email field on the file request form. + public let isEmailRequired: Bool? + /// Whether a file request submitter is required to provide a description of the files they are submitting. + /// When this setting is set to true, the Box UI will show a description field on the file request form. + public let isDescriptionRequired: Bool? + /// The date after which a file request will no longer accept new submissions. After this date, the `status` will automatically be set to `inactive`. + public let expiresAt: Date? + /// The folder that this file request is associated with. Files submitted through the file request form will be uploaded to this folder. + public let folder: Folder + /// The generated URL for this file request. This URL can be shared with users to let them upload files to the associated folder. + public let url: String? + /// The HTTP `etag` of this file. This can be used in combination with the `If-Match` header when updating a file request. + /// By providing that header, a change will only be performed on the file request if the `etag` on the file request still matches the `etag` provided in the `If-Match` header. + public let etag: String? + /// The user who created this file request. + public let createdBy: User? + /// The date and time when the file request was created. + public let createdAt: Date + /// The user who last modified this file request. + public let updatedBy: User? + /// The date and time when the file request was last updated. + public let updatedAt: Date + + /// Initializer. + /// + /// - Parameter json: JSON dictionary. + /// - Throws: Decoding error. + public required init(json: [String: Any]) throws { + guard let itemType = json["type"] as? String else { + throw BoxCodingError(message: .typeMismatch(key: "type")) + } + + guard itemType == FileRequest.resourceType else { + throw BoxCodingError(message: .valueMismatch(key: "type", value: itemType, acceptedValues: [FileRequest.resourceType])) + } + + type = itemType + rawData = json + id = try BoxJSONDecoder.decode(json: json, forKey: "id") + title = try BoxJSONDecoder.optionalDecode(json: json, forKey: "title") + description = try BoxJSONDecoder.optionalDecode(json: json, forKey: "description") + status = try BoxJSONDecoder.optionalDecodeEnum(json: json, forKey: "status") + isEmailRequired = try BoxJSONDecoder.optionalDecode(json: json, forKey: "is_email_required") + isDescriptionRequired = try BoxJSONDecoder.optionalDecode(json: json, forKey: "is_description_required") + expiresAt = try BoxJSONDecoder.optionalDecodeDate(json: json, forKey: "expires_at") + folder = try BoxJSONDecoder.decode(json: json, forKey: "folder") + url = try BoxJSONDecoder.optionalDecode(json: json, forKey: "url") + etag = try BoxJSONDecoder.optionalDecode(json: json, forKey: "etag") + createdBy = try BoxJSONDecoder.optionalDecode(json: json, forKey: "created_by") + createdAt = try BoxJSONDecoder.decodeDate(json: json, forKey: "created_at") + updatedBy = try BoxJSONDecoder.optionalDecode(json: json, forKey: "updated_by") + updatedAt = try BoxJSONDecoder.decodeDate(json: json, forKey: "updated_at") + } +} diff --git a/Tests/Modules/EventsModuleSpecs.swift b/Tests/Modules/EventsModuleSpecs.swift index 5fa7cbfe0..69086f87d 100644 --- a/Tests/Modules/EventsModuleSpecs.swift +++ b/Tests/Modules/EventsModuleSpecs.swift @@ -17,7 +17,7 @@ class EventsModuleSpecs: QuickSpec { var sut: BoxClient! override func spec() { - describe("CollaborationsModule") { + describe("EventsModule") { beforeEach { self.sut = BoxSDK.getClient(token: "asdads") } diff --git a/Tests/Modules/FileRequestsModuleSpecs.swift b/Tests/Modules/FileRequestsModuleSpecs.swift new file mode 100644 index 000000000..76a603ef5 --- /dev/null +++ b/Tests/Modules/FileRequestsModuleSpecs.swift @@ -0,0 +1,246 @@ +// +// FileRequestsModuleSpecs.swift +// BoxSDKTests-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © 2022 box. All rights reserved. +// + +@testable import BoxSDK +import Nimble +import OHHTTPStubs +import OHHTTPStubs.NSURLRequest_HTTPBodyTesting +import Quick + +class FileRequestsModuleSpecs: QuickSpec { + var sut: BoxClient! + + override func spec() { + describe("FileRequestsModule") { + beforeEach { + self.sut = BoxSDK.getClient(token: "") + } + + afterEach { + OHHTTPStubs.removeAllStubs() + } + + describe("get()") { + it("should make API call to get file request response when call is successful") { + stub( + condition: isHost("api.box.com") + && isPath("/2.0/file_requests/42037322") + && isMethodGET() + ) { _ in + OHHTTPStubsResponse( + fileAtPath: OHPathForFile("GetFileRequest.json", type(of: self))!, + statusCode: 200, headers: ["Content-Type": "application/json"] + ) + } + + waitUntil(timeout: .seconds(10)) { done in + self.sut.fileRequests.get(fileRequestId: "42037322") { result in + switch result { + case let .success(fileRequest): + expect(fileRequest.type).to(equal("file_request")) + expect(fileRequest.id).to(equal("42037322")) + expect(fileRequest.title).to(equal("Please upload documents")) + expect(fileRequest.description).to(equal("Following documents are requested for your process")) + expect(fileRequest.status).to(equal(.active)) + expect(fileRequest.isEmailRequired).to(equal(true)) + expect(fileRequest.isDescriptionRequired).to(equal(true)) + expect(fileRequest.expiresAt?.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.url).to(equal("/f/19e57f40ace247278a8e3d336678c64a")) + expect(fileRequest.etag).to(equal("1")) + expect(fileRequest.createdAt.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.createdBy?.type).to(equal("user")) + expect(fileRequest.createdBy?.id).to(equal("11446498")) + expect(fileRequest.createdBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.createdBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.updatedAt.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.updatedBy?.type).to(equal("user")) + expect(fileRequest.updatedBy?.id).to(equal("11446498")) + expect(fileRequest.updatedBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.updatedBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.folder.id).to(equal("12345")) + expect(fileRequest.folder.etag).to(equal("1")) + expect(fileRequest.folder.type).to(equal("folder")) + expect(fileRequest.folder.sequenceId).to(equal("3")) + expect(fileRequest.folder.name).to(equal("Contracts")) + case let .failure(error): + fail("Unable to get sign request instead got \(error)") + } + + done() + } + } + } + } + + describe("update()") { + it("should make API call to update a file request when API call succeeds") { + stub( + condition: isHost("api.box.com") && isPath("/2.0/file_requests/42037322") + && isMethodPUT() + && hasJsonBody([ + "title": "Updated title", + "description": "Updated description", + "status": "inactive", + "is_email_required": false, + "is_description_required": false, + "expires_at": "2020-09-28T20:53:43Z" + + ]) + && hasHeaderNamed("If-Match", value: "1") + ) { _ in + OHHTTPStubsResponse( + fileAtPath: OHPathForFile("UpdateFileRequest.json", type(of: self))!, + statusCode: 200, headers: [:] + ) + } + + let updateRequest = FileRequestUpdateRequest( + title: "Updated title", + description: "Updated description", + status: .inactive, + isEmailRequired: false, + isDescriptionRequired: false, + expiresAt: "2020-09-28T20:53:43Z".iso8601 + ) + + waitUntil(timeout: .seconds(10)) { done in + self.sut.fileRequests.update( + fileRequestId: "42037322", + ifMatch: "1", + updateRequest: updateRequest + ) { result in + switch result { + case let .success(fileRequest): + expect(fileRequest.type).to(equal("file_request")) + expect(fileRequest.id).to(equal("42037322")) + expect(fileRequest.title).to(equal("Updated title")) + expect(fileRequest.description).to(equal("Updated description")) + expect(fileRequest.status).to(equal(.inactive)) + expect(fileRequest.isEmailRequired).to(equal(false)) + expect(fileRequest.isDescriptionRequired).to(equal(false)) + expect(fileRequest.expiresAt?.iso8601).to(equal("2020-09-28T20:53:43Z")) + expect(fileRequest.url).to(equal("/f/19e57f40ace247278a8e3d336678c64a")) + expect(fileRequest.etag).to(equal("1")) + expect(fileRequest.createdAt.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.createdBy?.type).to(equal("user")) + expect(fileRequest.createdBy?.id).to(equal("11446498")) + expect(fileRequest.createdBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.createdBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.updatedAt.iso8601).to(equal("2020-09-28T19:53:43Z")) + expect(fileRequest.updatedBy?.type).to(equal("user")) + expect(fileRequest.updatedBy?.id).to(equal("11446498")) + expect(fileRequest.updatedBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.updatedBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.folder.id).to(equal("12345")) + expect(fileRequest.folder.etag).to(equal("1")) + expect(fileRequest.folder.type).to(equal("folder")) + expect(fileRequest.folder.sequenceId).to(equal("3")) + expect(fileRequest.folder.name).to(equal("Contracts")) + case let .failure(error): + fail("Expected call to update to succeed, but instead got \(error)") + } + done() + } + } + } + } + + describe("copy()") { + it("should make API call to copy a file request when API call succeeds") { + stub( + condition: isHost("api.box.com") && isPath("/2.0/file_requests/42037322/copy") + && isMethodPOST() + && hasJsonBody([ + "title": "New title after copy", + "description": "New description after copy", + "is_email_required": true, + "is_description_required": false, + "expires_at": "2020-09-29T21:42:37Z", + "folder": ["id": "56789", "type": "folder"] + + ]) + ) { _ in + OHHTTPStubsResponse( + fileAtPath: OHPathForFile("CopyFileRequest.json", type(of: self))!, + statusCode: 200, headers: [:] + ) + } + + let copyRequest = FileRequestCopyRequest( + title: "New title after copy", + description: "New description after copy", + isEmailRequired: true, + isDescriptionRequired: false, + expiresAt: "2020-09-29T21:42:37Z".iso8601, + folder: .init(id: "56789") + ) + + waitUntil(timeout: .seconds(10)) { done in + self.sut.fileRequests.copy(fileRequestId: "42037322", copyRequest: copyRequest) { result in + switch result { + case let .success(fileRequest): + expect(fileRequest.type).to(equal("file_request")) + expect(fileRequest.id).to(equal("51183371")) + expect(fileRequest.title).to(equal("New title after copy")) + expect(fileRequest.description).to(equal("New description after copy")) + expect(fileRequest.status).to(equal(.active)) + expect(fileRequest.isEmailRequired).to(equal(true)) + expect(fileRequest.isDescriptionRequired).to(equal(false)) + expect(fileRequest.expiresAt?.iso8601).to(equal("2020-09-29T21:42:37Z")) + expect(fileRequest.url).to(equal("/f/19e57f40ace247278a8e3d336678c64a")) + expect(fileRequest.etag).to(equal("1")) + expect(fileRequest.createdAt.iso8601).to(equal("2020-09-28T19:22:33Z")) + expect(fileRequest.createdBy?.type).to(equal("user")) + expect(fileRequest.createdBy?.id).to(equal("11446498")) + expect(fileRequest.createdBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.createdBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.updatedAt.iso8601).to(equal("2020-09-28T19:22:33Z")) + expect(fileRequest.updatedBy?.type).to(equal("user")) + expect(fileRequest.updatedBy?.id).to(equal("11446498")) + expect(fileRequest.updatedBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.updatedBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.folder.id).to(equal("56789")) + expect(fileRequest.folder.etag).to(equal("1")) + expect(fileRequest.folder.type).to(equal("folder")) + expect(fileRequest.folder.sequenceId).to(equal("1")) + expect(fileRequest.folder.name).to(equal("New Contracts")) + case let .failure(error): + fail("Expected call to update to succeed, but instead got \(error)") + } + done() + } + } + } + } + + describe("delete()") { + it("should make API call to delete file request response when call is successful") { + stub( + condition: isHost("api.box.com") + && isPath("/2.0/file_requests/42037322") + && isMethodDELETE() + ) { _ in + OHHTTPStubsResponse(data: Data(), statusCode: 204, headers: [:]) + } + + waitUntil(timeout: .seconds(10)) { done in + self.sut.fileRequests.delete(fileRequestId: "42037322") { result in + switch result { + case .success: + break + case let .failure(error): + fail("Expected call to delete to succeed, but instead got \(error)") + } + done() + } + } + } + } + } + } +} diff --git a/Tests/Responses/FileRequestSpecs.swift b/Tests/Responses/FileRequestSpecs.swift new file mode 100644 index 000000000..71f528756 --- /dev/null +++ b/Tests/Responses/FileRequestSpecs.swift @@ -0,0 +1,76 @@ +// +// FileRequestSpecs.swift +// BoxSDKTests-iOS +// +// Created by Artur Jankowski on 09/08/2022. +// Copyright © 2022 box. All rights reserved. +// + +@testable import BoxSDK +import Nimble +import Quick + +class FileRequestSpecs: QuickSpec { + + override func spec() { + describe("FileRequest") { + + describe("init()") { + + it("should correctly deserialize from full JSON representation") { + guard let filepath = Bundle(for: type(of: self)).path(forResource: "GetFileRequest", ofType: "json") else { + fail("Could not find fixture file.") + return + } + + do { + let contents = try String(contentsOfFile: filepath) + let jsonDict = try JSONSerialization.jsonObject(with: contents.data(using: .utf8)!) as! [String: Any] + let fileRequest = try FileRequest(json: jsonDict) + + expect(fileRequest.type).to(equal("file_request")) + expect(fileRequest.id).to(equal("42037322")) + expect(fileRequest.title).to(equal("Please upload documents")) + expect(fileRequest.description).to(equal("Following documents are requested for your process")) + expect(fileRequest.status).to(equal(.active)) + expect(fileRequest.isEmailRequired).to(equal(true)) + expect(fileRequest.isDescriptionRequired).to(equal(true)) + expect(fileRequest.expiresAt?.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.url).to(equal("/f/19e57f40ace247278a8e3d336678c64a")) + expect(fileRequest.etag).to(equal("1")) + expect(fileRequest.createdAt.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.createdBy?.type).to(equal("user")) + expect(fileRequest.createdBy?.id).to(equal("11446498")) + expect(fileRequest.createdBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.createdBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.updatedAt.iso8601).to(equal("2020-09-28T18:53:43Z")) + expect(fileRequest.updatedBy?.type).to(equal("user")) + expect(fileRequest.updatedBy?.id).to(equal("11446498")) + expect(fileRequest.updatedBy?.name).to(equal("Aaron Levie")) + expect(fileRequest.updatedBy?.login).to(equal("ceo@example.com")) + expect(fileRequest.folder.id).to(equal("12345")) + expect(fileRequest.folder.etag).to(equal("1")) + expect(fileRequest.folder.type).to(equal("folder")) + expect(fileRequest.folder.sequenceId).to(equal("3")) + expect(fileRequest.folder.name).to(equal("Contracts")) + } + catch { + fail("Failed with Error: \(error)") + } + } + } + } + + describe("FileRequestStatus") { + + describe("init()") { + + it("should correctly create an enum value from it's string representation") { + expect(FileRequestStatus.active).to(equal(FileRequestStatus(FileRequestStatus.active.description))) + expect(FileRequestStatus.inactive).to(equal(FileRequestStatus(FileRequestStatus.inactive.description))) + expect(FileRequestStatus.customValue("custom value")).to(equal(FileRequestStatus("custom value"))) + } + } + } + } +} diff --git a/Tests/Stubs/Resources/FileRequests/CopyFileRequest.json b/Tests/Stubs/Resources/FileRequests/CopyFileRequest.json new file mode 100644 index 000000000..69e1e8d04 --- /dev/null +++ b/Tests/Stubs/Resources/FileRequests/CopyFileRequest.json @@ -0,0 +1,33 @@ +{ + "id": "51183371", + "type": "file_request", + "title": "New title after copy", + "description": "New description after copy", + "status": "active", + "is_email_required": true, + "is_description_required": false, + "expires_at": "2020-09-29T13:42:37-08:00", + "folder": { + "id": "56789", + "etag": "1", + "type": "folder", + "sequence_id": "1", + "name": "New Contracts" + }, + "url": "/f/19e57f40ace247278a8e3d336678c64a", + "etag": "1", + "created_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "created_at": "2020-09-28T11:22:33-08:00", + "updated_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "updated_at": "2020-09-28T11:22:33-08:00" +} diff --git a/Tests/Stubs/Resources/FileRequests/GetFileRequest.json b/Tests/Stubs/Resources/FileRequests/GetFileRequest.json new file mode 100644 index 000000000..8e0759f08 --- /dev/null +++ b/Tests/Stubs/Resources/FileRequests/GetFileRequest.json @@ -0,0 +1,33 @@ +{ + "id": "42037322", + "type": "file_request", + "title": "Please upload documents", + "description": "Following documents are requested for your process", + "status": "active", + "is_email_required": true, + "is_description_required": true, + "expires_at": "2020-09-28T10:53:43-08:00", + "folder": { + "id": "12345", + "etag": "1", + "type": "folder", + "sequence_id": "3", + "name": "Contracts" + }, + "url": "/f/19e57f40ace247278a8e3d336678c64a", + "etag": "1", + "created_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "created_at": "2020-09-28T10:53:43-08:00", + "updated_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "updated_at": "2020-09-28T10:53:43-08:00" +} diff --git a/Tests/Stubs/Resources/FileRequests/UpdateFileRequest.json b/Tests/Stubs/Resources/FileRequests/UpdateFileRequest.json new file mode 100644 index 000000000..d5f073b16 --- /dev/null +++ b/Tests/Stubs/Resources/FileRequests/UpdateFileRequest.json @@ -0,0 +1,33 @@ +{ + "id": "42037322", + "type": "file_request", + "title": "Updated title", + "description": "Updated description", + "status": "inactive", + "is_email_required": false, + "is_description_required": false, + "expires_at": "2020-09-28T12:53:43-08:00", + "folder": { + "id": "12345", + "etag": "1", + "type": "folder", + "sequence_id": "3", + "name": "Contracts" + }, + "url": "/f/19e57f40ace247278a8e3d336678c64a", + "etag": "1", + "created_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "created_at": "2020-09-28T10:53:43-08:00", + "updated_by": { + "id": "11446498", + "type": "user", + "name": "Aaron Levie", + "login": "ceo@example.com" + }, + "updated_at": "2020-09-28T11:53:43-08:00" +}