Skip to content

Commit

Permalink
Merge pull request #135 from Kerosene-Labs/BIL-4-create-fixed
Browse files Browse the repository at this point in the history
Bil 4 create fixed
  • Loading branch information
hlafaille authored Dec 29, 2024
2 parents 022aee4 + fd392e6 commit f4ca1aa
Show file tree
Hide file tree
Showing 15 changed files with 196 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.CrossOrigin
@OpenAPIDefinition(
servers = [
Server(url = "https://billtracker.kerosenelabs.com/api/v1", description = "Production"),
Server(url = "https://dev.billtracker.kerosenelabs.com", description = "Development"),
Server(url = "https://dev.billtracker.kerosenelabs.com/api/v1", description = "Development"),
Server(url = "http://localhost:8080", description = "Local")
]
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,14 @@ class ExpensesController(private val expenseService: ExpenseService) {
)
}

// @GetMapping("/expenses/recurringCreators")
// @ResponseStatus(HttpStatus.OK)
// fun getExpenses(@Parameter(hidden = true) user: UserEntity): GetRecurringExpenseEventCreatorsResponse {
// return GetExpenseEventsResponse(
// expenseService.(user)
// .stream()
// .map { entity -> expenseService.mapExpenseEventEntityToExpenseEvent(entity) }
// .toList()
// )
// }
@GetMapping("/expenses/recurringCreators")
@ResponseStatus(HttpStatus.OK)
fun getRecurringExpenseCreators(@Parameter(hidden = true) user: UserEntity): GetRecurringExpenseEventCreatorsResponse {
return GetRecurringExpenseEventCreatorsResponse(
expenseService.getRecurringExpenseEventCreatorsByUser(user)
.stream()
.map { entity -> expenseService.mapRecurringExpenseEventCreatorEntityToRecurringExpenseEventCreator(entity) }
.toList()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,13 @@ class ExpenseService(
recursEveryCalendarDay: Int,
description: String
): RecurringExpenseEventCreatorEntity {
return RecurringExpenseEventCreatorEntity(
amount = amount,
user = user,
recursEveryCalendarDay = recursEveryCalendarDay,
description = description
return recurringExpenseEventCreatorRepository.save(
RecurringExpenseEventCreatorEntity(
amount = amount,
user = user,
recursEveryCalendarDay = recursEveryCalendarDay,
description = description
)
)
}

Expand Down Expand Up @@ -89,10 +91,12 @@ class ExpenseService(
* Map a RecurringExpenseEventCreatorEntity (aka an recurring expense event from the database) to a model
* suitable for consumption by the user.
*/
// fun mapRecurringExpenseEventCreatorEntityToRecurringExpenseEventCreator(recurringExpenseEventCreator: RecurringExpenseEventCreator): RecurringExpenseEventCreator {
// return RecurringExpenseEventCreator(
// id = recurringExpenseEventCreator.id!!,
//// recursEveryCalendarDays = recurringExpenseEventCreator,
// )
// }
fun mapRecurringExpenseEventCreatorEntityToRecurringExpenseEventCreator(entity: RecurringExpenseEventCreatorEntity): RecurringExpenseEventCreator {
return RecurringExpenseEventCreator(
id = entity.id!!,
description = entity.description,
amount = entity.amount,
recursEveryCalendarDay = entity.recursEveryCalendarDay,
)
}
}
2 changes: 1 addition & 1 deletion src/main/svelte/src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ h2 {

p.subtitle {
@apply font-semibold text-neutral-400;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import { getErrorMessageFromSdk, getPrivateApiConfig } from "$lib/sdkUtil";
import { addToToastQueue, ToastType } from "$lib/toast";
import { goto } from "$app/navigation";
import ENumberInput from "$lib/eureka/input/ENumberInput.svelte";
let amount: number = 0.0;
let description: string;
Expand Down Expand Up @@ -41,8 +42,11 @@
>
<div class="flex flex-col gap-4">
<div class="flex h-fit w-full flex-col gap-4 xl:flex-row">
<LineEdit id="amount" label="Dollars" type="number" bind:value={amount}
></LineEdit>
<ENumberInput
id="amount"
label="Dollars"
bind:value={amount}
></ENumberInput>
<LineEdit
id="description"
type="text"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
createRecurringExpenseCreatorRequest: {
amount: amount,
description: description,
recursEveryCalendarDay: calendarDay
recursEveryCalendarDay: calendarDay,
},
})
.then((response) => {
Expand Down Expand Up @@ -49,8 +49,14 @@
label="Description"
bind:value={description}
></LineEdit>
<LineEdit id="calendarDay" label="Calendar Day" type="number" bind:value={calendarDay}
min={1} max={28} title="Must be between 1 and 28, reprenseting all days possible within the shortest month."
<LineEdit
id="calendarDay"
label="Calendar Day"
type="number"
bind:value={calendarDay}
min={1}
max={28}
title="Must be between 1 and 28, reprenseting all days possible within the shortest month."
></LineEdit>
</div>
<Button on:click={createRecurringExpenseCreator}>Create</Button>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,45 @@
<script lang="ts">
import { onMount } from "svelte";
import { getPrivateApiConfig } from "$lib/sdkUtil";
import { type ExpenseEvent, ExpensesApi, ResponseError } from "$lib/sdk";
import {
type ExpenseEvent,
ExpensesApi,
type RecurringExpenseEventCreator,
ResponseError,
} from "$lib/sdk";
import { addToToastQueue, ToastType } from "$lib/toast";
import Spinner from "$lib/tk/Spinner.svelte";
import Button from "$lib/tk/Button.svelte";
import Table from "$lib/components/Table.svelte";
import { goto } from "$app/navigation";
let expenses: ExpenseEvent[] | undefined = undefined;
let expenseRows: String[][] = [];
let recurringExpenseEventCreators:
| RecurringExpenseEventCreator[]
| undefined = undefined;
let rows: String[][] = [];
function getOrdinal(num: number) {
const suffixes = ["th", "st", "nd", "rd"];
const value = num % 100;
return (
num + (suffixes[(value - 20) % 10] || suffixes[value] || suffixes[0])
);
}
onMount(() => {
new ExpensesApi(getPrivateApiConfig())
.getExpenses()
.getRecurringExpenseCreators()
.then((response) => {
expenses = response.expenseEvents;
expenses.forEach((expense) => {
expenseRows.push([
"$" + expense.amount.toFixed(2),
expense.date.toDateString(),
expense.description,
expense.expenseEventType,
]);
});
recurringExpenseEventCreators = response.recurringExpenseEventCreators;
recurringExpenseEventCreators.forEach(
(recurringExpenseEventCreator) => {
rows.push([
"$" + recurringExpenseEventCreator.amount.toFixed(2),
getOrdinal(recurringExpenseEventCreator.recursEveryCalendarDay),
recurringExpenseEventCreator.description,
]);
},
);
})
.catch(async (error: ResponseError) => {
addToToastQueue({
Expand All @@ -43,22 +59,20 @@
>Create Recurring
</Button>
</div>
{#if expenses === undefined}
{#if recurringExpenseEventCreators === undefined}
<!--Loading Spinner-->
<div class="flex w-full justify-center p-6">
<Spinner></Spinner>
</div>
{:else if expenses !== undefined && expenses.length === 0}
{:else if recurringExpenseEventCreators !== undefined && recurringExpenseEventCreators.length === 0}
<div class="flex flex-col items-center justify-center gap-2 p-8">
<p class="font-mono text-2xl font-black text-neutral-300">
🦗...crickets
</p>
<p class="font-semibold text-neutral-100">There's nothing here.</p>
</div>
{:else}
<Table
headers={["Amount", "Interval", "Description", "Type"]}
rows={expenseRows}
<Table headers={["Amount", "Interval (every month)", "Description"]} {rows}
></Table>
{/if}
</div>
40 changes: 40 additions & 0 deletions src/main/svelte/src/lib/eureka/input/ENumberInput.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<script lang="ts">
export let id: string;
export let label: string;
export let value: string | Date | number | undefined = undefined;
export let required: boolean = false;
export let min: number | null = null;
export let max: number | null = null;
</script>

<div class="flex flex-col">
<label class="text-sm font-semibold uppercase text-neutral-600" for={id}
>{label}</label
>
<input bind:value {id} type="number" />
</div>

<style lang="postcss">
input {
@apply w-full;
@apply rounded-lg px-5 py-2;
@apply text-neutral-300;
@apply bg-neutral-800;
@apply hover:bg-neutral-700/70;
@apply focus:bg-neutral-700/95;
@apply focus:ring-2 focus:ring-neutral-400;
@apply transition-all;
@apply outline-none;
@apply font-semibold;
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield; /* For Firefox */
}
</style>
2 changes: 2 additions & 0 deletions src/main/svelte/src/lib/sdk/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ models/CreateRecurringExpenseCreatorRequest.ts
models/ExpenseEvent.ts
models/GetExpenseEventsResponse.ts
models/GetIntroductorySettingsResponse.ts
models/GetRecurringExpenseEventCreatorsResponse.ts
models/HandleOAuth2TokenResponse.ts
models/HandleTokenRequest.ts
models/IntroductorySettings.ts
models/RecurringExpenseEventCreator.ts
models/SetIntroductorySettingsRequest.ts
models/index.ts
runtime.ts
39 changes: 37 additions & 2 deletions src/main/svelte/src/lib/sdk/apis/ExpensesApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import type {
CreateOneOffExpenseRequest,
CreateRecurringExpenseCreatorRequest,
GetExpenseEventsResponse,
GetRecurringExpenseEventCreatorsResponse,
} from '../models/index';
import {
CreateOneOffExpenseRequestFromJSON,
Expand All @@ -26,6 +27,8 @@ import {
CreateRecurringExpenseCreatorRequestToJSON,
GetExpenseEventsResponseFromJSON,
GetExpenseEventsResponseToJSON,
GetRecurringExpenseEventCreatorsResponseFromJSON,
GetRecurringExpenseEventCreatorsResponseToJSON,
} from '../models/index';

export interface CreateOneOffRequest {
Expand Down Expand Up @@ -66,7 +69,7 @@ export class ExpensesApi extends runtime.BaseAPI {
}
}
const response = await this.request({
path: `/expenses/oneOff`,
path: `/expenses/oneOffs`,
method: 'POST',
headers: headerParameters,
query: queryParameters,
Expand Down Expand Up @@ -107,7 +110,7 @@ export class ExpensesApi extends runtime.BaseAPI {
}
}
const response = await this.request({
path: `/expenses/recurringCreator`,
path: `/expenses/recurringCreators`,
method: 'POST',
headers: headerParameters,
query: queryParameters,
Expand Down Expand Up @@ -155,4 +158,36 @@ export class ExpensesApi extends runtime.BaseAPI {
return await response.value();
}

/**
*/
async getRecurringExpenseCreatorsRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<GetRecurringExpenseEventCreatorsResponse>> {
const queryParameters: any = {};

const headerParameters: runtime.HTTPHeaders = {};

if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("bearerAuth", []);

if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/expenses/recurringCreators`,
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);

return new runtime.JSONApiResponse(response, (jsonValue) => GetRecurringExpenseEventCreatorsResponseFromJSON(jsonValue));
}

/**
*/
async getRecurringExpenseCreators(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<GetRecurringExpenseEventCreatorsResponse> {
const response = await this.getRecurringExpenseCreatorsRaw(initOverrides);
return await response.value();
}

}
2 changes: 2 additions & 0 deletions src/main/svelte/src/lib/sdk/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ export * from './CreateRecurringExpenseCreatorRequest';
export * from './ExpenseEvent';
export * from './GetExpenseEventsResponse';
export * from './GetIntroductorySettingsResponse';
export * from './GetRecurringExpenseEventCreatorsResponse';
export * from './HandleOAuth2TokenResponse';
export * from './HandleTokenRequest';
export * from './IntroductorySettings';
export * from './RecurringExpenseEventCreator';
export * from './SetIntroductorySettingsRequest';
Loading

0 comments on commit f4ca1aa

Please sign in to comment.