示例#1
0
    public Result <GetProjectsSettings> GetProjectsSettings()
    {
        using var session     = _apiDatabase.SessionFactory().OpenSession();
        using var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);

        var settings = session
                       .Query <ProjectsSettingsRecord>()
                       .SingleOrDefault();

        if (settings == null)
        {
            return(Result <GetProjectsSettings> .Failure("Unable to retrieve the projects settings."));
        }

        var displayOrder = session
                           .Query <ProjectRecord>()
                           .Where(x => settings.DisplayOrder.Contains(x.Reference))
                           .ToList();

        transaction.Commit();

        return(Result <GetProjectsSettings> .Of(new GetProjectsSettings
        {
            DisplayOrder = displayOrder
                           .OrderBy(x => settings.DisplayOrder.IndexOf(x.Reference))
                           .Select(x => new GetProjectsSettings.ProjectDisplayOrder
            {
                Reference = x.Reference,
                Title = x.Title
            })
                           .ToList()
        }));
    }
示例#2
0
    public Result <SearchBlogResponse> SearchBlog(int page)
    {
        const int pageSize = 6;

        using var session     = _apiDatabase.SessionFactory().OpenSession();
        using var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);

        var query = session
                    .Query <BlogPostRecord>()
                    .ToFuture();

        var total = query.Count();

        var posts = query
                    .OrderByDescending(x => x.PostedAt)
                    .Skip((page - 1) * pageSize)
                    .Take(pageSize)
                    .ToList();

        transaction.Commit();

        return(Result <SearchBlogResponse> .Of(new SearchBlogResponse
        {
            Total = total,
            PageSize = pageSize,
            Posts = posts.ConvertAll(x => new SearchBlogResponse.Post
            {
                Reference = x.Reference,
                Title = x.Title,
                UrlSlug = x.UrlSlug,
                PostedAt = x.PostedAt,
                Summary = x.Summary,
                Content = x.Content
            })
        }));
    }
示例#3
0
    public Result <GetUserByResponse> GetUserByReference(Guid reference)
    {
        using var session     = _apiDatabase.SessionFactory().OpenSession();
        using var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);

        var user = session
                   .Query <UserRecord>()
                   .SingleOrDefault(x => x.Reference == reference);

        if (user == null)
        {
            return(Result <GetUserByResponse> .Failure($"Unable to find user with the given reference: {reference}."));
        }

        transaction.Commit();

        return(Result <GetUserByResponse> .Of(new GetUserByResponse
        {
            Reference = user.Reference,
            Username = user.Username,
            CreatedAt = user.CreatedAt,
            Type = user.Type
        }));
    }
示例#4
0
    public Result <LogInResponse> LogIn(LogInRequest request)
    {
        using var session     = _apiDatabase.SessionFactory().OpenSession();
        using var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);

        var user = session
                   .Query <UserRecord>()
                   .SingleOrDefault(x => x.Username.ToLower() == request.Username.ToLower());

        if (user == null)
        {
            return(Result <LogInResponse> .Failure($"Unable to log in, the given user could not be found with username: {request.Username}."));
        }

        var isPasswordValid = _passwordService.VerifyPassword(request.Password, user.Password, user.PasswordSalt);

        if (!isPasswordValid)
        {
            return(Result <LogInResponse> .Failure("Unable to log in, the given credentials we incorrect."));
        }

        var expiresAt = DateTimeOffset.UtcNow.AddDays(1).ToUnixTimeSeconds();

        var jwtResult = _jwtService.Create(new RequestContext
        {
            UserReference = user.Reference,
            UserType      = user.Type
        }, expiresAt);

        if (jwtResult.IsFailure)
        {
            return(Result <LogInResponse> .From(jwtResult));
        }

        return(Result <LogInResponse> .Of(new LogInResponse
        {
            Jwt = jwtResult.Value,
            ExpiresAt = expiresAt,
            User = new LogInResponse.UserDetails
            {
                Reference = user.Reference,
                Type = user.Type
            }
        }));
    }
示例#5
0
    public Result <SearchProjectsResponse> SearchProjects(int page)
    {
        const int pageSize = 6;

        using var session     = _apiDatabase.SessionFactory().OpenSession();
        using var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);

        var query = session
                    .Query <ProjectRecord>()
                    .ToFuture();

        var total = query.Count();

        var tagFrequencies = query
                             .SelectMany(x => x.Tags)
                             .GroupBy(x => x.ToLower())
                             .Select(x => new SearchProjectsResponse.TagFrequency
        {
            Tag       = x.First(),
            Frequency = x.Count()
        })
                             .OrderByDescending(x => x.Frequency)
                             .ThenBy(x => x.Tag)
                             .ToList();

        var settings = session
                       .Query <ProjectsSettingsRecord>()
                       .SingleOrDefault();

        if (settings == null)
        {
            return(Result <SearchProjectsResponse> .Failure("Unable to retrieve the projects settings."));
        }

        var projects = query
                       .OrderBy(x => settings.DisplayOrder.IndexOf(x.Reference))
                       .Skip((page - 1) * pageSize)
                       .Take(pageSize)
                       .ToList();

        transaction.Commit();

        return(Result <SearchProjectsResponse> .Of(new SearchProjectsResponse
        {
            Total = total,
            PageSize = pageSize,
            Projects = projects.ConvertAll(x => new SearchProjectsResponse.Project
            {
                Reference = x.Reference,
                Title = x.Title,
                UrlSlug = x.UrlSlug,
                StartedAt = x.StartedAt,
                Summary = x.Summary,
                SourceCodeUrl = x.SourceCodeUrl,
                PreviewImageUrl = x.PreviewImageUrl,
                DisplayOrder = x.DisplayOrder,
                CreatedAt = x.CreatedAt,
                ViewUrl = x.ViewUrl,
                Tags = x.Tags.OrderBy(t => t).ToList()
            }),
            TagFrequencies = tagFrequencies
        }));
    }