private async Task AddVersionAsync(Common.Api.Request.MediaPart requestedPart,
                                           Dal.Model.MediaPart addedPart, Dal.Model.User loggedUser)
        {
            var version = requestedPart.Version.MediaVersionId == null ? new Dal.Model.MediaVersion() :
                          await context.MediaVersions.SingleOrDefaultAsync(v => v.MediaVersionId == requestedPart.Version.MediaVersionId);

            version.MediaPartId    = addedPart.MediaPartId;
            version.VersionComment = requestedPart.Version.VersionComment;
            version.UserId         = loggedUser.UserId;
            version.Created        = DateTime.Now;

            if (requestedPart.Version.MediaVersionId == null)
            {
                await context.MediaVersions.AddAsync(version);
            }

            await context.SaveChangesAsync();

            requestedPart.Version.MediaVersionId = version.MediaVersionId;

            // Media version tags
            await AddVersionTagsAsync(requestedPart);

            // Links
            await AddLinksAsync(requestedPart.Version, loggedUser);
        }
        private async Task AddVersionTagsAsync(Common.Api.Request.MediaPart requestedPart)
        {
            if (requestedPart.Version.Tags != null)
            {
                List <Dal.Model.MediaTag> tagsInRequestVersion = new();
                foreach (var reqVersionTag in requestedPart.Version.Tags)
                {
                    var tag = await context.MediaTags.SingleOrDefaultAsync(t => t.Name == reqVersionTag.Name);

                    if (tag == null)
                    {
                        tag = new Dal.Model.MediaTag {
                            Name = reqVersionTag.Name
                        };
                        await context.MediaTags.AddAsync(tag);

                        await context.SaveChangesAsync();
                    }
                    tagsInRequestVersion.Add(tag);

                    // Version-Tag link
                    if (!await context.MediaVersionTags.AnyAsync(vt => vt.MediaVersionId == (int)requestedPart.Version.MediaVersionId && vt.MediaTagId == tag.MediaTagId))
                    {
                        await context.MediaVersionTags.AddAsync(new Dal.Model.MediaVersionTag
                        {
                            MediaVersionId = (int)requestedPart.Version.MediaVersionId,
                            MediaTagId     = tag.MediaTagId
                        });

                        await context.SaveChangesAsync();
                    }
                }

                // Remove tags that are not in request.
                var allTagsForVersion = await context.MediaVersionTags.Where(vt => vt.MediaVersionId == (int)requestedPart.Version.MediaVersionId).ToListAsync();

                context.MediaVersionTags.RemoveRange(allTagsForVersion.Where(versionTag => !tagsInRequestVersion.Any(requestTag => requestTag.MediaTagId == versionTag.MediaTagId)));
                await context.SaveChangesAsync();
            }
        }