Skip to content

Commit

Permalink
feat: introduce new search backend module for q&a
Browse files Browse the repository at this point in the history
this fixes collator functionality in the new backend system

closes #106
  • Loading branch information
drodil committed Jan 11, 2024
1 parent f96176a commit 1dc0809
Show file tree
Hide file tree
Showing 35 changed files with 666 additions and 86 deletions.
27 changes: 27 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,30 @@ jobs:
- run: yarn tsc
- run: yarn build
- run: yarn npm publish

search-backend-publish:
name: Publish search backend module
runs-on: ubuntu-latest
needs: [tagged-release]
defaults:
run:
working-directory: ./plugins/search-backend-module-qeta
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Create yarnrc.yml
run: |
echo "npmAuthToken: ${{ secrets.NPM_TOKEN }}" >> ~/.yarnrc.yml
echo "npmAlwaysAuth: true" >> ~/.yarnrc.yml
echo "npmPublishRegistry: https://registry.npmjs.org" >> ~/.yarnrc.yml
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'yarn'
- run: git pull
- run: yarn
- run: yarn tsc
- run: yarn build
- run: yarn npm publish
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export type QetaCollatorFactoryOptions = {
database: PluginDatabaseManager;
};

/** @deprecated use 'search-backend-module-qeta' collator instead for new backend system */
export class QetaCollatorFactory implements DocumentCollatorFactory {
public readonly type: string = 'qeta';
private readonly logger: LoggerService;
Expand Down
3 changes: 2 additions & 1 deletion plugins/qeta-common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@
},
"dependencies": {
"@backstage/plugin-permission-common": "^0.7.11",
"@backstage/plugin-search-common": "^1.2.9"
"@backstage/plugin-search-common": "^1.2.9",
"ajv": "^8.12.0"
},
"peerDependencies": {
"@backstage/catalog-model": "^1.4.3"
Expand Down
47 changes: 47 additions & 0 deletions plugins/qeta-common/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { IndexableDocument } from '@backstage/plugin-search-common';
import { ErrorObject } from 'ajv';

export interface StatisticResponse {
ranking: Statistic[];
Expand Down Expand Up @@ -86,4 +87,50 @@ export interface QetaDocument extends IndexableDocument {
score: number;
answerCount?: number;
views?: number;
tags?: string[];
}

interface CustomError {
message: string;
}

interface ErrorResponse {
errors: ErrorObject<string, any>[] | CustomError[] | null | undefined;
type: 'query' | 'body';
}

export interface QuestionsResponse {
questions: Question[];
total: number;
}

export type QuestionsResponseBody = QuestionsResponse | ErrorResponse;

export type QuestionResponseBody = Question | ErrorResponse;

export interface QuestionRequest {
title: string;
content: string;
tags?: string[];
entities?: string[];
images?: number[];
}

export interface AnswerRequest {
questionId: number;
answer: string;
images?: number[];
anonymous?: boolean;
}

export type AnswerResponseBody = Answer | ErrorResponse;

export interface TagResponse {
tag: string;
questionsCount: number;
}

export type AttachmentResponseBody = Attachment | ErrorResponse;

export type QuestionResponse = Question;
export type AnswerResponse = Answer;
8 changes: 3 additions & 5 deletions plugins/qeta/src/api/QetaApi.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
import {
StatisticResponse,
StatisticsRequestParameters,
} from '@drodil/backstage-plugin-qeta-common';
import {
AnswerRequest,
AnswerResponse,
Expand All @@ -10,8 +6,10 @@ import {
QuestionRequest,
QuestionResponse,
QuestionsResponse,
StatisticResponse,
StatisticsRequestParameters,
TagResponse,
} from './types';
} from '@drodil/backstage-plugin-qeta-common';

export type GetQuestionsOptions = {
noCorrectAnswer: string;
Expand Down
9 changes: 3 additions & 6 deletions plugins/qeta/src/api/QetaClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,18 @@ import {
} from '@backstage/core-plugin-api';
import { CustomErrorBase } from '@backstage/errors';
import {
Answer,
AnswerRequest,
AnswerResponseBody,
AttachmentResponseBody,
Question,
QuestionRequest,
QuestionResponseBody,
QuestionsResponse,
QuestionsResponseBody,
TagResponse,
} from './types';

import {
Answer,
Question,
StatisticResponse,
StatisticsRequestParameters,
TagResponse,
} from '@drodil/backstage-plugin-qeta-common';
import omitBy from 'lodash/omitBy';
import isEmpty from 'lodash/isEmpty';
Expand Down
1 change: 0 additions & 1 deletion plugins/qeta/src/api/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export type { QetaApi } from './QetaApi';
export { qetaApiRef, QetaClient } from './QetaClient';
export * from './types';
51 changes: 0 additions & 51 deletions plugins/qeta/src/api/types.ts

This file was deleted.

5 changes: 2 additions & 3 deletions plugins/qeta/src/components/AskForm/AskForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@ import React, { useEffect } from 'react';
import { Controller, useForm } from 'react-hook-form';
import { useNavigate, useSearchParams } from 'react-router-dom';
import {
QetaApi,
qetaApiRef,
QuestionRequest,
QuestionResponse,
} from '../../api';
} from '@drodil/backstage-plugin-qeta-common';
import { useStyles } from '../../utils/hooks';
import { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';
import { catalogApiRef } from '@backstage/plugin-catalog-react';
Expand All @@ -26,6 +24,7 @@ import { QuestionForm } from './types';
import { EntitiesInput } from './EntitiesInput';
import { questionRouteRef } from '../../routes';
import { AskAnonymouslyCheckbox } from '../AskAnonymouslyCheckbox/AskAnonymouslyCheckbox';
import { QetaApi, qetaApiRef } from '../../api';

const formToRequest = (
form: QuestionForm,
Expand Down
6 changes: 5 additions & 1 deletion plugins/qeta/src/components/CommentSection/CommentList.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { Box, Divider, Typography } from '@material-ui/core';
import React from 'react';
import { Link, MarkdownContent } from '@backstage/core-components';
import { useStyles } from '../../utils/hooks';
import { useApi } from '@backstage/core-plugin-api';
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';
import { AuthorLink } from '../Links/Links';
import { qetaApiRef } from '../../api';

export const CommentList = (props: {
onCommentDelete: (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import React, { useState } from 'react';
import { Box, Button, Grid, TextField } from '@material-ui/core';
import { Link } from '@backstage/core-components';
import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { Controller, useForm } from 'react-hook-form';
import { useAnalytics, useApi } from '@backstage/core-plugin-api';
import { CommentList } from './CommentList';
import { qetaApiRef } from '../../api';

export const CommentSection = (props: {
onCommentPost: (question: QuestionResponse, answer?: AnswerResponse) => void;
Expand Down
6 changes: 5 additions & 1 deletion plugins/qeta/src/components/DeleteModal/DeleteModal.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { Backdrop, Box, Button, Modal, Typography } from '@material-ui/core';
import { Alert } from '@material-ui/lab';
import Delete from '@material-ui/icons/Delete';
import React from 'react';
import { useBasePath, useStyles } from '../../utils/hooks';
import { useApi } from '@backstage/core-plugin-api';
import { useNavigate } from 'react-router-dom';
import { qetaApiRef } from '../../api';

export const DeleteModal = (props: {
entity: QuestionResponse | AnswerResponse;
Expand Down
5 changes: 4 additions & 1 deletion plugins/qeta/src/components/QuestionPage/AnswerCard.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { AnswerResponse, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { Box, Card, CardContent, Grid, Typography } from '@material-ui/core';
import { Link, MarkdownContent } from '@backstage/core-components';
import React from 'react';
Expand Down
6 changes: 3 additions & 3 deletions plugins/qeta/src/components/QuestionPage/AnswerForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import { configApiRef, useAnalytics, useApi } from '@backstage/core-plugin-api';
import {
AnswerRequest,
AnswerResponse,
qetaApiRef,
qetaCreateAnswerPermission,
QuestionResponse,
} from '../../api';
} from '@drodil/backstage-plugin-qeta-common';
import { useStyles } from '../../utils/hooks';
import { Controller, useForm } from 'react-hook-form';
import { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';
import { RequirePermission } from '@backstage/plugin-permission-react';
import { qetaCreateAnswerPermission } from '@drodil/backstage-plugin-qeta-common';
import { AskAnonymouslyCheckbox } from '../AskAnonymouslyCheckbox/AskAnonymouslyCheckbox';
import { qetaApiRef } from '../../api';

const getDefaultValues = (questionId: number) => {
return { questionId, answer: '' };
Expand Down
5 changes: 4 additions & 1 deletion plugins/qeta/src/components/QuestionPage/AuthorBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ import { Avatar, Box, Grid, Typography } from '@material-ui/core';
import { formatEntityName } from '../../utils/utils';
import React, { useEffect } from 'react';
import { useStyles } from '../../utils/hooks';
import { AnswerResponse, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { identityApiRef, useApi } from '@backstage/core-plugin-api';
import { catalogApiRef } from '@backstage/plugin-catalog-react';
import { UserEntity } from '@backstage/catalog-model';
Expand Down
3 changes: 2 additions & 1 deletion plugins/qeta/src/components/QuestionPage/FavoriteButton.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { qetaApiRef, QuestionResponse } from '../../api';
import { QuestionResponse } from '@drodil/backstage-plugin-qeta-common';
import { IconButton, Tooltip } from '@material-ui/core';
import React from 'react';
import { useApi } from '@backstage/core-plugin-api';
import StarIcon from '@material-ui/icons/Star';
import StarOutlineIcon from '@material-ui/icons/StarOutline';
import { qetaApiRef } from '../../api';

export const FavoriteButton = (props: { entity: QuestionResponse }) => {
const [entity, setEntity] = React.useState<QuestionResponse>(props.entity);
Expand Down
5 changes: 4 additions & 1 deletion plugins/qeta/src/components/QuestionPage/LinkButton.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { IconButton, Tooltip } from '@material-ui/core';
import Link from '@material-ui/icons/Link';
import React from 'react';
import { AnswerResponse, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';

export const LinkButton = (props: {
entity: QuestionResponse | AnswerResponse;
Expand Down
5 changes: 4 additions & 1 deletion plugins/qeta/src/components/QuestionPage/QuestionCard.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { AnswerResponse, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { Box, Card, CardContent, Grid, Typography } from '@material-ui/core';
import { Link, MarkdownContent } from '@backstage/core-components';
import React, { useEffect } from 'react';
Expand Down
7 changes: 5 additions & 2 deletions plugins/qeta/src/components/QuestionPage/QuestionPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ import {
import { useParams } from 'react-router-dom';
import { useQetaApi, useStyles } from '../../utils/hooks';
import { QuestionCard } from './QuestionCard';
import { AnswerResponse, QuestionResponse } from '../../api';
import {
Answer,
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import { AnswerForm } from './AnswerForm';
import { AnswerCard } from './AnswerCard';
import { Skeleton } from '@material-ui/lab';
import { AskQuestionButton } from '../Buttons/AskQuestionButton';
import { BackToQuestionsButton } from '../Buttons/BackToQuestionsButton';
import { Answer } from '@drodil/backstage-plugin-qeta-common';
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';
import { UpdatedByLink } from '../Links/Links';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { QuestionResponse } from '../../api';
import { QuestionResponse } from '@drodil/backstage-plugin-qeta-common';
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
import { catalogApiRef } from '@backstage/plugin-catalog-react';
import React, { useEffect } from 'react';
Expand Down
6 changes: 5 additions & 1 deletion plugins/qeta/src/components/QuestionPage/VoteButtons.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';
import {
AnswerResponse,
QuestionResponse,
} from '@drodil/backstage-plugin-qeta-common';
import {
Box,
IconButton,
Expand All @@ -11,6 +14,7 @@ import ArrowUpward from '@material-ui/icons/ArrowUpward';
import Check from '@material-ui/icons/Check';
import React from 'react';
import { useAnalytics, useApi } from '@backstage/core-plugin-api';
import { qetaApiRef } from '../../api';

export const VoteButtons = (props: {
entity: QuestionResponse | AnswerResponse;
Expand Down
Loading

0 comments on commit 1dc0809

Please sign in to comment.