public UserGroup(MongoUserGroup mongoUserGroup, IReadOnlyDictionary <ObjectId, MongoUserGroupMemberUser> userDictionary)
        {
            Id      = mongoUserGroup.Id;
            Name    = mongoUserGroup.Name;
            Members = mongoUserGroup.Members?.Select(u => new UserGroupMember(u, userDictionary));

            CreatedAt = mongoUserGroup.CreatedAt;
            UpdatedAt = mongoUserGroup.UpdatedAt;
        }
        public static async Task <APIGatewayProxyResponse> PostUserGroups(APIGatewayProxyRequest request, ILambdaContext context)
        {
            try
            {
                var body = JsonConvert.DeserializeObject <UserGroupCreateRequest>(request.Body);

                var user = await UsersCollection.AsQueryable().Select(MongoUserGroupMemberUser.UserProjection).FirstOrDefaultAsync(u => u.Id == body.UserId).ConfigureAwait(false);

                if (user == null)
                {
                    throw new Exception("User Not Found");
                }
                // TODO : Check for conflict! IE User is already the owner of a UserGroup! Also check if the group name is already in use. IE make name unique.

                /*
                 *  return new APIGatewayProxyResponse
                 *  {
                 *      StatusCode = (int) HttpStatusCode.Conflict,
                 *      Body = JsonConvert.SerializeObject(new ApiResponse<ApiError>
                 *      {
                 *          Data = new ApiError
                 *          {
                 *              Type = ApiError.ErrorType.ApiError,
                 *              Message = "A change with that Id already exits."
                 *          }
                 *      }, ApiGatewayUtil.DefaultSerializerSettings),
                 *      Headers = ApiGatewayUtil.DefaultHeaders
                 *  };
                 */

                var mongoUserGroup = new MongoUserGroup(body, user);
                await UserGroupsCollection.InsertOneAsync(mongoUserGroup).ConfigureAwait(false);

                var userDictionary = new[] { user }.ToDictionary(u => u.Id);

                return(new APIGatewayProxyResponse
                {
                    StatusCode = (int)HttpStatusCode.Created,
                    Body = JsonConvert.SerializeObject(new ApiGatewayUtil.ApiResponse <UserGroup>
                    {
                        Data = new UserGroup(mongoUserGroup, userDictionary),
                    }, ApiGatewayUtil.DefaultSerializerSettings),
                    Headers = ApiGatewayUtil.DefaultHeaders
                });
            }
            catch (Exception e)
            {
                return(new APIGatewayProxyResponse
                {
                    StatusCode = e is JsonSerializationException
                        ? (int)HttpStatusCode.BadRequest
                        : (int)HttpStatusCode.InternalServerError,

                    Body = JsonConvert.SerializeObject(new ApiGatewayUtil.ApiResponse <ApiGatewayUtil.ApiError>
                    {
                        Data = new ApiGatewayUtil.ApiError
                        {
                            Type = ApiGatewayUtil.ApiError.ErrorType.ApiError,
                            Message = e.Message
                        }
                    }, ApiGatewayUtil.DefaultSerializerSettings),
                    Headers = ApiGatewayUtil.DefaultHeaders
                });
            }
        }