Changes in / [8b6791f:81c2e6f]


Ignore:
Location:
src
Files:
1 added
19 deleted
29 edited

Legend:

Unmodified
Added
Removed
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts

    r8b6791f r81c2e6f  
    55import { catchError, filter, map } from 'rxjs/operators';
    66
    7 import { PreviewQuestionsOrderEnum, PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
    8 import {
    9   EffectStartedWorking,
    10   GetPreviewQuestionsLatest,
    11   GetPreviewQuestionsPopular,
    12   GetQuestionState
    13 } from './question-state/question.actions';
     7import { QuestionStateViewModel } from 'src/app/shared-app/models';
     8import { EffectStartedWorking, GetQuestionState } from './question-state/question.actions';
    149import { questionStateQuery } from './question-state/question.selectors';
    1510import { QuestionState } from './question-state/question.state';
     
    4338  }
    4439
    45   public getPreviewQuestionsLatest(): Observable<PreviewQuestionViewModel[]> {
    46     return this.store.select(questionStateQuery.getPreviewQuestionsLatest);
    47   }
    48 
    49   public getPreviewQuestionsPopular(): Observable<PreviewQuestionViewModel[]> {
    50     return this.store.select(questionStateQuery.getPreviewQuestionsPopular);
    51   }
    52 
    53   public fetchPreviewQuestions(orderBy: PreviewQuestionsOrderEnum): void {
    54     if (orderBy === PreviewQuestionsOrderEnum.Latest) {
    55       this.fetchPreviewQuestionsLatest();
    56     } else if (orderBy === PreviewQuestionsOrderEnum.Popular) {
    57       this.fetchPreviewQuestionsPopular();
    58     }
    59   }
    60 
    6140  public fetchQuestion(questionUid: string): void {
    6241    this.dispatchEffect(new GetQuestionState(questionUid));
    63   }
    64 
    65   private fetchPreviewQuestionsLatest(): void {
    66     this.dispatchEffect(new GetPreviewQuestionsLatest());
    67   }
    68 
    69   private fetchPreviewQuestionsPopular(): void {
    70     this.dispatchEffect(new GetPreviewQuestionsPopular());
    7142  }
    7243
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state.models.ts

    r8b6791f r81c2e6f  
    5959  public reputation!: number;
    6060}
    61 
    62 export class PreviewQuestionResponse {
    63   public uid!: string;
    64   public title!: string;
    65   public createdOn!: moment.Moment;
    66   public views!: number;
    67   public answersCount!: number;
    68   public categories!: PreviewQuestionCategoryResponse[];
    69 }
    70 
    71 export class PreviewQuestionCategoryResponse {
    72   public uid!: string;
    73   public text!: string;
    74 }
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts

    r8b6791f r81c2e6f  
    22import { Action } from '@ngrx/store';
    33
    4 import { PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
    5 import { PreviewQuestionResponse } from './question-state.models';
     4import { QuestionStateViewModel } from 'src/app/shared-app/models';
    65
    76export enum QuestionActionTypes {
    87  GetQuestionState = '[Question] Get state',
    98  GetQuestionStateSuccess = '[Question] Get state success',
    10   GetPreviewQuestionsLatest = '[Question] Get preview questions Latest',
    11   GetPreviewQuestionsLatestSuccess = '[Question] Get preview questions Latest Success',
    12   GetPreviewQuestionsPopular = '[Question] Get preview questions Popular',
    13   GetPreviewQuestionsPopularSuccess = '[Question] Get preview questions Popular Success',
    149  EffectStartedWorking = '[Question] Effect Started Working',
    1510  EffectFinishedWorking = '[Question] Effect Finished Working',
     
    2722
    2823  constructor(public payload: QuestionStateViewModel) {}
    29 }
    30 
    31 export class GetPreviewQuestionsLatest implements Action {
    32   readonly type = QuestionActionTypes.GetPreviewQuestionsLatest;
    33 
    34   constructor() {}
    35 }
    36 
    37 export class GetPreviewQuestionsLatestSuccess implements Action {
    38   readonly type = QuestionActionTypes.GetPreviewQuestionsLatestSuccess;
    39 
    40   constructor(public payload: PreviewQuestionViewModel[]) {}
    41 }
    42 
    43 export class GetPreviewQuestionsPopular implements Action {
    44   readonly type = QuestionActionTypes.GetPreviewQuestionsPopular;
    45 
    46   constructor() {}
    47 }
    48 
    49 export class GetPreviewQuestionsPopularSuccess implements Action {
    50   readonly type = QuestionActionTypes.GetPreviewQuestionsPopularSuccess;
    51 
    52   constructor(public payload: PreviewQuestionViewModel[]) {}
    5324}
    5425
     
    7142}
    7243
    73 export type QuestionAction =
    74   | GetQuestionStateSuccess
    75   | GetPreviewQuestionsLatestSuccess
    76   | GetPreviewQuestionsPopularSuccess
    77   | EffectStartedWorking
    78   | EffectFinishedWorking
    79   | EffectFinishedWorkingError;
     44export type QuestionAction = GetQuestionStateSuccess | EffectStartedWorking | EffectFinishedWorking | EffectFinishedWorkingError;
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts

    r8b6791f r81c2e6f  
    11import { Injectable } from '@angular/core';
    22import { Actions, createEffect, ofType } from '@ngrx/effects';
    3 import { catchError, filter, switchMap, withLatestFrom } from 'rxjs/operators';
    4 import { PreviewQuestionsOrderEnum } from 'src/app/shared-app/models';
    5 import { TranslateFromJsonService } from 'src/app/shared-app/services';
     3import { catchError, switchMap } from 'rxjs/operators';
    64
    75import { BaseApiService } from 'src/app/shared-app/services/base-api.service';
    8 import { QuestionFacadeService } from '../question-facade.service';
    9 import { PreviewQuestionResponse, QuestionStateResponse } from './question-state.models';
     6import { QuestionStateResponse } from './question-state.models';
    107import {
    118  EffectFinishedWorking,
    129  EffectFinishedWorkingError,
    13   GetPreviewQuestionsLatestSuccess,
    14   GetPreviewQuestionsPopularSuccess,
    1510  GetQuestionState,
    1611  GetQuestionStateSuccess,
     
    2318})
    2419export class QuestionEffects {
    25   constructor(
    26     private actions$: Actions,
    27     private api: BaseApiService,
    28     private translate: TranslateFromJsonService,
    29     private facade: QuestionFacadeService
    30   ) {}
     20  constructor(private actions$: Actions, private api: BaseApiService) {}
    3121
    3222  getQuestionState$ = createEffect(() => {
     
    4131    );
    4232  });
    43 
    44   getPreviewQuestionsLatest$ = createEffect(() => {
    45     return this.actions$.pipe(
    46       ofType<GetQuestionState>(QuestionActionTypes.GetPreviewQuestionsLatest),
    47       withLatestFrom(this.facade.getPreviewQuestionsLatest()),
    48       filter(([action, questions]) => questions.length === 0),
    49       switchMap((action) => {
    50         return this.api.get<PreviewQuestionResponse[]>(`v1/questions/preview?order=${PreviewQuestionsOrderEnum.Latest}`).pipe(
    51           switchMap((state) => [
    52             new GetPreviewQuestionsLatestSuccess(QuestionMapper.ToPreviwQuestionsViewModel(state, this.translate)),
    53             new EffectFinishedWorking()
    54           ]),
    55           catchError((err) => [new EffectFinishedWorkingError(err)])
    56         );
    57       })
    58     );
    59   });
    60 
    61   getPreviewQuestionsPopular$ = createEffect(() => {
    62     return this.actions$.pipe(
    63       ofType<GetQuestionState>(QuestionActionTypes.GetPreviewQuestionsPopular),
    64       withLatestFrom(this.facade.getPreviewQuestionsPopular()),
    65       filter(([action, questions]) => questions.length === 0),
    66       switchMap((action) => {
    67         return this.api.get<PreviewQuestionResponse[]>(`v1/questions/preview?order=${PreviewQuestionsOrderEnum.Popular}`).pipe(
    68           switchMap((state) => [
    69             new GetPreviewQuestionsPopularSuccess(QuestionMapper.ToPreviwQuestionsViewModel(state, this.translate)),
    70             new EffectFinishedWorking()
    71           ]),
    72           catchError((err) => [new EffectFinishedWorkingError(err)])
    73         );
    74       })
    75     );
    76   });
    7733}
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts

    r8b6791f r81c2e6f  
    55  AnswerResponseStudentQuestionStateViewModel,
    66  AnswerStudentQuestionStateViewModel,
    7   PreviewQuestionCategoryViewModel,
    8   PreviewQuestionViewModel,
    97  QuestionCategoryQuestionStateViewModel,
    108  QuestionStateViewModel,
     
    1210  TeamQuestionStateViewModel
    1311} from 'src/app/shared-app/models';
    14 import { TranslateFromJsonService } from 'src/app/shared-app/services';
    15 import { PreviewQuestionCategoryResponse, PreviewQuestionResponse, QuestionStateResponse } from './question-state.models';
     12import { QuestionStateResponse } from './question-state.models';
    1613
    1714export class QuestionMapper {
     
    8784    );
    8885  }
    89 
    90   public static ToPreviwQuestionsViewModel(
    91     previewQuestionsResponse: PreviewQuestionResponse[],
    92     translate: TranslateFromJsonService
    93   ): PreviewQuestionViewModel[] {
    94     let questions = new Array<PreviewQuestionViewModel>();
    95 
    96     if (previewQuestionsResponse.length > 0) {
    97       questions = previewQuestionsResponse.map((x) => {
    98         let categories = new Array<PreviewQuestionCategoryViewModel>();
    99 
    100         if (x.categories.length > 0) {
    101           categories = x.categories.map((y) => new PreviewQuestionCategoryViewModel(y.uid, y.text, translate.instant(y.text)));
    102         }
    103 
    104         return new PreviewQuestionViewModel(x.uid, x.title, moment(x.createdOn), x.views, x.answersCount, categories);
    105       });
    106     }
    107 
    108     return questions;
    109   }
    11086}
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts

    r8b6791f r81c2e6f  
    88        ...state,
    99        question: action.payload
    10       };
    11     case QuestionActionTypes.GetPreviewQuestionsLatestSuccess:
    12       return {
    13         ...state,
    14         previewQuestionsLatest: action.payload
    15       };
    16     case QuestionActionTypes.GetPreviewQuestionsPopularSuccess:
    17       return {
    18         ...state,
    19         previewQuestionsPopular: action.payload
    2010      };
    2111    case QuestionActionTypes.EffectStartedWorking: {
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.selectors.ts

    r8b6791f r81c2e6f  
    55
    66const getQuestion = createSelector(getQuestionState, (state) => state.question);
    7 const getPreviewQuestionsLatest = createSelector(getQuestionState, (state) => state.previewQuestionsLatest);
    8 const getPreviewQuestionsPopular = createSelector(getQuestionState, (state) => state.previewQuestionsPopular);
    97const effectWorking = createSelector(getQuestionState, (state) => state.effectWorking);
    108
    119export const questionStateQuery = {
    1210  effectWorking,
    13   getQuestion,
    14   getPreviewQuestionsLatest,
    15   getPreviewQuestionsPopular
     11  getQuestion
    1612};
  • src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.state.ts

    r8b6791f r81c2e6f  
    11import { HttpErrorResponse } from '@angular/common/http';
    2 import { PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
     2import { QuestionStateViewModel } from 'src/app/shared-app/models';
    33
    44export const questionStateKey = 'question';
     
    66export interface QuestionState {
    77  question: QuestionStateViewModel | null;
    8   previewQuestionsLatest: PreviewQuestionViewModel[];
    9   previewQuestionsPopular: PreviewQuestionViewModel[];
    108  effectWorking: boolean | HttpErrorResponse;
    119}
     
    1311export const initialState: QuestionState = {
    1412  question: null,
    15   previewQuestionsLatest: [],
    16   previewQuestionsPopular: [],
    1713  effectWorking: false
    1814};
  • src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questioning-components.ts

    r8b6791f r81c2e6f  
    11import { QuestionPreviewGeneralComponent } from './question-preview-general/question-preview-general.component';
    2 import { QuestioningGeneralComponent } from './questioning-general/questioning-general.component';
    32import { QuestionsPreviewGeneralComponent } from './questions-preview-general/questions-preview-general.component';
    43
    5 export const QUESTIONING_COMPONENTS: any[] = [
    6   QuestionPreviewGeneralComponent,
    7   QuestionsPreviewGeneralComponent,
    8   QuestioningGeneralComponent
    9 ];
     4export const QUESTIONING_COMPONENTS: any[] = [QuestionPreviewGeneralComponent, QuestionsPreviewGeneralComponent];
  • src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.html

    r8b6791f r81c2e6f  
    1 <app-search-question></app-search-question>
    2 <div class="margin-x-lg">
    3   <h1 class="mat-headline">{{ 'questions-preview' | translate }}</h1>
    4   <mat-button-toggle-group [formControl]="questionsSortByForm">
    5     <mat-button-toggle [value]="QuestionsSortBy.Latest">{{ 'question-sort-newest' | translate }}</mat-button-toggle>
    6     <mat-button-toggle [value]="QuestionsSortBy.Popular">{{ 'question-sort-popular' | translate }}</mat-button-toggle>
    7   </mat-button-toggle-group>
    8 </div>
    9 <app-preview-question-display
    10   *ngFor="let question of previewQuestions$ | async"
    11   [question]="question"
    12   (questionClicked)="goToQuestion(question.uid)"
    13 ></app-preview-question-display>
     1<p>questions-preview-general works!</p>
  • src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.ts

    r8b6791f r81c2e6f  
    11import { Component, OnInit } from '@angular/core';
    2 import { FormControl } from '@angular/forms';
    3 import { Router } from '@angular/router';
    42import { CategoryFacadeService } from 'src/app/core/state/category-facade.service';
    5 import { QuestionFacadeService } from 'src/app/core/state/question-facade.service';
    6 import { CategoryStateViewModel, PreviewQuestionsOrderEnum } from 'src/app/shared-app/models';
    73
    84@Component({
     
    128})
    139export class QuestionsPreviewGeneralComponent implements OnInit {
    14   categories?: CategoryStateViewModel[];
    15   previewQuestions$ = this.questionFacade.getPreviewQuestionsLatest();
    16   QuestionsSortBy = PreviewQuestionsOrderEnum;
    17   questionsSortByForm = new FormControl(PreviewQuestionsOrderEnum.Latest);
    18 
    19   constructor(private categoriesFacade: CategoryFacadeService, private questionFacade: QuestionFacadeService, private router: Router) {}
     10  constructor(private categoriesFacade: CategoryFacadeService) {}
    2011
    2112  ngOnInit(): void {
    2213    this.categoriesFacade.fetchCategories();
    23     this.questionFacade.fetchPreviewQuestions(PreviewQuestionsOrderEnum.Latest);
    24     this.questionsSortByForm.valueChanges.subscribe((value: PreviewQuestionsOrderEnum) => {
    25       this.questionFacade.fetchPreviewQuestions(value);
    26 
    27       if (value === PreviewQuestionsOrderEnum.Latest) {
    28         this.previewQuestions$ = this.questionFacade.getPreviewQuestionsLatest();
    29       } else if (value === PreviewQuestionsOrderEnum.Popular) {
    30         this.previewQuestions$ = this.questionFacade.getPreviewQuestionsPopular();
    31       }
    32     });
    33   }
    34 
    35   goToQuestion(uid: string): void {
    36     this.router.navigateByUrl(`questioning/${uid}`);
    3714  }
    3815}
  • src/Clients/Angular/finki-chattery/src/app/modules/questioning/questioning.routes.ts

    r8b6791f r81c2e6f  
    22import { Routes, RouterModule } from '@angular/router';
    33import { QuestionPreviewGeneralComponent } from './components/question-preview-general/question-preview-general.component';
    4 import { QuestioningGeneralComponent } from './components/questioning-general/questioning-general.component';
    54import { QuestionsPreviewGeneralComponent } from './components/questions-preview-general/questions-preview-general.component';
    65
    76const routes: Routes = [
    87  {
    9     component: QuestioningGeneralComponent,
    10     path: '',
    11     children: [
    12       {
    13         path: 'preview',
    14         pathMatch: 'full',
    15         component: QuestionsPreviewGeneralComponent
    16       },
    17       {
    18         path: ':questionUid',
    19         component: QuestionPreviewGeneralComponent
    20       }
    21     ]
     8    path: 'preview',
     9    pathMatch: 'full',
     10    component: QuestionsPreviewGeneralComponent
     11  },
     12  {
     13    path: ':questionUid',
     14    component: QuestionPreviewGeneralComponent
    2215  }
    2316];
  • src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts

    r8b6791f r81c2e6f  
    44import { HeaderComponent } from './generic/header/header.component';
    55import { VoteComponent } from './generic/vote/vote.component';
    6 import { PreviewQuestionDisplayComponent } from './question/preview-question-display/preview-question-display.component';
    76import { QuestionPreviewComponent } from './question/question-preview/question-preview.component';
    8 import { SearchQuestionComponent } from './question/search-question/search-question.component';
    97import { StudentCardComponent } from './question/student-card/student-card.component';
    108
     
    1614  VoteComponent,
    1715  StudentCardComponent,
    18   HeaderComponent,
    19   SearchQuestionComponent,
    20   PreviewQuestionDisplayComponent
     16  HeaderComponent
    2117];
  • src/Clients/Angular/finki-chattery/src/app/shared-app/models/index.ts

    r8b6791f r81c2e6f  
    33export * from './question-state-view-models.models';
    44export * from './category-state-view-models.models';
    5 export * from './question-state-enums.models';
  • src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts

    r8b6791f r81c2e6f  
    5454  constructor(public uid: string, public index: string, public imageUrl: string, public reputation: number) {}
    5555}
    56 
    57 export class PreviewQuestionViewModel {
    58   constructor(
    59     public uid: string,
    60     public title: string,
    61     public createdOn: moment.Moment,
    62     public views: number,
    63     public answersCount: number,
    64     public categories: PreviewQuestionCategoryViewModel[]
    65   ) {}
    66 }
    67 
    68 export class PreviewQuestionCategoryViewModel {
    69   constructor(public uid: string, public text: string, public nameTranslated: string) {}
    70 }
  • src/Clients/Angular/finki-chattery/src/app/shared-app/pipes/moment-date.pipe.ts

    r8b6791f r81c2e6f  
    66})
    77export class MomentDatePipe implements PipeTransform {
    8   transform(value: moment.Moment | undefined | null, dateFormat: string): any {
     8  transform(value: moment.Moment, dateFormat: string): any {
    99    return moment(value).format(dateFormat);
    1010  }
  • src/Clients/Angular/finki-chattery/src/app/shared-material/shared-material.module.ts

    r8b6791f r81c2e6f  
    2323import { MatTooltipModule } from '@angular/material/tooltip';
    2424import { MatButtonToggleModule } from '@angular/material/button-toggle';
    25 import { MatBadgeModule } from '@angular/material/badge';
    2625
    2726@NgModule({
     
    4847    MatChipsModule,
    4948    MatTooltipModule,
    50     MatButtonToggleModule,
    51     MatBadgeModule
     49    MatButtonToggleModule
    5250  ],
    5351  exports: [
     
    7270    MatChipsModule,
    7371    MatTooltipModule,
    74     MatButtonToggleModule,
    75     MatBadgeModule
     72    MatButtonToggleModule
    7673  ]
    7774})
  • src/Clients/Angular/finki-chattery/src/assets/translations/en.json

    r8b6791f r81c2e6f  
    2828  "software-engineering": "Software engineering",
    2929  "visual-programming": "Visual programming",
    30   "operating-systems": "Operating systems",
    31   "internet-programming": "Internet programming",
    32   "object-oriented-programming": "Object oriented programming",
    33   "calculus": "Calculus",
    34   "discrete-mathematics": "Discrete mathematics",
    35   "web-programming": "Web programming",
    36   "advanced-programming": "Advanced programming",
    37   "questions-preview-find-question": "Search for a question",
    38   "questions-preview-find-question-categories": "Search in categories",
    39   "questions-search": "Search",
    40   "questions-preview": "Preview questions",
    41   "question-sort-newest": "Newest",
    42   "question-sort-popular": "Most popular",
    43   "questions-preview-question-subtitle": "Asked on: {{date}}",
    44   "questions-preview-question-answers": "Answers",
    45   "questions-preview-question-views": "Views"
     30  "operating-systems": "Operating systems"
    4631}
  • src/Clients/Angular/finki-chattery/src/styles.scss

    r8b6791f r81c2e6f  
    285285  z-index: 1100 !important;
    286286}
    287 
    288 .full-width {
    289   width: 100%;
    290 }
  • src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/CategoryMapper.cs

    r8b6791f r81c2e6f  
    1 using FinkiChattery.Contracts.Questioning;
     1using FinkiChattery.Contracts.Questioning.GetCategories;
    22using FinkiChattery.Persistence.Models;
    33using System.Collections.Generic;
     
    88    public static class CategoryMapper
    99    {
    10         public static List<CategoryResponse> ToCategoryDtos(this IEnumerable<Category> categories)
     10        public static List<CategoryDto> ToCategoryDtos(this IEnumerable<Category> categories)
    1111        {
    12             var categoryDtos = new List<CategoryResponse>();
     12            var categoryDtos = new List<CategoryDto>();
    1313
    1414            if (categories.Any())
    1515            {
    16                 categoryDtos = categories.Select(x => new CategoryResponse(x.Uid, x.Name)).ToList();
     16                categoryDtos = categories.Select(x => new CategoryDto(x.Uid, x.Name)).ToList();
    1717            }
    1818
  • src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs

    r8b6791f r81c2e6f  
    11#nullable enable
    22
    3 using FinkiChattery.Contracts.Questioning;
     3using FinkiChattery.Contracts.Questioning.GetQuestionState;
    44using FinkiChattery.Persistence.Repositories.Contracts;
    55using System.Collections.Generic;
     
    1010    public static class QuestionMapper
    1111    {
    12         public static List<PreviewQuestionResponse> ToPreviewQuestionsResponse(this IEnumerable<QuestionPreviewDto> questions)
    13         {
    14             var questionsResponse = new List<PreviewQuestionResponse>();
    15 
    16             if (questions.Any())
    17             {
    18                 questionsResponse = questions.Select(x =>
    19                 {
    20                     var questionCategoriesResponse = new List<PreviewQuestionCategoryResponse>();
    21 
    22                     if (x.Categories.Any())
    23                     {
    24                         questionCategoriesResponse = x.Categories.Select(y => new PreviewQuestionCategoryResponse(y.Id, y.Uid, y.Text)).ToList();
    25                     }
    26 
    27                     return new PreviewQuestionResponse(x.Id, x.Uid, x.Title, x.Views, x.AnswersCount, x.CreatedOn, questionCategoriesResponse);
    28                 }).ToList();
    29             }
    30 
    31             return questionsResponse;
    32         }
    33 
    3412        public static QuestionStateResponse ToQuestionStateResponse(this QuestionStateDto questionState)
    3513        {
  • src/FinkiChattery/FinkiChattery.Api/Controllers/v1/QuestionsController.cs

    r8b6791f r81c2e6f  
    4040            return Ok(questionDto.ToQuestionStateResponse());
    4141        }
    42 
    43         [HttpGet("preview")]
    44         [Authorize]
    45         public async Task<IActionResult> PreviewQuestions([FromQuery] GetPreviewQuestionsOrderEnum order)
    46         {
    47             var questions = await MediatorService.SendQueryAsync(new GetPreviewQuestionsQuery(order));
    48             return Ok(questions.ToPreviewQuestionsResponse());
    49         }
    5042    }
    5143}
  • src/FinkiChattery/FinkiChattery.Contracts/Questioning/GetQuestionState/QuestionStateResponse.cs

    r8b6791f r81c2e6f  
    55using System.Text.Json.Serialization;
    66
    7 namespace FinkiChattery.Contracts.Questioning
     7namespace FinkiChattery.Contracts.Questioning.GetQuestionState
    88{
    99    public class QuestionStateResponse
  • src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Question/Question.Debug.Seed.sql

    r8b6791f r81c2e6f  
    99        VALUES
    1010            (1, N'aee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Question 1', 'Question 1 text', 1, GETUTCDATE(), NULL, 0,
    11              GETUTCDATE(), 2
     11             GETUTCDATE()
    1212            ),
    1313            (2, N'bee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Question 2', 'Question 2 text', 1, GETUTCDATE(), NULL, 0,
    14              GETUTCDATE(), 2
     14             GETUTCDATE()
    1515            )
    16     ) AS temp ([ID], [Uid], [Title], [Text], [StudentFk], [CreatedOn], [TeamFk], [Views], [LastActiveOn], [AnswersCount])
     16    ) AS temp ([ID], [Uid], [Title], [Text], [StudentFk], [CreatedOn], [TeamFk], [Views], [LastActiveOn])
    1717    ) AS S
    1818    ON T.[ID] = S.[ID]
     
    2525                   T.[TeamFk] = S.[TeamFk],
    2626                   T.[Views] = S.[Views],
    27                    T.[LastActiveOn] = S.[LastActiveOn],
    28                    T.[AnswersCount] = S.[AnswersCount]
     27                   T.[LastActiveOn] = S.[LastActiveOn]
    2928    WHEN NOT MATCHED THEN
    3029        INSERT
     
    3837            [TeamFk],
    3938            [Views],
    40             [LastActiveOn],
    41             [AnswersCount]
     39            [LastActiveOn]
    4240        )
    4341        VALUES
    44         (S.[ID], S.[Uid], S.[Title], S.[Text], S.[StudentFk], S.[CreatedOn], S.[TeamFk], S.[Views], S.[LastActiveOn], S.[AnswersCount]);
     42        (S.[ID], S.[Uid], S.[Title], S.[Text], S.[StudentFk], S.[CreatedOn], S.[TeamFk], S.[Views], S.[LastActiveOn]);
    4543    SET IDENTITY_INSERT [dbo].[Question] OFF
    4644END
  • src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Question/Question.sql

    r8b6791f r81c2e6f  
    1010    [LastActiveOn] SMALLDATETIME    NOT NULL,
    1111    [Search]       AS ([Title] + ' ' + [Text]),
    12     [AnswersCount] BIGINT           NOT NULL DEFAULT 0,
    1312    CONSTRAINT [PK_Question] PRIMARY KEY CLUSTERED ([Id] ASC),
    1413    CONSTRAINT [FK_Question_Student_StudentFk] FOREIGN KEY ([StudentFk]) REFERENCES [dbo].[Student] ([Id]),
  • src/FinkiChattery/FinkiChattery.Persistence/Configurations/QuestionConfig.cs

    r8b6791f r81c2e6f  
    2525            builder.Property(x => x.LastActiveOn).HasColumnName(@"LastActiveOn").HasColumnType("smalldatetime").IsRequired();
    2626            builder.Property(x => x.Search).HasColumnType(@"Search").HasColumnType("nvarchar").HasMaxLength(4000).IsRequired();
    27             builder.Property(x => x.AnswersCount).HasColumnType(@"AnswersCount").HasColumnType("bigint").IsRequired().HasDefaultValue(0);
    2827
    2928            builder.HasOne(x => x.Student).WithMany(x => x.Questions).HasForeignKey(x => x.StudentFk).OnDelete(DeleteBehavior.NoAction);
  • src/FinkiChattery/FinkiChattery.Persistence/Models/Question.cs

    r8b6791f r81c2e6f  
    3434        public string Search { get; set; }
    3535
    36         public long AnswersCount { get; set; }
    37 
    3836        public virtual ICollection<Answer> Answers { get; set; }
    3937
  • src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs

    r8b6791f r81c2e6f  
    22using FinkiChattery.Persistence.Repositories.Contracts;
    33using System;
    4 using System.Collections.Generic;
    54using System.Threading.Tasks;
    65
     
    109    {
    1110        Task<QuestionStateDto> GetQuestionState(Guid questionUid);
    12 
    13         Task<List<QuestionPreviewDto>> GetPreviewQuestionsLatest();
    14      
    15         Task<List<QuestionPreviewDto>> GetPreviewQuestionsPopular();
    1611    }
    1712}
  • src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs

    r8b6791f r81c2e6f  
    44using Microsoft.EntityFrameworkCore;
    55using System;
    6 using System.Collections.Generic;
    76using System.Linq;
    8 using System.Linq.Expressions;
    97using System.Threading.Tasks;
    108
     
    1513        public QuestionRepo(ApplicationDbContext dbContext) : base(dbContext)
    1614        {
    17         }
    18 
    19         public async Task<List<QuestionPreviewDto>> GetPreviewQuestionsLatest()
    20         {
    21             Expression<Func<Question, DateTime>> orderBy = x => x.CreatedOn;
    22             return await GetPreviewQuestions(orderBy);
    23         }
    24 
    25         public async Task<List<QuestionPreviewDto>> GetPreviewQuestionsPopular()
    26         {
    27             Expression<Func<Question, long>> orderBy = x => x.Views;
    28             return await GetPreviewQuestions(orderBy);
    29         }
    30 
    31         private async Task<List<QuestionPreviewDto>> GetPreviewQuestions<T>(Expression<Func<Question, T>> orderBy)
    32         {
    33             return await DbSet
    34                 .AsNoTracking()
    35                 .Include(x => x.QuestionCategories).ThenInclude(x => x.Category)
    36                 .OrderByDescending(orderBy)
    37                 .Select(x => new QuestionPreviewDto(x.Id,
    38                                                     x.Uid,
    39                                                     x.Title,
    40                                                     x.Views,
    41                                                     x.AnswersCount,
    42                                                     x.CreatedOn,
    43                                                     x.QuestionCategories.Select(y => new QuestionPreviewCategoryDto(y.Id, y.Uid, y.Category.Name))))
    44                 .Skip(0).Take(30)
    45                 .ToListAsync();
    4615        }
    4716
Note: See TracChangeset for help on using the changeset viewer.