Exemplo n.º 1
0
        public async Task <BlogResponse> DeleteAsync(string id)
        {
            var response = new BlogResponse();

            var message = await _messages.FindAsync(id.ToObjectId());

            if (message is null)
            {
                response.IsFailed($"The message id not exists.");
                return(response);
            }

            if (message.Reply is not null)
            {
                if (message.Reply.Any())
                {
                    response.IsFailed($"The reply message is not empty.");
                    return(response);
                }
            }

            await _messages.DeleteAsync(id.ToObjectId());

            return(response);
        }
Exemplo n.º 2
0
        public async Task <BlogResponse <PostDetailDto> > GetPostByUrlAsync(string url)
        {
            return(await _cache.GetPostByUrlAsync(url, async() =>
            {
                var response = new BlogResponse <PostDetailDto>();

                var post = await _posts.FindAsync(x => x.Url == url);
                if (post is null)
                {
                    response.IsFailed($"The post url not exists.");
                    return response;
                }

                var previous = _posts.Where(x => x.CreatedAt > post.CreatedAt).Take(1).Select(x => new PostPagedDto
                {
                    Title = x.Title,
                    Url = x.Url
                }).FirstOrDefault();
                var next = _posts.Where(x => x.CreatedAt < post.CreatedAt).OrderByDescending(x => x.CreatedAt).Take(1).Select(x => new PostPagedDto
                {
                    Title = x.Title,
                    Url = x.Url
                }).FirstOrDefault();

                var result = ObjectMapper.Map <Post, PostDetailDto>(post);
                result.Previous = previous;
                result.Next = next;

                response.Result = result;
                return response;
            }));
Exemplo n.º 3
0
        public async Task <BlogResponse <string> > GenerateTokenAsync(string type, string code, string state)
        {
            var response = new BlogResponse <string>();

            if (!StateManager.IsExist(state))
            {
                response.IsFailed("Request failed.");
                return(response);
            }

            StateManager.Remove(state);

            var token = type switch
            {
                "github" => GenerateToken(await _githubService.GetUserByOAuthAsync(type, code, state)),
                "gitee" => GenerateToken(await _giteeService.GetUserByOAuthAsync(type, code, state)),
                "alipay" => GenerateToken(await _alipayService.GetUserByOAuthAsync(type, code, state)),
                "dingtalk" => GenerateToken(await _dingtalkService.GetUserByOAuthAsync(type, code, state)),
                "microsoft" => GenerateToken(await _microsoftService.GetUserByOAuthAsync(type, code, state)),
                "weibo" => GenerateToken(await _weiboService.GetUserByOAuthAsync(type, code, state)),
                "qq" => GenerateToken(await _qqService.GetUserByOAuthAsync(type, code, state)),
                _ => throw new NotImplementedException($"Not implemented:{type}")
            };

            response.IsSuccess(token);
            return(response);
        }
Exemplo n.º 4
0
        public async Task <BlogResponse> ReplyAsync(string id, ReplyMessageInput input)
        {
            var response = new BlogResponse();

            var message = await _messages.FindAsync(id.ToObjectId());

            if (message is null)
            {
                response.IsFailed($"The message id not exists.");
                return(response);
            }

            var reply = message.Reply ?? new List <MessageReply>();

            reply.Add(new MessageReply
            {
                Name    = input.Name,
                Content = input.Content,
                Avatar  = input.Avatar,
                UserId  = input.UserId
            });
            message.Reply = reply;

            await _messages.UpdateAsync(message);

            return(response);
        }
Exemplo n.º 5
0
        public async Task <BlogResponse> CreateUserAsync(CreateUserInput input)
        {
            var response = new BlogResponse();

            var user = await _users.FindAsync(x => x.Username == input.Username);

            if (user is not null)
            {
                response.IsFailed("The username already exists.");
                return(response);
            }

            input.Password = input.Password.ToMd5();
            await _users.InsertAsync(new User
            {
                Username = input.Username,
                Password = input.Password,
                Type     = input.Type,
                Identity = input.Identity,
                Name     = input.Name,
                Avatar   = input.Avatar,
                Email    = input.Email
            });

            return(response);
        }
Exemplo n.º 6
0
        public async Task <BlogResponse <List <string> > > Ip2RegionAsync(string ip)
        {
            var response = new BlogResponse <List <string> >();

            if (ip.IsNullOrEmpty())
            {
                ip = _httpContextAccessor.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault() ??
                     _httpContextAccessor.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault() ??
                     _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
            }
            else
            {
                if (!ip.IsIp())
                {
                    response.IsFailed("The ip address error.");
                    return(response);
                }
            }

            var path = Path.Combine(Directory.GetCurrentDirectory(), "Resources/ip2region.db");

            using var _search = new DbSearcher(path);
            var block = await _search.BinarySearchAsync(ip);

            var region = block.Region.Split("|").Distinct().Where(x => x != "0").ToList();

            region.AddFirst(ip);

            response.Result = region;
            return(response);
        }
Exemplo n.º 7
0
        public async Task <BlogResponse <string> > GenerateAsync(GenerateSignatureInput input)
        {
            return(await _cache.GenerateAsync(input, async() =>
            {
                var response = new BlogResponse <string>();

                var ip = _httpContextAccessor.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault() ??
                         _httpContextAccessor.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault() ??
                         _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();

                var type = Signature.KnownTypes.Dictionary.FirstOrDefault(x => x.Value == input.TypeId).Key;
                if (type.IsNullOrEmpty())
                {
                    response.IsFailed($"The signature type not exists.");
                    return response;
                }

                var signature = await _signatures.FindAsync(x => x.Name == input.Name && x.Type == type);
                if (signature is not null)
                {
                    response.Result = signature.Url;
                    return response;
                }

                var api = _signatureOptions.Urls
                          .OrderBy(x => GuidGenerator.Create())
                          .Select(x => new { Url = x.Key, Param = string.Format(x.Value, input.Name, input.TypeId) })
                          .FirstOrDefault();

                var content = new StringContent(api.Param);
                content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                using var client = _httpClient.CreateClient();
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
                var httpResponse = await client.PostAsync(api.Url, content);
                var httpResult = await httpResponse.Content.ReadAsStringAsync();

                var regex = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
                var imgUrl = regex.Match(httpResult).Groups["imgUrl"].Value;

                var url = $"{$"{input.Name}_{type}".ToMd5()}.png";
                var signaturePath = Path.Combine(_signatureOptions.Path, url);

                var imgBuffer = await client.GetByteArrayAsync(imgUrl);
                await imgBuffer.DownloadAsync(signaturePath);

                await _signatures.InsertAsync(new Signature
                {
                    Name = input.Name,
                    Type = type,
                    Url = url,
                    Ip = ip
                });

                response.Result = url;
                return response;
            }));
Exemplo n.º 8
0
        public async Task <BlogResponse <UserDto> > GetCurrentUserAsync()
        {
            var response = new BlogResponse <UserDto>();

            var claim = _principalAccessor.Principal.Claims?.FirstOrDefault((Claim c) => c.Type == ClaimTypes.NameIdentifier);

            if (claim == null || claim.Value.IsNullOrWhiteSpace())
            {
                response.IsFailed("Unauthorized.");
                return(response);
            }

            return(await GetUserAsync(claim.Value));
        }
Exemplo n.º 9
0
        public async Task <BlogResponse> CreateAsync(CreateInput input)
        {
            var response = new BlogResponse();

            if (!input.Content.Any())
            {
                response.IsFailed("The content list is null.");
                return(response);
            }
            await _sayings.InsertManyAsync(input.Content.Select(x => new Saying {
                Content = x.Trim()
            }));

            return(response);
        }
Exemplo n.º 10
0
        public void OnException(ExceptionContext context)
        {
            if (context.Exception != null)
            {
                var result = new BlogResponse();
                result.IsFailed(context.Exception.Message);

                context.Result = new ContentResult()
                {
                    Content    = result.SerializeToJson(),
                    StatusCode = StatusCodes.Status200OK
                };

                context.ExceptionHandled = true;
            }
        }
Exemplo n.º 11
0
        public async Task <BlogResponse> DeleteUserAsync(string id)
        {
            var response = new BlogResponse();

            var message = await _users.FindAsync(id.ToObjectId());

            if (message is null)
            {
                response.IsFailed($"The user id not exists.");
                return(response);
            }

            await _users.DeleteAsync(id.ToObjectId());

            return(response);
        }
Exemplo n.º 12
0
        public async Task <BlogResponse> DeleteCategoryAsync(string id)
        {
            var response = new BlogResponse();

            var category = await _categories.FindAsync(id.ToObjectId());

            if (category is null)
            {
                response.IsFailed($"The category id not exists.");
                return(response);
            }

            await _categories.DeleteAsync(id.ToObjectId());

            return(response);
        }
Exemplo n.º 13
0
        public async Task <BlogResponse> DeleteAsync(string id)
        {
            var response = new BlogResponse();

            var saying = await _sayings.FindAsync(id.ToObjectId());

            if (saying is null)
            {
                response.IsFailed($"The saying id not exists.");
                return(response);
            }

            await _sayings.DeleteAsync(id.ToObjectId());

            return(response);
        }
Exemplo n.º 14
0
        public async Task <BlogResponse> DeleteFriendLinkAsync(string id)
        {
            var response = new BlogResponse();

            var friendLink = await _friendLinks.FindAsync(id.ToObjectId());

            if (friendLink is null)
            {
                response.IsFailed($"The friendLink id not exists.");
                return(response);
            }

            await _friendLinks.DeleteAsync(id.ToObjectId());

            return(response);
        }
Exemplo n.º 15
0
        public async Task <BlogResponse> SettingAdminAsync(string id, bool isAdmin)
        {
            var response = new BlogResponse();

            var user = await _users.FindAsync(id.ToObjectId());

            if (user is null)
            {
                response.IsFailed("The user id is not exists.");
                return(response);
            }

            user.IsAdmin = isAdmin;
            await _users.UpdateAsync(user);

            return(response);
        }
Exemplo n.º 16
0
        public async Task <BlogResponse <UserDto> > GetUserAsync(string id)
        {
            var response = new BlogResponse <UserDto>();

            var user = await _users.FindAsync(id.ToObjectId());

            if (user is null)
            {
                response.IsFailed("The user id is not exists.");
                return(response);
            }

            var result = ObjectMapper.Map <User, UserDto>(user);

            response.IsSuccess(result);
            return(response);
        }
Exemplo n.º 17
0
        public async Task <BlogResponse> UpdatePasswordAsync(string id, string password)
        {
            var response = new BlogResponse();

            var user = await _users.FindAsync(id.ToObjectId());

            if (user is null)
            {
                response.IsFailed("The user id is not exists.");
                return(response);
            }

            user.Password = password.ToMd5();
            await _users.UpdateAsync(user);

            return(response);
        }
Exemplo n.º 18
0
        public async Task <BlogResponse <HotDto> > GetHotsAsync(string id)
        {
            return(await _cache.GetHotsAsync(id, async() =>
            {
                var response = new BlogResponse <HotDto>();

                var hot = await _hots.GetAsync(id.ToObjectId());
                if (hot is null)
                {
                    response.IsFailed($"The hot id not exists.");
                    return response;
                }

                var result = ObjectMapper.Map <Hot, HotDto>(hot);

                response.Result = result;
                return response;
            }));
Exemplo n.º 19
0
        public async Task <BlogResponse> DeleteReplyAsync(string id, string replyId)
        {
            var response = new BlogResponse();

            var message = await _messages.FindAsync(id.ToObjectId());

            if (message is null)
            {
                response.IsFailed($"The message id not exists.");
                return(response);
            }

            message.Reply = message.Reply?.Where(x => x.Id != replyId.ToObjectId()).ToList();

            await _messages.UpdateAsync(message);

            return(response);
        }
Exemplo n.º 20
0
        public async Task <BlogResponse <PostDto> > GetPostAsync(string id)
        {
            var response = new BlogResponse <PostDto>();

            var post = await _posts.FindAsync(id.ToObjectId());

            if (post is null)
            {
                response.IsFailed($"The post id not exists.");
                return(response);
            }

            var result = ObjectMapper.Map <Post, PostDto>(post);

            result.Url = result.Url.Split("-").Last();

            response.Result = result;
            return(response);
        }
Exemplo n.º 21
0
        public async Task <BlogResponse> UpdateTagAsync(string id, UpdateTagInput input)
        {
            var response = new BlogResponse();

            var tag = await _tags.FindAsync(id.ToObjectId());

            if (tag is null)
            {
                response.IsFailed($"The tag id not exists.");
                return(response);
            }

            tag.Name  = input.Name;
            tag.Alias = input.Alias;

            await _tags.UpdateAsync(tag);

            return(response);
        }
Exemplo n.º 22
0
        public async Task <BlogResponse> UpdateFriendLinkAsync(string id, UpdateFriendLinkInput input)
        {
            var response = new BlogResponse();

            var friendLink = await _friendLinks.FindAsync(id.ToObjectId());

            if (friendLink is null)
            {
                response.IsFailed($"The friendLink id not exists.");
                return(response);
            }

            friendLink.Name = input.Name;
            friendLink.Url  = input.Url;

            await _friendLinks.UpdateAsync(friendLink);

            return(response);
        }
Exemplo n.º 23
0
        public async Task <BlogResponse <string> > GenerateTokenAsync([Required] string code)
        {
            var response = new BlogResponse <string>();

            var cacheCode = await _authorizeCacheService.GetAuthorizeCodeAsync();

            if (code != cacheCode)
            {
                response.IsFailed("The authorization code is wrong.");
                return(response);
            }

            var user = await _userService.GetDefaultUserAsync();

            var token = GenerateToken(user);

            response.IsSuccess(token);
            return(response);
        }
Exemplo n.º 24
0
        public async Task <BlogResponse> UpdateCategoryAsync(string id, UpdateCategoryInput input)
        {
            var response = new BlogResponse();

            var category = await _categories.FindAsync(id.ToObjectId());

            if (category is null)
            {
                response.IsFailed($"The category id not exists.");
                return(response);
            }

            category.Name  = input.Name;
            category.Alias = input.Alias;

            await _categories.UpdateAsync(category);

            return(response);
        }
Exemplo n.º 25
0
        public async Task <BlogResponse> CreateFriendLinkAsync(CreateFriendLinkInput input)
        {
            var response = new BlogResponse();

            var friendLink = await _friendLinks.FindAsync(x => x.Name == input.Name);

            if (friendLink is not null)
            {
                response.IsFailed($"The friendLink:{input.Name} already exists.");
                return(response);
            }

            await _friendLinks.InsertAsync(new FriendLink
            {
                Name = input.Name,
                Url  = input.Url
            });

            return(response);
        }
Exemplo n.º 26
0
        public async Task <BlogResponse> UpdateUserAsync(string id, UpdateUserinput input)
        {
            var response = new BlogResponse();

            var user = await _users.FindAsync(id.ToObjectId());

            if (user is null)
            {
                response.IsFailed("The user id is not exists.");
                return(response);
            }

            user.Username = input.Username;
            user.Name     = input.Name;
            user.Avatar   = input.Avatar;
            user.Email    = input.Email;
            await _users.UpdateAsync(user);

            return(response);
        }
Exemplo n.º 27
0
        public async Task <BlogResponse> CreateCategoryAsync(CreateCategoryInput input)
        {
            var response = new BlogResponse();

            var category = await _categories.FindAsync(x => x.Name == input.Name);

            if (category is not null)
            {
                response.IsFailed($"The category:{input.Name} already exists.");
                return(response);
            }

            await _categories.InsertAsync(new Category
            {
                Name  = input.Name,
                Alias = input.Alias
            });

            return(response);
        }
Exemplo n.º 28
0
        public async Task <BlogResponse> CreateTagAsync(CreateTagInput input)
        {
            var response = new BlogResponse();

            var tag = await _tags.FindAsync(x => x.Name == input.Name);

            if (tag is not null)
            {
                response.IsFailed($"The tag:{input.Name} already exists.");
                return(response);
            }

            await _tags.InsertAsync(new Tag
            {
                Name  = input.Name,
                Alias = input.Alias
            });

            return(response);
        }
Exemplo n.º 29
0
        private void ConfigureAuthentication(IServiceCollection services)
        {
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer           = true,
                    ValidateAudience         = true,
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime         = true,
                    RequireExpirationTime    = true,
                    ValidIssuer      = AppOptions.Jwt.Issuer,
                    ValidAudience    = AppOptions.Jwt.Audience,
                    IssuerSigningKey = new SymmetricSecurityKey(AppOptions.Jwt.SigningKey.GetBytes())
                };
                options.Events = new JwtBearerEvents
                {
                    OnChallenge = async context =>
                    {
                        context.HandleResponse();
                        context.Response.ContentType = "application/json;charset=utf-8";
                        context.Response.StatusCode  = StatusCodes.Status401Unauthorized;

                        var response = new BlogResponse();
                        response.IsFailed("Unauthorized");

                        await context.Response.WriteAsJsonAsync(response);
                    },
                    OnMessageReceived = async context =>
                    {
                        context.Token = context.Request.Query["token"];

                        await Task.CompletedTask;
                    }
                };
            });
            services.AddAuthorization();
        }
Exemplo n.º 30
0
        public async Task <BlogResponse> UpdatePostAsync(string id, UpdatePostInput input)
        {
            var response = new BlogResponse();

            var post = await _posts.FindAsync(id.ToObjectId());

            if (post is null)
            {
                response.IsFailed($"The post id not exists.");
                return(response);
            }

            var tags = await _tags.GetListAsync();

            var newTags = input.Tags.Where(item => !tags.Any(x => x.Name == item)).Select(x => new Tag
            {
                Name  = x,
                Alias = x.ToLower()
            });

            if (newTags.Any())
            {
                await _tags.InsertManyAsync(newTags);
            }

            post.Title    = input.Title;
            post.Author   = input.Author;
            post.Url      = input.Url.GeneratePostUrl(input.CreatedAt.ToDateTime());
            post.Markdown = input.Markdown;
            post.Category = await _categories.GetAsync(input.CategoryId.ToObjectId());

            post.Tags = await _tags.GetListAsync(input.Tags);

            post.CreatedAt = input.CreatedAt.ToDateTime();
            await _posts.UpdateAsync(post);

            return(response);
        }