private void ThrowIfNotADeleteTransform(WorkspaceResultTransform transform)
 {
     if (!(
             transform.Action == WorkspaceResultTransformAction.DeleteAll ||
             transform.Action == WorkspaceResultTransformAction.DeleteSpecificResults ||
             transform.Action == WorkspaceResultTransformAction.DeleteByQueryText))
     {
         throw new InvalidRequestFetchoException("The transform passed through is not a delete action");
     }
 }
        public async Task <HttpResponseMessage> TransformWorkspaceResultsByWorkspaceId(Guid workspaceId, [FromBody] WorkspaceResultTransform transform)
        {
            try
            {
                WorkspaceResultTransform.Validate(transform);

                using (var db = new Database())
                {
                    // do we have access to that target?
                    if (transform.HasTarget)
                    {
                        await ThrowIfNotValidPermission(
                            db,
                            transform.TargetAccessKeyId,
                            WorkspaceAccessPermissions.Write | WorkspaceAccessPermissions.Owner | WorkspaceAccessPermissions.Manage);
                    }

                    if (transform.Action == WorkspaceResultTransformAction.DeleteAll)
                    {
                        transform.ResultsAffected = await db.DeleteAllWorkspaceResultsByWorkspaceId(workspaceId);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.DeleteSpecificResults)
                    {
                        transform.ResultsAffected = await db.DeleteWorkspaceResultsByWorkspaceId(workspaceId, transform.Results);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.DeleteByQueryText)
                    {
                        var query = new Query(transform.QueryText);
                        ThrowIfQueryContainsInvalidOptions(query);
                        var results = await db.GetWorkspaceResults(workspaceId);

                        var resultsToDelete = query.Distill(results);
                        transform.ResultsAffected = await db.DeleteWorkspaceResultsByWorkspaceId(workspaceId, resultsToDelete);
                    }

                    else if (transform.Action == WorkspaceResultTransformAction.MoveAllTo)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        await db.MoveAllWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.MoveSpecificTo)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        await db.MoveWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId, transform.Results);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.MoveByQueryText)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        var query = new Query(transform.QueryText);
                        ThrowIfQueryContainsInvalidOptions(query);
                        var results = await db.GetWorkspaceResults(workspaceId);

                        var resultsToMove = query.Distill(results);
                        transform.ResultsAffected = await db.MoveWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId, resultsToMove);
                    }

                    else if (transform.Action == WorkspaceResultTransformAction.CopyAllTo)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        await db.MoveAllWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.CopySpecificTo)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        await db.MoveWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId, transform.Results);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.CopyByQueryText)
                    {
                        var targetWorkspaceId = await GetWorkspaceIdOrThrowIfNoAccess(transform.TargetAccessKeyId);

                        var query = new Query(transform.QueryText);
                        ThrowIfQueryContainsInvalidOptions(query);
                        var results = await db.GetWorkspaceResults(workspaceId);

                        var resultsToCopy = query.Distill(results);
                        transform.ResultsAffected = await db.MoveWorkspaceResultsByWorkspaceId(workspaceId, targetWorkspaceId, resultsToCopy);
                    }

                    else if (transform.Action == WorkspaceResultTransformAction.TagAll)
                    {
                        await db.TagAllWorkspaceResultsByWorkspaceId(workspaceId, transform.Tag);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.TagSpecificResults)
                    {
                        await db.TagWorkspaceResultsByWorkspaceId(workspaceId, transform.Results, transform.Tag);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.TagByQueryText)
                    {
                        var query = new Query(transform.QueryText);
                        ThrowIfQueryContainsInvalidOptions(query);
                        var results = await db.GetWorkspaceResults(workspaceId);

                        var resultsToTag = query.Distill(results);
                        transform.ResultsAffected = await db.TagWorkspaceResultsByWorkspaceId(workspaceId, resultsToTag, transform.Tag);
                    }

                    else if (transform.Action == WorkspaceResultTransformAction.UntagAll)
                    {
                        await db.UntagAllWorkspaceResultsByWorkspaceId(workspaceId, transform.Tag);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.UntagSpecificResults)
                    {
                        await db.UntagWorkspaceResultsByWorkspaceId(workspaceId, transform.Results, transform.Tag);
                    }
                    else if (transform.Action == WorkspaceResultTransformAction.UntagByQueryText)
                    {
                        var query = new Query(transform.QueryText);
                        ThrowIfQueryContainsInvalidOptions(query);
                        var results = await db.GetWorkspaceResults(workspaceId);

                        var resultsToTag = query.Distill(results);
                        transform.ResultsAffected = await db.UntagWorkspaceResultsByWorkspaceId(workspaceId, resultsToTag, transform.Tag);
                    }

                    transform.Success = true;

                    return(CreateOKResponse(transform));
                }
            }
            catch (Exception ex)
            {
                Utility.LogException(ex);
                transform.ErrorMessage    = ex.Message;
                transform.Success         = false;
                transform.ResultsAffected = 0;
                return(CreateConflictResponse(transform));
            }
        }
        public async Task <HttpResponseMessage> TransformWorkspaceResultsByAccessKeyId(Guid accessKeyId, [FromBody] WorkspaceResultTransform transform)
        {
            try
            {
                using (var db = new Database())
                    await ThrowIfNotValidPermission(
                        db,
                        accessKeyId,
                        WorkspaceAccessPermissions.Write | WorkspaceAccessPermissions.Manage | WorkspaceAccessPermissions.Owner);
                Guid workspaceId = await GetWorkspaceIdOrThrowIfNoAccess(accessKeyId);

                return(await TransformWorkspaceResultsByWorkspaceId(workspaceId, transform));
            }
            catch (Exception ex)
            {
                Utility.LogException(ex);
                return(CreateExceptionResponse(ex));
            }
        }