diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..a90380e5 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,24 @@ +name: Build + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: ['20.17.0'] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..d752c763 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,36 @@ +--- +name: "Code Quality Analysis" + +on: + push: + pull_request: + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + + runs-on: 'ubuntu-latest' + permissions: + security-events: write + + strategy: + fail-fast: false + matrix: + include: + - language: javascript-typescript + build-mode: none + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/eslint.yaml b/.github/workflows/eslint.yaml new file mode 100644 index 00000000..5eefe228 --- /dev/null +++ b/.github/workflows/eslint.yaml @@ -0,0 +1,47 @@ +--- +name: ESLint + +on: + push: + pull_request: + +jobs: + eslint: + name: Run eslint scanning + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + strategy: + matrix: + service: ["backend", "frontend"] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: | + **/package-lock.json + + - name: Install ESLint + run: | + npm install eslint + npm install @microsoft/eslint-formatter-sarif@2.1.7 + + - name: Run ESLint + run: npx eslint apps/${{ matrix.service }}/ + --config apps/${{ matrix.service }}/.eslintrc.json + --format @microsoft/eslint-formatter-sarif + --output-file apps/${{ matrix.service }}/eslint-results.sarif + continue-on-error: true + + - name: Upload analysis results to GitHub + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: apps/${{ matrix.service }}/eslint-results.sarif + wait-for-processing: true diff --git a/README.md b/README.md index 19db8f87..2de7204a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-
+
diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts
index 3bbabf7d..bd14422e 100644
--- a/apps/backend/src/api/routes/auth.controller.ts
+++ b/apps/backend/src/api/routes/auth.controller.ts
@@ -6,8 +6,8 @@ import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto
import { AuthService } from '@gitroom/backend/services/auth/auth.service';
import { ForgotReturnPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot-return.password.dto';
import { ForgotPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot.password.dto';
-import { removeSubdomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { ApiTags } from '@nestjs/swagger';
+import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
@ApiTags('Auth')
@Controller('/auth')
@@ -37,8 +37,7 @@ export class AuthController {
}
response.cookie('auth', jwt, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
@@ -47,8 +46,7 @@ export class AuthController {
if (typeof addedOrg !== 'boolean' && addedOrg?.organizationId) {
response.cookie('showorg', addedOrg.organizationId, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
@@ -83,8 +81,7 @@ export class AuthController {
);
response.cookie('auth', jwt, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
@@ -93,8 +90,7 @@ export class AuthController {
if (typeof addedOrg !== 'boolean' && addedOrg?.organizationId) {
response.cookie('showorg', addedOrg.organizationId, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
@@ -149,8 +145,7 @@ export class AuthController {
}
response.cookie('auth', activate, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
@@ -173,8 +168,7 @@ export class AuthController {
}
response.cookie('auth', jwt, {
- domain:
- '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
diff --git a/apps/backend/src/api/routes/posts.controller.ts b/apps/backend/src/api/routes/posts.controller.ts
index c13c614a..dccdd28c 100644
--- a/apps/backend/src/api/routes/posts.controller.ts
+++ b/apps/backend/src/api/routes/posts.controller.ts
@@ -48,19 +48,18 @@ export class PostsController {
@GetOrgFromRequest() org: Organization,
@Query() query: GetPostsDto
) {
- const [posts, comments] = await Promise.all([
+ const [posts] = await Promise.all([
this._postsService.getPosts(org.id, query),
- this._commentsService.getAllCommentsByWeekYear(
- org.id,
- query.year,
- query.week,
- query.isIsoWeek === 'true'
- ),
+ // this._commentsService.getAllCommentsByWeekYear(
+ // org.id,
+ // query.year,
+ // query.week
+ // ),
]);
return {
posts,
- comments,
+ // comments,
};
}
diff --git a/apps/backend/src/services/auth/auth.middleware.ts b/apps/backend/src/services/auth/auth.middleware.ts
index a54dfb4a..a10a7e12 100644
--- a/apps/backend/src/services/auth/auth.middleware.ts
+++ b/apps/backend/src/services/auth/auth.middleware.ts
@@ -4,12 +4,12 @@ import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { User } from '@prisma/client';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service';
-import { removeSubdomain } from '@gitroom/helpers/subdomain/subdomain.management';
+import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter';
export const removeAuth = (res: Response) => {
res.cookie('auth', '', {
- domain: '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
+ domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
diff --git a/apps/frontend/src/app/colors.scss b/apps/frontend/src/app/colors.scss
index 0a3cf3ca..961de950 100644
--- a/apps/frontend/src/app/colors.scss
+++ b/apps/frontend/src/app/colors.scss
@@ -34,7 +34,7 @@
--color-custom20: #121b2c;
--color-custom21: #506490;
--color-custom22: #b91c1c;
- --color-custom23: #06080d;
+ --color-custom23: #000000;
--color-custom24: #eaff00;
--color-custom25: #2e3336;
--color-custom26: #1d9bf0;
diff --git a/apps/frontend/src/app/layout.tsx b/apps/frontend/src/app/layout.tsx
index 6a77d17e..7b4912c4 100644
--- a/apps/frontend/src/app/layout.tsx
+++ b/apps/frontend/src/app/layout.tsx
@@ -1,18 +1,14 @@
import interClass from '@gitroom/react/helpers/inter.font';
-
export const dynamic = 'force-dynamic';
import './global.scss';
import 'react-tooltip/dist/react-tooltip.css';
import '@copilotkit/react-ui/styles.css';
-
import LayoutContext from '@gitroom/frontend/components/layout/layout.context';
import { ReactNode } from 'react';
-import { Chakra_Petch } from 'next/font/google';
import { isGeneral } from '@gitroom/react/helpers/is.general';
import PlausibleProvider from 'next-plausible';
import clsx from 'clsx';
-
-const chakra = Chakra_Petch({ weight: '400', subsets: ['latin'] });
+import "@fontsource/chakra-petch";
export default async function AppLayout({ children }: { children: ReactNode }) {
return (
@@ -24,7 +20,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) {
sizes="any"
/>
-