Compare commits

...

42 Commits

Author SHA1 Message Date
13f1e86e72 Merge pull request '133-read-role-returns-500-from-api' (#135) from 133-read-role-returns-500-from-api into main
All checks were successful
Main / changes (push) Successful in 23s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
Reviewed-on: #135
2026-05-20 23:10:54 -04:00
25f935171e updating log interceptor for read role
All checks were successful
Pull Request / changes (pull_request) Successful in 23s
Pull Request / build-and-test (pull_request) Successful in 1m48s
2026-05-20 22:07:33 -05:00
92fec88ad1 updating log interceptor for read role (#134)
Some checks failed
Main / changes (push) Successful in 25s
Main / build (push) Successful in 7m32s
Main / deploy (push) Failing after 48s
Reviewed-on: #134
Co-authored-by: noahspannbauer <noahspannbauer@icloud.com>
Co-committed-by: noahspannbauer <noahspannbauer@icloud.com>
2026-05-20 22:37:05 -04:00
833b1b107c updating log interceptor for read role
All checks were successful
Pull Request / changes (pull_request) Successful in 23s
Pull Request / build-and-test (pull_request) Successful in 4m15s
2026-05-20 21:31:16 -05:00
674ae1cf3c updating log interceptor for read role
All checks were successful
Pull Request / changes (pull_request) Successful in 25s
Pull Request / build (pull_request) Has been skipped
2026-05-20 21:27:06 -05:00
f0b61703b7 renaming .github to .gitea
All checks were successful
Main / changes (push) Successful in 26s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 12:41:38 -05:00
c152f06b63 renaming .github to .gitea
All checks were successful
Main / changes (push) Successful in 59s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 12:39:48 -05:00
3c9d26e085 renaming .github to .gitea
All checks were successful
Main / changes (push) Successful in 11s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 12:20:37 -05:00
12b4f1a65b renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:19:28 -05:00
ae03c0200c renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:16:08 -05:00
b9668a9d48 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:12:07 -05:00
19041e3967 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 1m41s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:08:55 -05:00
5729c72fe1 renaming .github to .gitea
All checks were successful
Main / changes (push) Successful in 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:07:15 -05:00
8760998c78 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:05:59 -05:00
61f8dc0e1e renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:04:05 -05:00
cc7b694fd5 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 08:02:14 -05:00
9553c2ec34 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:59:57 -05:00
0a8c461e3d renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:54:43 -05:00
931d56e753 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 7s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:50:58 -05:00
7ebf78f348 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 58s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:41:50 -05:00
95e2d59abc renaming .github to .gitea
All checks were successful
Main / changes (push) Successful in 3s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:40:54 -05:00
945081dd7c renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 8s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:39:04 -05:00
7213dcf9e1 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 21s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:38:04 -05:00
a13ffeaebd renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 22s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:34:15 -05:00
620b258e94 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 21s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:22:46 -05:00
cc21a43825 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 26s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:18:07 -05:00
112b56080c renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 1m12s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:14:06 -05:00
92f97a93bf renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 9s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-19 07:12:40 -05:00
4f6e9a072c renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 1m49s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-18 20:34:54 -05:00
0c8e4b9fba renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 58s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-18 20:21:39 -05:00
63d2765d19 renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 4m59s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-18 20:12:52 -05:00
da76000b8d renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 1m47s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-18 19:56:36 -05:00
b789e1264a renaming .github to .gitea
Some checks failed
Main / changes (push) Failing after 0s
Main / build (push) Has been skipped
Main / deploy (push) Has been skipped
2026-05-18 19:42:09 -05:00
9cc86fe79f renaming .github to .gitea 2026-05-18 19:22:36 -05:00
ee0e10072c updating version number 2026-04-26 17:19:20 -05:00
899f92f342 126 all logs shown when unauthenticated (#131)
* fixing all logs showing when user is unauthenticated

* updating api log interceptor

* updating api log interceptor

* updating api log interceptor

* logbook page unauthenticated alert
2026-04-26 17:08:34 -05:00
5c4245179f 126 all logs shown when unauthenticated (#130)
* fixing all logs showing when user is unauthenticated

* updating api log interceptor

* updating api log interceptor

* updating api log interceptor
2026-04-18 11:37:23 -07:00
a7a9f01fd9 126 all logs shown when unauthenticated (#129)
* fixing all logs showing when user is unauthenticated

* updating api log interceptor

* updating api log interceptor
2026-04-18 11:09:50 -07:00
a367b517db updating api log interceptor (#128)
* fixing all logs showing when user is unauthenticated

* updating api log interceptor
2026-04-16 06:31:28 -07:00
fd514e4c8b fixing all logs showing when user is unauthenticated (#127) 2026-04-07 20:44:21 -05:00
d8513e6dd0 fixing logbook skip take order by (#125) 2026-03-23 20:19:58 -05:00
5de5a165da 122 fix flights skip take and order by (#123)
* fixing flights skip take order by

* fixing flights skip take order by

* fixing flights skip take order by
2026-03-22 10:19:06 -05:00
14 changed files with 65 additions and 39 deletions

View File

@@ -15,7 +15,7 @@ jobs:
environment: ${{ inputs.environment_name }} environment: ${{ inputs.environment_name }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: https://gitea.com/actions/checkout@v6
with: with:
sparse-checkout: | sparse-checkout: |
api api
@@ -45,8 +45,8 @@ jobs:
- name: Build Client - name: Build Client
env: env:
VITE_API_URL: ${{ vars.VITE_API_URL }} VITE_API_URL: ${{ vars.VITE_API_URL }}
VITE_BASE_URL: ${{ vars.VITE_BASE_URL }} VITE_BASE_URL: ${{ case(inputs.environment_name === 'test', vars.VITE_BASE_URL_TEST, vars.VITE_BASE_URL_PROD) }}
VITE_CLIENT_ID: ${{ vars.VITE_CLIENT_ID }} VITE_CLIENT_ID: ${{ case(inputs.environment_name === 'test', vars.VITE_CLIENT_ID_TEST, vars.VITE_CLIENT_ID_PROD) }}
VITE_ISSUER_URI: ${{ vars.VITE_ISSUER_URI }} VITE_ISSUER_URI: ${{ vars.VITE_ISSUER_URI }}
VITE_TENANT_ID: ${{ vars.VITE_TENANT_ID }} VITE_TENANT_ID: ${{ vars.VITE_TENANT_ID }}
run: | run: |

View File

@@ -7,6 +7,9 @@ on:
client: client:
value: ${{ jobs.changes.outputs.client }} value: ${{ jobs.changes.outputs.client }}
permissions:
contents: read
jobs: jobs:
changes: changes:
name: filter name: filter
@@ -15,7 +18,13 @@ jobs:
api: ${{ steps.filter.outputs.api }} api: ${{ steps.filter.outputs.api }}
client: ${{ steps.filter.outputs.client }} client: ${{ steps.filter.outputs.client }}
steps: steps:
- uses: actions/checkout@v3 - name: 'Setup Node'
uses: actions/setup-node@v6
with:
node-version: '22.x'
- name: Checkout
uses: actions/checkout@v4
- uses: dorny/paths-filter@v3 - uses: dorny/paths-filter@v3
id: filter id: filter

View File

@@ -21,11 +21,9 @@ jobs:
environment: ${{ inputs.environment_name }} environment: ${{ inputs.environment_name }}
steps: steps:
- name: Log in to Azure - name: Log in to Azure
uses: azure/login@v2 uses: azure/login@v3
with: with:
client-id: ${{ vars.AZURE_CLIENT_ID }} creds: '{"clientId":"${{ vars.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}","tenantId":"${{ vars.AZURE_TENANT_ID }}"}'
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
- name: Azure CLI script - name: Azure CLI script
uses: azure/cli@v2 uses: azure/cli@v2

View File

@@ -6,14 +6,14 @@ on:
jobs: jobs:
changes: changes:
uses: ./.github/workflows/changes.yaml uses: ./.gitea/workflows/changes.yaml
build: build:
if: ${{ needs.changes.outputs.api == 'true' || needs.changes.outputs.client == 'true' }} if: ${{ needs.changes.outputs.api == 'true' || needs.changes.outputs.client == 'true' }}
name: build name: build
needs: needs:
- changes - changes
uses: ./.github/workflows/build_and_test.yaml uses: ./.gitea/workflows/build_and_test.yaml
with: with:
environment_name: test environment_name: test
version_number: ${{ github.run_id }} version_number: ${{ github.run_id }}
@@ -24,7 +24,7 @@ jobs:
needs: needs:
- changes - changes
- build - build
uses: ./.github/workflows/deploy.yaml uses: ./.gitea/workflows/deploy.yaml
with: with:
app_name: flying app_name: flying
environment_name: test environment_name: test

View File

@@ -5,14 +5,14 @@ on:
jobs: jobs:
changes: changes:
uses: ./.github/workflows/changes.yaml uses: ./.gitea/workflows/changes.yaml
build: build:
if: ${{ needs.changes.outputs.app == 'true' || needs.changes.outputs.client == 'true'}} if: ${{ needs.changes.outputs.api == 'true' || needs.changes.outputs.client == 'true'}}
name: build name: build-and-test
needs: needs:
- changes - changes
uses: ./.github/workflows/build_and_test.yaml uses: ./.gitea/workflows/build_and_test.yaml
with: with:
environment_name: pull_request environment_name: pull_request
version_number: ${{ github.run_id }} version_number: ${{ github.run_id }}

View File

@@ -7,7 +7,7 @@ on:
jobs: jobs:
build: build:
name: build name: build
uses: ./.github/workflows/build_and_test.yaml uses: ./.gitea/workflows/build_and_test.yaml
with: with:
environment_name: prod environment_name: prod
version_number: ${{ github.ref_name }} version_number: ${{ github.ref_name }}
@@ -17,7 +17,7 @@ jobs:
name: deploy name: deploy
needs: needs:
- build - build
uses: ./.github/workflows/deploy.yaml uses: ./.gitea/workflows/deploy.yaml
with: with:
app_name: flying app_name: flying
environment_name: prod environment_name: prod

View File

@@ -1,6 +1,6 @@
{ {
"name": "api", "name": "api",
"version": "2.1.0", "version": "2.1.4",
"description": "", "description": "",
"author": "", "author": "",
"private": true, "private": true,

View File

@@ -40,7 +40,7 @@ export class LogInterceptor implements NestInterceptor {
if (jwtPayload[rolesKeyName].includes('Flying.Read')) { if (jwtPayload[rolesKeyName].includes('Flying.Read')) {
if (data.entities) { if (data.entities) {
const logs = data.entities.map((entity) => limitData(data.entities)); const logs = data.entities.map((entity) => limitData(entity));
return { return {
entities: logs, entities: logs,
@@ -62,8 +62,8 @@ export class LogInterceptor implements NestInterceptor {
const logs = publicData.slice(0, 5) const logs = publicData.slice(0, 5)
return { return {
entities: publicData, entities: logs,
total: data.total, total: logs.length,
hasNextPage: false hasNextPage: false
}; };
} else { } else {
@@ -71,7 +71,6 @@ export class LogInterceptor implements NestInterceptor {
return publicData return publicData
} }
} }
}) })
); );

View File

@@ -19,6 +19,8 @@ describe('LogService', () => {
createQueryBuilder: jest.fn().mockReturnThis(), createQueryBuilder: jest.fn().mockReturnThis(),
innerJoinAndSelect: jest.fn().mockReturnThis(), innerJoinAndSelect: jest.fn().mockReturnThis(),
orderBy: jest.fn().mockReturnThis(), orderBy: jest.fn().mockReturnThis(),
skip: jest.fn().mockReturnThis(),
take: jest.fn().mockReturnThis(),
getManyAndCount: jest.fn() getManyAndCount: jest.fn()
} }
@@ -232,14 +234,14 @@ describe('LogService', () => {
const count = 1 const count = 1
const morePages = false const morePages = false
jest.spyOn(mockLogRepository, 'findAndCount').mockReturnValue([logs, count, morePages]); jest.spyOn(mockQueryBuilder, 'getManyAndCount').mockReturnValue([logs, count, morePages]);
const {entities, total, hasNextPage} = await service.findLogsWithCount(); const {entities, total, hasNextPage} = await service.findLogsWithCount();
expect(entities).toEqual(logs); expect(entities).toEqual(logs);
expect(count).toEqual(total); expect(count).toEqual(total);
expect(hasNextPage).toEqual(morePages); expect(hasNextPage).toEqual(morePages);
expect(mockLogRepository.findAndCount).toHaveBeenCalled(); expect(mockQueryBuilder.getManyAndCount).toHaveBeenCalled();
}) })
it('findLogsWithTracks => should find log entries with tracks', async () => { it('findLogsWithTracks => should find log entries with tracks', async () => {
@@ -292,7 +294,7 @@ describe('LogService', () => {
expect(entities).toEqual(logs); expect(entities).toEqual(logs);
expect(count).toEqual(total); expect(count).toEqual(total);
expect(hasNextPage).toEqual(morePages); expect(hasNextPage).toEqual(morePages);
expect(mockLogRepository.findAndCount).toHaveBeenCalled(); expect(mockQueryBuilder.getManyAndCount).toHaveBeenCalled();
}) })
it('update => should update a log entry', async () => { it('update => should update a log entry', async () => {

View File

@@ -25,11 +25,22 @@ export class LogService {
} }
async findLogsWithCount(skip?: number, take?: number): Promise<Logs> { async findLogsWithCount(skip?: number, take?: number): Promise<Logs> {
const [entities, total] = await this.logRepository.findAndCount({ // const [entities, total] = await this.logRepository.findAndCount({
take, // take,
skip, // skip,
relations: ['pilot', 'tracks'] // order: {
}) // date: 'DESC'
// },
// relations: ['pilot', 'tracks']
// })
const [entities, total] = await this.logRepository
.createQueryBuilder('logs')
.innerJoinAndSelect('logs.pilot', 'pilot')
.orderBy('logs.date', 'DESC')
.skip(skip)
.take(take)
.getManyAndCount()
return { return {
entities, entities,
@@ -43,7 +54,9 @@ export class LogService {
.createQueryBuilder('logs') .createQueryBuilder('logs')
.innerJoinAndSelect('logs.tracks', 'track') .innerJoinAndSelect('logs.tracks', 'track')
.innerJoinAndSelect('logs.pilot', 'pilot') .innerJoinAndSelect('logs.pilot', 'pilot')
.orderBy('date') .orderBy('logs.date', 'DESC')
.skip(skip)
.take(take)
.getManyAndCount(); .getManyAndCount();
return { return {

View File

@@ -1,7 +1,7 @@
{ {
"name": "client", "name": "client",
"private": true, "private": true,
"version": "2.1.0", "version": "2.1.4",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -380,13 +380,13 @@ const Logbook: React.FC<unknown> = () => {
setPageIndex setPageIndex
} = table; } = table;
const getLogbookEntries = async (pageIndex?: number, pageSize?: number) => { const getLogbookEntries = async (pageIndex: number, pageSize: number) => {
try { try {
dispatch({ type: 'SET_IS_LOADING', payload: true }); dispatch({ type: 'SET_IS_LOADING', payload: true });
const response: AxiosResponse = await httpClient.get(`api/logs`, { const response: AxiosResponse = await httpClient.get(`api/logs`, {
params: { params: {
skip: pageIndex, skip: pageIndex * pageSize,
take: pageSize take: pageSize
} }
}); });
@@ -413,7 +413,7 @@ const Logbook: React.FC<unknown> = () => {
setColumnVisibility(columnVisibility) setColumnVisibility(columnVisibility)
dispatch({ type: 'SET_ENTRIES', payload: { entries: entries, totalEntries: response.data.total }}); dispatch({ type: 'SET_ENTRIES', payload: { entries: entries, totalEntries: response.data.total }});
if (!isUserLoggedIn && response.data.length >= 5) { if (!isUserLoggedIn && response.data.entities.length >= 5) {
dispatch({ type: 'SET_ALERT', payload: { severity: 'info', message: 'A limited number of log entries displayed. Sign in to view all log entries.'}}) dispatch({ type: 'SET_ALERT', payload: { severity: 'info', message: 'A limited number of log entries displayed. Sign in to view all log entries.'}})
} else { } else {
dispatch({ type: 'SET_ALERT', payload: undefined}) dispatch({ type: 'SET_ALERT', payload: undefined})
@@ -527,6 +527,10 @@ const Logbook: React.FC<unknown> = () => {
dispatch({ type: 'SET_PAGES', payload: pages }) dispatch({ type: 'SET_PAGES', payload: pages })
}, [state.totalEntries, state.pagination?.pageSize]) }, [state.totalEntries, state.pagination?.pageSize])
useEffect(() => {
console.log(state.alert)
}, [state.alert])
return ( return (
<> <>
<div className={`${screenSize === ScreenSize.SM ? 'mr-4 ml-4' : 'mr-10 ml-10'} grid grid-cols-12`}> <div className={`${screenSize === ScreenSize.SM ? 'mr-4 ml-4' : 'mr-10 ml-10'} grid grid-cols-12`}>
@@ -550,7 +554,7 @@ const Logbook: React.FC<unknown> = () => {
onClose={() => onClose={() =>
dispatch({ type: 'SET_ALERT', payload: undefined }) dispatch({ type: 'SET_ALERT', payload: undefined })
} }
severity={'info'} severity={state.alert.severity}
> >
{state.alert.message} {state.alert.message}
</Alert> </Alert>
@@ -569,7 +573,7 @@ const Logbook: React.FC<unknown> = () => {
> >
<option value={10}>10</option> <option value={10}>10</option>
<option value={25}>25</option> <option value={25}>25</option>
<option value={3}>50</option> <option value={50}>50</option>
<option value={state.totalEntries}>All</option> <option value={state.totalEntries}>All</option>
</select> </select>
</label> </label>

View File

@@ -2,3 +2,4 @@
.terraform/* .terraform/*
*.tfstate *.tfstate
*.tfstate.* *.tfstate.*
.DS_Store

View File

@@ -1,6 +1,6 @@
{ {
"name": "@noahspan/flying", "name": "@noahspan/flying",
"version": "2.1.0", "version": "2.1.4",
"scripts": { "scripts": {
"start": "node api/dist/main", "start": "node api/dist/main",
"format": "prettier --write \"**/src/**/*.ts\" \"**/test/**/*.ts\"", "format": "prettier --write \"**/src/**/*.ts\" \"**/test/**/*.ts\"",