public async Task CreateGroup(Request request, Response response)
        {
            var userSession = await CheckAuth.Check(request, response, AuthLevel.Normal);

            if (userSession == null)
            {
                return;
            }

            var requestJson = request.Json <CreateGroupRequest>();

            //判断请求是否有效
            if (!Validation.Valid(requestJson, out var reason))
            {
                await response.BadRequest(reason);

                return;
            }

            //判断当前在允许新建组队的时间范围内
            var now = DateTime.Now;

            if (Config.Config.Options.RegDeadline > 0)
            {
                var regDeadline = UnixTimestamp.FromTimestamp(Config.Config.Options.RegDeadline);
                if (now > regDeadline)
                {
                    await response.BadRequest($"报名截止时间 ({regDeadline:yyyy-MM-dd HH:mm:ss}) 已过。");

                    return;
                }
            }

            //判断当前用户不属于任何组队
            var groupBindDb   = DbFactory.Get <UserGroupBind>();
            var groupBindList = await groupBindDb.SelectAllFromCache();

            var groupBindItem = groupBindList.FirstOrDefault(it => it.uid == userSession.uid);

            if (groupBindItem != null)
            {
                await response.BadRequest("Emmmmm, 请勿重复新建组队。");

                return;
            }

            //取得用户数据
            var userDb   = DbFactory.Get <User>();
            var userDict = (await userDb.SelectAllFromCache()).ToDictionary(it => it.uid, it => it);

            if (!userDict.ContainsKey(userSession.uid))
            {
                await response.Unauthorized("服务器提出了一个问题:你为何存在?");

                return;
            }

            if (string.IsNullOrWhiteSpace(requestJson.groupname))
            {
                await response.BadRequest("组队名称不能全为空白字符。");

                return;
            }

            if (requestJson.groupname.Length > 32)
            {
                await response.BadRequest("组队名称太长。");

                return;
            }

            if (requestJson.profile.Length > 350)
            {
                await response.BadRequest("队伍简介不能太长。");

                return;
            }

            var groupDb      = DbFactory.Get <UserGroup>();
            var groupNameSet = new HashSet <string>((await groupDb.SelectAllFromCache()).Select(it => it.groupname.ToLower()));

            if (groupNameSet.Contains(requestJson.groupname.ToLower()))
            {
                await response.BadRequest("队名不能重复");

                return;
            }


            //新建组队
            var newGroup = new user_group
            {
                groupname   = requestJson.groupname,
                profile     = requestJson.profile,
                create_time = now,
                update_time = now
            };

            var newGid = await groupDb.SimpleDb.AsInsertable(newGroup).ExecuteReturnIdentityAsync();

            await groupDb.InvalidateCache();

            //自动拒绝该用户所有未拒绝的邀请
            var inviteDb = DbFactory.Get <Invite>();
            await inviteDb.Db.Updateable <invite>().SetColumns(it => it.valid == 2)
            .Where(it => it.to_uid == userSession.uid && it.valid == 1).ExecuteCommandAsync();

            await inviteDb.InvalidateCache();


            //修改用户组队绑定
            var user = userDict[userSession.uid];

            user.roleid      = 3;
            user.update_time = now;
            await userDb.SimpleDb.AsUpdateable(user).ExecuteCommandAsync();

            await userDb.InvalidateCache();

            var newGroupBind = new user_group_bind
            {
                uid       = userSession.uid,
                gid       = newGid,
                is_leader = 1
            };
            await groupBindDb.SimpleDb.AsInsertable(newGroupBind).ExecuteCommandAsync();

            await groupBindDb.InvalidateCache();

            await response.OK();
        }
        public async Task AcceptInvite(Request request, Response response)
        {
            var userSession = await CheckAuth.Check(request, response, AuthLevel.Normal);

            if (userSession == null)
            {
                return;
            }

            var requestJson = request.Json <IidInviteRequest>();

            //判断请求是否有效
            if (!Validation.Valid(requestJson, out string reason))
            {
                await response.BadRequest(reason);

                return;
            }

            //读取用户设置
            var userDb   = DbFactory.Get <User>();
            var userList = await userDb.SelectAllFromCache();

            var user = userList.FirstOrDefault(it => it.uid == userSession.uid);

            if (user == null)
            {
                await response.BadRequest("活见鬼了");

                return;
            }

            //读取目标iid
            var inviteDb   = DbFactory.Get <Invite>();
            var inviteItem = inviteDb.SimpleDb.GetById(requestJson.iid);

            if (inviteItem == null || inviteItem.valid != 1)
            {
                await response.BadRequest("无效邀请");

                return;
            }

            if (inviteItem.to_uid != userSession.uid)
            {
                await response.BadRequest("无修改权限");
            }

            //将目标置为无效
            inviteItem.valid = 3;
            await inviteDb.SimpleDb.AsUpdateable(inviteItem).ExecuteCommandAsync();

            //取得该GID已绑定人数
            var groupBindDb   = DbFactory.Get <UserGroupBind>();
            var groupBindList = await groupBindDb.SelectAllFromCache();

            var numberOfGroup = groupBindList.Count(it => it.gid == inviteItem.from_gid);

            if (numberOfGroup >= 5)
            {
                await response.BadRequest("组队人数已满,无法加入。");

                await inviteDb.InvalidateCache();

                return;
            }

            //自动拒绝该用户所有未拒绝的邀请
            await inviteDb.Db.Updateable <invite>().SetColumns(it => it.valid == 2)
            .Where(it => it.to_uid == userSession.uid && it.valid == 1).ExecuteCommandAsync();

            await inviteDb.InvalidateCache();

            //插入组绑定
            var newGroupBindDb = new user_group_bind
            {
                uid       = user.uid,
                gid       = inviteItem.from_gid,
                is_leader = 0
            };
            await groupBindDb.SimpleDb.AsInsertable(newGroupBindDb).ExecuteCommandAsync();

            await groupBindDb.InvalidateCache();

            //修改用户设置
            user.roleid      = 2;
            user.update_time = DateTime.Now;

            await userDb.SimpleDb.AsUpdateable(user).ExecuteCommandAsync();

            await userDb.InvalidateCache();

            await response.OK();
        }