Пример #1
0
        public async Task <StatusCode <NoteOut> > GetByIdAndUser(Guid noteId, string username)
        {
            string userId = (await _databaseContext.Users
                             .FirstOrDefaultAsync(_ => _.UserName == username))?
                            .Id;

            Note note = await _databaseContext.Notes
                        .Include(_ => _.ShareEveryone)
                        .Include(_ => _.ShareForUsers)
                        .FirstOrDefaultAsync(_ => _.ID == noteId);

            if (note == null)
            {
                return(new StatusCode <NoteOut>(StatusCodes.Status404NotFound, $"Note {noteId} not found"));
            }

            if (note.OwnerID == userId)
            {
                return(new StatusCode <NoteOut>(StatusCodes.Status200OK, _mapper.Map <NoteOut>(note)));
            }

            if (note.IsShared)
            {
                if (note.IsSharedForEveryone)
                {
                    ShareEveryone share = note.ShareEveryone;

                    if (share != null)
                    {
                        if ((share.ExpirationDateTime == null ||
                             (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now)) &&
                            (share.DownloadLimit == null ||
                             (share.DownloadLimit != null && share.DownloadLimit > 0)))
                        {
                            return(new StatusCode <NoteOut>(StatusCodes.Status200OK, _mapper.Map <NoteOut>(note)));
                        }
                    }
                }
                else if (note.IsSharedForUsers)
                {
                    ShareForUser share = note.ShareForUsers.FirstOrDefault(_ => _.SharedForUserID == userId && _.ResourceID == noteId);

                    if (share != null)
                    {
                        if (share.ExpirationDateTime == null ||
                            (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now))
                        {
                            return(new StatusCode <NoteOut>(StatusCodes.Status200OK, _mapper.Map <NoteOut>(note)));
                        }
                    }
                }
            }

            return(new StatusCode <NoteOut>(StatusCodes.Status404NotFound, $"Note {noteId} not found"));
        }
Пример #2
0
        public async void Returns_OkObjectResult200AndNoteOut_when_NoteExistsAndIsSharedForEveryoneAndDownloadLimitIsGreaterThan0()
        {
            IDatabaseContext    databaseContext     = DatabaseTestHelper.GetContext();
            MapperConfiguration mapperConfiguration = new MapperConfiguration(conf =>
            {
                conf.AddProfile(new Note_to_NoteOut());
            });
            IMapper mapper = mapperConfiguration.CreateMapper();

            INotesService notesService = new NotesService(databaseContext, mapper);

            string userId = (await databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == ADMIN_USERNAME)).Id;

            Note note = new Note
            {
                ResourceType        = DAO.Models.Base.ResourceType.NOTE,
                Title               = "Note's title",
                Content             = "Note's content",
                OwnerID             = userId,
                CreatedDateTime     = DateTime.Now,
                IsShared            = true,
                IsSharedForEveryone = true
            };

            await databaseContext.Notes.AddAsync(note);

            int downloadLimit = 5;

            ShareEveryone shareEveryone = new ShareEveryone
            {
                CreatedDateTime = DateTime.Now,
                ResourceID      = note.ID,
                OwnerID         = userId,
                Token           = "XYZ",
                DownloadLimit   = downloadLimit
            };

            await databaseContext.ShareEveryones.AddAsync(shareEveryone);

            await databaseContext.SaveChangesAsync();

            Assert.True(databaseContext.Notes
                        .Any(_ => _.ID == note.ID));

            Assert.True(databaseContext.ShareEveryones
                        .Any(_ => _.ID == shareEveryone.ID));

            StatusCode <NoteOut> status = await notesService.GetByIdAndUser(note.ID, USER_USERNAME);

            Assert.NotNull(status);
            Assert.Equal(StatusCodes.Status200OK, status.Code);
            Assert.NotNull(status.Body);
            Assert.IsType <NoteOut>(status.Body);
            Assert.Equal(downloadLimit, shareEveryone.DownloadLimit);
        }
Пример #3
0
        public async Task <StatusCode <ShareEveryoneOut> > ShareForEveryone(Guid resourceId, string username, string password, DateTime?expirationDateTime, int?downloadLimit)
        {
            string userId = (await _databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == username))?.Id;

            ResourceAbstract resourceAbstract = await _databaseContext.ResourceAbstracts.FirstOrDefaultAsync(_ => _.ID == resourceId && _.OwnerID == userId);

            if (resourceAbstract == null)
            {
                return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status404NotFound, StatusMessages.FILE_NOT_FOUND));
            }

            ShareEveryone shareEveryone = await _databaseContext.ShareEveryones.FirstOrDefaultAsync(_ => _.ResourceID == resourceId && _.OwnerID == userId);

            if (shareEveryone == null)
            {
                shareEveryone = new ShareEveryone
                {
                    CreatedDateTime    = DateTime.Now,
                    DownloadLimit      = downloadLimit,
                    ExpirationDateTime = expirationDateTime,
                    ResourceID         = resourceId,
                    OwnerID            = userId,
                    Password           = password,
                    Token = GenerateToken()
                };

                await _databaseContext.ShareEveryones.AddAsync(shareEveryone);

                resourceAbstract.IsShared            = true;
                resourceAbstract.IsSharedForEveryone = true;
            }
            else
            {
                shareEveryone.DownloadLimit        = downloadLimit;
                shareEveryone.ExpirationDateTime   = expirationDateTime;
                shareEveryone.Password             = password;
                shareEveryone.LastModifiedDateTime = DateTime.Now;
            }

            if (shareEveryone.ExpirationDateTime.HasValue)
            {
                shareEveryone.ExpirationDateTime = shareEveryone.ExpirationDateTime.Value.AddHours(1);
            }

            await _databaseContext.SaveChangesAsync();

            ShareEveryoneOut result = _mapper.Map <ShareEveryoneOut>(shareEveryone);

            return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status200OK, result));
        }
Пример #4
0
        public async Task <StatusCode <ShareEveryoneOut> > GetShareForEveryoneByFileIdAndUser(Guid resourceId, string username)
        {
            string userId = (await _databaseContext.Users
                             .FirstOrDefaultAsync(_ => _.UserName == username))
                            ?.Id;

            ShareEveryone shareEveryone = await _databaseContext.ShareEveryones
                                          .FirstOrDefaultAsync(_ => _.ResourceID == resourceId && _.OwnerID == userId);

            if (shareEveryone == null)
            {
                return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status404NotFound, StatusMessages.FILE_IS_NOT_SHARED));
            }

            ShareEveryoneOut result = _mapper.Map <ShareEveryoneOut>(shareEveryone);

            return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status200OK, result));
        }
Пример #5
0
        public async void Returns_False_when_FileNotBelongsToUser()
        {
            IDatabaseContext databaseContext = DatabaseTestHelper.GetContext();

            IShareService shareService = new ShareService(databaseContext, null);

            string          ownerUsername = "******";
            ApplicationUser owner         = await databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == ownerUsername);

            Assert.NotNull(owner);

            File file = new File
            {
                ParentDirectoryID = null,
                Name                = "TestFile.txt",
                OwnerID             = owner.Id,
                IsShared            = true,
                IsSharedForEveryone = true,
                ResourceType        = DAO.Models.Base.ResourceType.FILE
            };

            await databaseContext.Files.AddAsync(file);

            ShareEveryone shareFile = new ShareEveryone
            {
                CreatedDateTime = DateTime.Now,
                ResourceID      = file.ID,
                OwnerID         = owner.Id,
                Token           = "fil_token"
            };

            await databaseContext.ShareEveryones.AddAsync(shareFile);

            await databaseContext.SaveChangesAsync();

            bool isSharedForEveryone = await shareService.IsSharedForEveryone(file.ID);

            Assert.True(isSharedForEveryone);

            bool canceled = await shareService.CancelSharingForEveryone(file.ID, "*****@*****.**");

            Assert.False(canceled);
            Assert.True(await databaseContext.ShareEveryones.AnyAsync(_ => _.ResourceID == file.ID));
        }
Пример #6
0
        public async Task <StatusCode <ShareEveryoneOut> > GetShareForEveryoneByTokenAndPassword(string token, string password)
        {
            ShareEveryone shareEveryone = await _databaseContext.ShareEveryones
                                          .Include(_ => _.Owner)
                                          .Include(_ => _.Resource)
                                          .FirstOrDefaultAsync(_ => _.Token == token);

            if (shareEveryone == null)
            {
                return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status404NotFound, StatusMessages.TOKEN_NOT_FOUND));
            }

            if (shareEveryone.Password != password)
            {
                return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status401Unauthorized, StatusMessages.PASSWORD_IS_WRONG));
            }

            ShareEveryoneOut shareEveryoneOut = _mapper.Map <ShareEveryoneOut>(shareEveryone);

            return(new StatusCode <ShareEveryoneOut>(StatusCodes.Status200OK, shareEveryoneOut));
        }
Пример #7
0
        public async Task <bool> CancelSharingForEveryone(Guid resourceId, string username)
        {
            string userId = (await _databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == username))?.Id;

            ResourceAbstract fileAbstract = await _databaseContext.ResourceAbstracts.FirstOrDefaultAsync(_ => _.ID == resourceId && _.OwnerID == userId);

            ShareEveryone shareEveryone = await _databaseContext.ShareEveryones.FirstOrDefaultAsync(_ => _.ResourceID == resourceId && _.OwnerID == userId);

            if (fileAbstract == null || shareEveryone == null)
            {
                return(false);
            }

            _databaseContext.ShareEveryones.Remove(shareEveryone);
            fileAbstract.IsSharedForEveryone = false;
            fileAbstract.IsShared            = fileAbstract.IsSharedForUsers;

            await _databaseContext.SaveChangesAsync();

            return(!fileAbstract.IsSharedForEveryone &&
                   !(await _databaseContext.ShareEveryones.AnyAsync(_ => _.ResourceID == resourceId && _.OwnerID == userId)));
        }
Пример #8
0
        public async void Returns_True_when_DirectoryIsSharedForEveryone()
        {
            IDatabaseContext databaseContext = DatabaseTestHelper.GetContext();

            IShareService   shareService  = new ShareService(databaseContext, null);
            string          ownerUsername = "******";
            ApplicationUser owner         = await databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == ownerUsername);

            Assert.NotNull(owner);

            Directory directory = new Directory
            {
                ParentDirectoryID = null,
                Name                = "TestDirectory",
                OwnerID             = owner.Id,
                IsShared            = true,
                IsSharedForEveryone = true,
                ResourceType        = DAO.Models.Base.ResourceType.DIRECTORY
            };

            await databaseContext.Directories.AddAsync(directory);

            ShareEveryone shareDirectory = new ShareEveryone
            {
                CreatedDateTime = DateTime.Now,
                ResourceID      = directory.ID,
                OwnerID         = owner.Id,
                Token           = "dir_token"
            };

            await databaseContext.ShareEveryones.AddAsync(shareDirectory);

            await databaseContext.SaveChangesAsync();

            bool isSharedForEveryone = await shareService.IsSharedForEveryone(directory.ID);

            Assert.True(isSharedForEveryone);
        }
Пример #9
0
        public async Task <bool> IsSharedForEveryone(Guid resourceId)
        {
            ShareEveryone shareEveryone = await _databaseContext.ShareEveryones.FirstOrDefaultAsync(_ => _.ResourceID == resourceId);

            return(shareEveryone != null);
        }
Пример #10
0
        public async Task <StatusCode <FileOut> > GetByIdAndUser(Guid id, string username)
        {
            string userId = (await _databaseContext.Users
                             .FirstOrDefaultAsync(_ => _.UserName == username))?.Id;

            ResourceAbstract fileAbstract = await _databaseContext.ResourceAbstracts
                                            .Include(_ => _.ParentDirectory)
                                            .Include(_ => _.ShareEveryone)
                                            .Include(_ => _.ShareForUsers)
                                            .FirstOrDefaultAsync(_ => _.ID == id && (_.ResourceType == ResourceType.FILE || _.ResourceType == ResourceType.DIRECTORY));

            if (fileAbstract == null)
            {
                return(new StatusCode <FileOut>(StatusCodes.Status404NotFound, $"File {id} not found"));
            }

            if (fileAbstract.OwnerID == userId)
            {
                FileOut result = _mapper.Map <FileOut>(fileAbstract);
                if (fileAbstract is File)
                {
                    result.FileSizeBytes = (fileAbstract as File).FileSizeBytes;
                }
                return(new StatusCode <FileOut>(StatusCodes.Status200OK, result));
            }

            if (fileAbstract.IsShared)
            {
                if (fileAbstract.IsSharedForEveryone)
                {
                    ShareEveryone share = fileAbstract.ShareEveryone;

                    if (share != null)
                    {
                        if ((share.ExpirationDateTime == null ||
                             (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now)) &&
                            (share.DownloadLimit == null ||
                             (share.DownloadLimit != null && share.DownloadLimit > 0)))
                        {
                            FileOut result = _mapper.Map <FileOut>(fileAbstract);
                            if (fileAbstract is File)
                            {
                                result.FileSizeBytes = (fileAbstract as File).FileSizeBytes;
                            }
                            return(new StatusCode <FileOut>(StatusCodes.Status200OK, result));
                        }
                    }
                }
                else if (fileAbstract.IsSharedForUsers)
                {
                    ShareForUser share = fileAbstract.ShareForUsers.FirstOrDefault(_ => _.SharedForUserID == userId && _.ResourceID == id);

                    if (share != null)
                    {
                        if (share.ExpirationDateTime == null ||
                            (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now))
                        {
                            FileOut result = _mapper.Map <FileOut>(fileAbstract);
                            if (fileAbstract is File)
                            {
                                result.FileSizeBytes = (fileAbstract as File).FileSizeBytes;
                            }
                            return(new StatusCode <FileOut>(StatusCodes.Status200OK, result));
                        }
                    }
                }
            }

            return(new StatusCode <FileOut>(StatusCodes.Status404NotFound, $"File {id} not found"));
        }
Пример #11
0
        public async Task <StatusCode <DownloadFileInfo> > DownloadByIdAndUser(Guid id, string username)
        {
            string userId = (await _databaseContext.Users.FirstOrDefaultAsync(_ => _.UserName == username))?.Id;

            File fileToDownload = await _databaseContext.Files
                                  .Include(_ => _.ShareEveryone)
                                  .Include(_ => _.ShareForUsers)
                                  .FirstOrDefaultAsync(_ => _.ID == id);

            if (fileToDownload == null)
            {
                return(new StatusCode <DownloadFileInfo>(StatusCodes.Status404NotFound, $"File {id} not found"));
            }

            if (fileToDownload.OwnerID == userId)
            {
                byte[] fileContent = System.IO.File.ReadAllBytes(fileToDownload.Path);

                DownloadFileInfo downloadFileInfo = new DownloadFileInfo(fileToDownload.Name, fileContent);

                return(new StatusCode <DownloadFileInfo>(StatusCodes.Status200OK, downloadFileInfo));
            }

            if (fileToDownload.IsShared)
            {
                if (fileToDownload.IsSharedForEveryone)
                {
                    ShareEveryone share = fileToDownload.ShareEveryone;

                    if (share != null)
                    {
                        if ((share.ExpirationDateTime == null ||
                             (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now)) &&
                            (share.DownloadLimit == null ||
                             (share.DownloadLimit != null && share.DownloadLimit > 0)))
                        {
                            if (share.DownloadLimit != null && share.DownloadLimit > 0)
                            {
                                --share.DownloadLimit;
                                await _databaseContext.SaveChangesAsync();
                            }

                            byte[] fileContent = System.IO.File.ReadAllBytes(fileToDownload.Path);

                            DownloadFileInfo downloadFileInfo = new DownloadFileInfo(fileToDownload.Name, fileContent);

                            return(new StatusCode <DownloadFileInfo>(StatusCodes.Status200OK, downloadFileInfo));
                        }
                    }
                }
                else if (fileToDownload.IsSharedForUsers)
                {
                    ShareForUser share = fileToDownload.ShareForUsers.FirstOrDefault(_ => _.SharedForUserID == userId && _.ResourceID == id);

                    if (share != null)
                    {
                        if (share.ExpirationDateTime == null ||
                            (share.ExpirationDateTime != null && share.ExpirationDateTime >= DateTime.Now))
                        {
                            byte[] fileContent = System.IO.File.ReadAllBytes(fileToDownload.Path);

                            DownloadFileInfo downloadFileInfo = new DownloadFileInfo(fileToDownload.Name, fileContent);

                            return(new StatusCode <DownloadFileInfo>(StatusCodes.Status200OK, downloadFileInfo));
                        }
                    }
                }
            }

            return(new StatusCode <DownloadFileInfo>(StatusCodes.Status404NotFound, $"File {id} not found"));
        }