From 8db6ea4754524e074a51e755a9f58171cd5230df Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:40:03 -0600 Subject: [PATCH 01/27] test some vue components --- client/src/App.vue | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/client/src/App.vue b/client/src/App.vue index abfd315..cd0ff60 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,11 +1,22 @@ - + - + -- 2.49.1 From 2128d5dfa4ca01eaadf1ea866f9be4db27b733eb Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:40:32 -0600 Subject: [PATCH 02/27] i forget it literally every time --- client/src/assets/.gitkeep | 0 client/src/components/.gitkeep | 0 client/src/components/Header.vue | 21 +++++++++++++++++++++ client/src/pages/.gitkeep | 0 client/src/services/.gitkeep | 0 5 files changed, 21 insertions(+) create mode 100644 client/src/assets/.gitkeep create mode 100644 client/src/components/.gitkeep create mode 100644 client/src/components/Header.vue create mode 100644 client/src/pages/.gitkeep create mode 100644 client/src/services/.gitkeep diff --git a/client/src/assets/.gitkeep b/client/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/client/src/components/.gitkeep b/client/src/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue new file mode 100644 index 0000000..b6e5dd1 --- /dev/null +++ b/client/src/components/Header.vue @@ -0,0 +1,21 @@ + + + + diff --git a/client/src/pages/.gitkeep b/client/src/pages/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/client/src/services/.gitkeep b/client/src/services/.gitkeep new file mode 100644 index 0000000..e69de29 -- 2.49.1 From 20ea31e63ac769fdbf4adae7ae634e120e91c074 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:42:36 -0600 Subject: [PATCH 03/27] temp deploy on this branch --- .gitea/workflows/deploy-client.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/deploy-client.yaml b/.gitea/workflows/deploy-client.yaml index 1b435a7..1facb46 100644 --- a/.gitea/workflows/deploy-client.yaml +++ b/.gitea/workflows/deploy-client.yaml @@ -5,8 +5,8 @@ run-name: "${{ gitea.event.head_commit.message }}: Deploy Client" on: push: - branches: - - main + #branches: + # - main paths: - "client/**" - ".gitea/workflows/deploy-client.yaml" -- 2.49.1 From c807412076cf4dcad3073d52db958c8e86c53433 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:49:10 -0600 Subject: [PATCH 04/27] idk how vue works --- client/src/App.vue | 7 +++---- client/src/components/Header.vue | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/client/src/App.vue b/client/src/App.vue index cd0ff60..e408c91 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,5 +1,3 @@ - - - + \ No newline at end of file diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue index b6e5dd1..5b41696 100644 --- a/client/src/components/Header.vue +++ b/client/src/components/Header.vue @@ -14,8 +14,8 @@ - -- 2.49.1 From fdac0859ea75292d628e9ea44e9dd3e9a39ff38e Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:53:30 -0600 Subject: [PATCH 05/27] test --- client/src/App.vue | 24 ++++++------------------ client/src/components/Header.vue | 25 +++++++------------------ 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/client/src/App.vue b/client/src/App.vue index e408c91..7add528 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,21 +1,9 @@ - -import Header from "@/components/Header.vue"; - -export default { - components: { - Header, - }, -}; - \ No newline at end of file + diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue index 5b41696..1ce9059 100644 --- a/client/src/components/Header.vue +++ b/client/src/components/Header.vue @@ -1,21 +1,10 @@ - - + + -- 2.49.1 From 67598f60bf8b7def719fab2d35d30cc390b778a0 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 28 Feb 2026 23:56:08 -0600 Subject: [PATCH 06/27] test again --- client/src/App.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/App.vue b/client/src/App.vue index 7add528..48ec3cb 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -6,4 +6,7 @@ import Header from './components/Header.vue' -- 2.49.1 From 28eba3f0fd1000945d3cfb0dd4f9a33b3522f40d Mon Sep 17 00:00:00 2001 From: Blitblank Date: Thu, 5 Mar 2026 22:55:08 -0600 Subject: [PATCH 07/27] add .env file --- .env | 4 ++++ .gitignore | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..fba0b89 --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ + +sike you thought I was like that + +hehehehee (urp so full) diff --git a/.gitignore b/.gitignore index de621d6..7869988 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ # empty for now + +# .env # urrp I eated it :33 -- 2.49.1 From 533571859f0e90af9b27c4fe49f13b4fd403690c Mon Sep 17 00:00:00 2001 From: Blitblank Date: Thu, 5 Mar 2026 23:15:46 -0600 Subject: [PATCH 08/27] some comments for templating --- client/src/App.vue | 3 ++- client/src/assets/.gitkeep | 0 client/src/assets/mobus.txt | 3 +++ client/src/components/.gitkeep | 0 client/src/components/Header.vue | 3 +++ client/src/composables/what.ts | 3 +++ client/src/models/User.ts | 2 ++ client/src/pages/.gitkeep | 0 client/src/pages/index.vue | 2 ++ client/src/router/index.ts | 5 +++++ client/src/services/.gitkeep | 0 client/src/services/UsersService.ts | 4 ++++ client/src/stores/UsersStore.ts | 5 +++++ 13 files changed, 29 insertions(+), 1 deletion(-) delete mode 100644 client/src/assets/.gitkeep create mode 100644 client/src/assets/mobus.txt delete mode 100644 client/src/components/.gitkeep create mode 100644 client/src/composables/what.ts create mode 100644 client/src/models/User.ts delete mode 100644 client/src/pages/.gitkeep create mode 100644 client/src/pages/index.vue delete mode 100644 client/src/services/.gitkeep create mode 100644 client/src/services/UsersService.ts create mode 100644 client/src/stores/UsersStore.ts diff --git a/client/src/App.vue b/client/src/App.vue index 48ec3cb..78b26a3 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -4,9 +4,10 @@ import Header from './components/Header.vue' diff --git a/client/src/assets/.gitkeep b/client/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/assets/mobus.txt b/client/src/assets/mobus.txt new file mode 100644 index 0000000..1748201 --- /dev/null +++ b/client/src/assets/mobus.txt @@ -0,0 +1,3 @@ + +// assets will contain common public resources +// icons, fonts (if needed locally), images, whatever diff --git a/client/src/components/.gitkeep b/client/src/components/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue index 1ce9059..a017076 100644 --- a/client/src/components/Header.vue +++ b/client/src/components/Header.vue @@ -1,4 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/client/src/components/UsersTable.vue b/client/src/components/UsersTable.vue index e69de29..13c74cf 100644 --- a/client/src/components/UsersTable.vue +++ b/client/src/components/UsersTable.vue @@ -0,0 +1,33 @@ + + + + diff --git a/client/src/main.ts b/client/src/main.ts index c8e37b0..a03cc32 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -1,9 +1,11 @@ import { createApp } from 'vue' +import { createPinia } from "pinia" import App from './App.vue' import router from './router' const app = createApp(App) +app.use(createPinia()) app.use(router) app.mount('#app') diff --git a/client/src/pages/UserForm.vue b/client/src/pages/UserForm.vue index e69de29..96510d3 100644 --- a/client/src/pages/UserForm.vue +++ b/client/src/pages/UserForm.vue @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/client/src/pages/UsersList.vue b/client/src/pages/UsersList.vue index e69de29..58036ca 100644 --- a/client/src/pages/UsersList.vue +++ b/client/src/pages/UsersList.vue @@ -0,0 +1,31 @@ + + + + \ No newline at end of file diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue index e50ff11..5f714a6 100644 --- a/client/src/pages/index.vue +++ b/client/src/pages/index.vue @@ -1,2 +1,12 @@ - \ No newline at end of file + + + + + diff --git a/client/src/router/index.ts b/client/src/router/index.ts index c737635..f5c48bb 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -1,13 +1,22 @@ -// generated by vue // the router creates front-end endpoints and serves pages to them +import { createRouter, createWebHistory } from "vue-router"; +import UsersList from "../pages/UsersList.vue"; +import UserForm from "../pages/UserForm.vue"; +import index from "../pages/index.vue"; -import { createRouter, createWebHistory } from 'vue-router' +// link path to the page component +const routes = [ + { path: "/", component: index }, + { path: "/users", component: UsersList }, + { path: "/user/new", component: UserForm }, + { path: "/user/:id", component: UserForm } +]; // I really like this const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [], -}) +}); -export default router +export default router; diff --git a/client/src/stores/UsersStore.ts b/client/src/stores/UsersStore.ts index 62a21d5..a4d4b01 100644 --- a/client/src/stores/UsersStore.ts +++ b/client/src/stores/UsersStore.ts @@ -21,7 +21,7 @@ export const useUsersStore = defineStore("users", { }), actions: { - async fetchItems() { + async fetchUsers() { this.loading = true; const response = await api.getUsers(); this.users = response.data; diff --git a/client/vite.config.ts b/client/vite.config.ts index 4217010..7c295c6 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -15,4 +15,7 @@ export default defineConfig({ '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, + server: { + host: '0.0.0.0', + } }) -- 2.49.1 From 728258465d90a460b89e38120ec09fd0e72bef9b Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sun, 8 Mar 2026 13:59:35 -0500 Subject: [PATCH 11/27] working frontend checkpoint --- client/src/App.vue | 1 - client/src/router/index.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/App.vue b/client/src/App.vue index 7d14f1e..efc0210 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -4,6 +4,5 @@ import index from './pages/index.vue' \ No newline at end of file diff --git a/client/src/router/index.ts b/client/src/router/index.ts index f5c48bb..e96dc27 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -16,7 +16,7 @@ const routes = [ const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), - routes: [], + routes: routes, }); export default router; -- 2.49.1 From 9b6a4c75b9040731609b562e6231f93712d8411a Mon Sep 17 00:00:00 2001 From: Blitblank Date: Tue, 10 Mar 2026 22:49:14 -0500 Subject: [PATCH 12/27] add crud to api --- api/Dockerfile | 1 + api/Program.cs | 57 +++++++++++----------- api/Properties/launchSettings.json | 10 ++-- api/agologum-api.csproj | 1 + api/agologum-api.http | 2 +- api/src/Controllers/UsersController.cs | 67 ++++++++++++++++++++++++++ api/src/Models/User.cs | 10 ++++ api/src/Stores/UserStore.cs | 46 ++++++++++++++++++ api/test.cs | 15 ------ client/src/api/UsersApi.ts | 16 +++--- client/src/components/UsersTable.vue | 4 +- client/src/pages/UsersList.vue | 4 +- 12 files changed, 172 insertions(+), 61 deletions(-) create mode 100644 api/src/Controllers/UsersController.cs create mode 100644 api/src/Models/User.cs create mode 100644 api/src/Stores/UserStore.cs delete mode 100644 api/test.cs diff --git a/api/Dockerfile b/api/Dockerfile index ca64b1e..41f3dfc 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -17,4 +17,5 @@ COPY --from=build /app/publish ./ EXPOSE 5000 +ENV ASPNETCORE_ENVIRONMENT="Production" ENTRYPOINT ["dotnet", "agologum-api.dll"] diff --git a/api/Program.cs b/api/Program.cs index 36d8d30..d0e4ce9 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,8 +1,13 @@ using Microsoft.AspNetCore.HttpOverrides; +using agologumApi.Stores; + var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); +builder.Services.AddSingleton(); + // configuration for behind my nginx proxy builder.Services.Configure(options => { @@ -10,7 +15,7 @@ builder.Services.Configure(options => ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; - options.KnownNetworks.Clear(); + options.KnownIPNetworks.Clear(); options.KnownProxies.Clear(); }); @@ -18,42 +23,34 @@ builder.Services.Configure(options => // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); +builder.Services.AddCors(options => +{ + options.AddPolicy("dev", + policy => + { + policy.AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod(); + }); +}); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + var app = builder.Build(); app.UseForwardedHeaders(); +app.UseCors("dev"); // Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) -{ +if (app.Environment.IsEnvironment("Development")) { app.MapOpenApi(); + app.UseSwagger(); + app.UseSwaggerUI(); +} else { + app.UseHttpsRedirection(); } -app.UseHttpsRedirection(); - - -// below is a placeholder endpoint -var summaries = new[] -{ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -}; - -app.MapGet("api/weatherforecast", () => -{ - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - return forecast; -}) -.WithName("GetWeatherForecast"); +app.MapControllers(); app.Run(); - -record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} diff --git a/api/Properties/launchSettings.json b/api/Properties/launchSettings.json index f689500..841996f 100644 --- a/api/Properties/launchSettings.json +++ b/api/Properties/launchSettings.json @@ -1,23 +1,23 @@ { "$schema": "https://json.schemastore.org/launchsettings.json", "profiles": { - "http": { + "http-dev": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, - "applicationUrl": "http://localhost:5227", + "applicationUrl": "http://0.0.0.0:5227", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, - "https": { + "https-dev": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, - "applicationUrl": "https://localhost:7182;http://localhost:5227", + "applicationUrl": "https://0.0.0.0:7182;http://0.0.0.0:5227", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } - } + }, } } diff --git a/api/agologum-api.csproj b/api/agologum-api.csproj index bcac402..525cfa3 100644 --- a/api/agologum-api.csproj +++ b/api/agologum-api.csproj @@ -9,6 +9,7 @@ + diff --git a/api/agologum-api.http b/api/agologum-api.http index 39b8ff9..c422b39 100644 --- a/api/agologum-api.http +++ b/api/agologum-api.http @@ -1,4 +1,4 @@ -@agologum_api_HostAddress = http://localhost:5227 +@agologum_api_HostAddress = http://0.0.0.0:5227 GET {{agologum_api_HostAddress}}/weatherforecast/ Accept: application/json diff --git a/api/src/Controllers/UsersController.cs b/api/src/Controllers/UsersController.cs new file mode 100644 index 0000000..38cb664 --- /dev/null +++ b/api/src/Controllers/UsersController.cs @@ -0,0 +1,67 @@ + +using Microsoft.AspNetCore.Mvc; +using agologumApi.Models; +using agologumApi.Stores; + +[ApiController] +[Route("api/[controller]")] +public class UsersController : ControllerBase +{ + private readonly UserStore store_; + + public UsersController(UserStore store) + { + store_ = store; + } + + [HttpGet] + public ActionResult> getUsers() + { + return Ok(store_.getUsers()); + } + + [HttpGet("{id:int}")] + public ActionResult getUser(int id) + { + var user = store_.getUser(id); + + if (user == null) + return NotFound(); + + return Ok(user); + } + + [HttpPost] + public ActionResult createUser(User user) + { + var created = store_.createUser(user); + + return CreatedAtAction( + nameof(getUser), + new { id = created.Id }, + created + ); + } + + [HttpPut("{id}")] + public ActionResult updateUser(int id, User user) + { + var updated = store_.updateUser(id, user); + + if (updated == null) + return NotFound(); + + return Ok(updated); + } + + [HttpDelete("{id}")] + public ActionResult deleteUser(int id) + { + var success = store_.deleteUser(id); + + if (!success) + return NotFound(); + + return NoContent(); + } +} \ No newline at end of file diff --git a/api/src/Models/User.cs b/api/src/Models/User.cs new file mode 100644 index 0000000..b42e2d8 --- /dev/null +++ b/api/src/Models/User.cs @@ -0,0 +1,10 @@ + +namespace agologumApi.Models; + +public class User { + + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Email { get; set; } = ""; + +}; diff --git a/api/src/Stores/UserStore.cs b/api/src/Stores/UserStore.cs new file mode 100644 index 0000000..456bf33 --- /dev/null +++ b/api/src/Stores/UserStore.cs @@ -0,0 +1,46 @@ + +// temporary state management +// this will eventually change into a service that uses EnitityFramework for database interactions + +using agologumApi.Models; + +namespace agologumApi.Stores; + +public class UserStore { + + private readonly List users_ = new(); + private int nextId_ = 1; + + public List getUsers() { + return users_; + } + + public User? getUser(int id) { + return users_.FirstOrDefault(x => x.Id == id); + } + + public User createUser(User user) { + user.Id = nextId_++; + users_.Add(user); + return user; + } + + public User? updateUser(int id, User updated) { + var existing = users_.FirstOrDefault(x => x.Id == id); + if(existing == null) return null; + + existing.Name = updated.Name; + existing.Email = updated.Email; + + return existing; + } + + public bool deleteUser(int id) { + var existing = users_.FirstOrDefault(x => x.Id == id); + if(existing == null) return false; + + users_.Remove(existing); + return true; + } + +} \ No newline at end of file diff --git a/api/test.cs b/api/test.cs deleted file mode 100644 index ed14715..0000000 --- a/api/test.cs +++ /dev/null @@ -1,15 +0,0 @@ - -// this is a test program for making sure your dotnet environment is working properly - -/* -using System.Diagnostics; -using System; - -Stopwatch sw = new Stopwatch(); -sw.Start(); -Console.WriteLine("Hi mom !"); -Console.WriteLine("doing a schmunguss"); -sw.Stop(); - -Console.WriteLine("Time elapsed: {0}", sw.Elapsed); -*/ diff --git a/client/src/api/UsersApi.ts b/client/src/api/UsersApi.ts index 6f33454..3c8d01b 100644 --- a/client/src/api/UsersApi.ts +++ b/client/src/api/UsersApi.ts @@ -7,14 +7,18 @@ import axios from "axios"; import type {AxiosResponse } from "axios"; import type { User } from "../models/User.ts"; -const API_URL: string = "/api/items"; +const API_URL: string = "/users"; -export const getUsers = () => axios.get(API_URL); +const api = axios.create({ + baseURL: "http://10.145.164.106:5227/api" +}); -export const getUser = (id: number) => axios.get(`${API_URL}/${id}`); +export const getUsers = () => api.get(`${API_URL}`); -export const createUser = (data: User) => axios.post(API_URL, data); +export const getUser = (id: number) => api.get(`${API_URL}/${id}`); -export const updateUser = (id: number, data: User) => axios.put(`${API_URL}/${id}`, data); +export const createUser = (data: User) => api.post(`${API_URL}`, data); -export const deleteUser = (id: number) => axios.delete(`${API_URL}/${id}`); +export const updateUser = (id: number, data: User) => api.put(`${API_URL}/${id}`, data); + +export const deleteUser = (id: number) => api.delete(`${API_URL}/${id}`); diff --git a/client/src/components/UsersTable.vue b/client/src/components/UsersTable.vue index 13c74cf..b9c87e0 100644 --- a/client/src/components/UsersTable.vue +++ b/client/src/components/UsersTable.vue @@ -17,13 +17,13 @@ onMounted(() => { // register callback for when component is loaded on page

Users

- Create User + Create User diff --git a/client/src/pages/UsersList.vue b/client/src/pages/UsersList.vue index 58036ca..627cc90 100644 --- a/client/src/pages/UsersList.vue +++ b/client/src/pages/UsersList.vue @@ -16,13 +16,13 @@ onMounted(() => {

Users

- Create User + Create User
{{ user.name }} - Edit + Edit
-- 2.49.1 From b1865afced95b77404425a9e850da43a4edf835b Mon Sep 17 00:00:00 2001 From: Blitblank Date: Tue, 10 Mar 2026 22:58:21 -0500 Subject: [PATCH 13/27] dev configuration for api --- .gitea/workflows/deploy-api.yaml | 4 ++-- .gitignore | 3 +++ client/src/api/UsersApi.ts | 3 ++- scripts/execute_all.sh | 7 ++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/deploy-api.yaml b/.gitea/workflows/deploy-api.yaml index bff3cdb..b86417e 100644 --- a/.gitea/workflows/deploy-api.yaml +++ b/.gitea/workflows/deploy-api.yaml @@ -5,8 +5,8 @@ run-name: "${{ gitea.event.head_commit.message }}: Deploy API" on: push: - branches: - - main + #branches: + # - main paths: - "api/**" - ".gitea/workflows/deploy-api.yaml" diff --git a/.gitignore b/.gitignore index 7869988..6e48099 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ # empty for now # .env # urrp I eated it :33 + +# this one is for real though +client/.env diff --git a/client/src/api/UsersApi.ts b/client/src/api/UsersApi.ts index 3c8d01b..b5d27d9 100644 --- a/client/src/api/UsersApi.ts +++ b/client/src/api/UsersApi.ts @@ -9,8 +9,9 @@ import type { User } from "../models/User.ts"; const API_URL: string = "/users"; +const baseUrl: string = import.meta.env.DEV ? import.meta.env.VITE_DEV_API_URL : import.meta.env.VITE_PROD_API_URL; // TODO: overarching api service const api = axios.create({ - baseURL: "http://10.145.164.106:5227/api" + baseURL: baseUrl }); export const getUsers = () => api.get(`${API_URL}`); diff --git a/scripts/execute_all.sh b/scripts/execute_all.sh index b0ac7d1..3d17957 100755 --- a/scripts/execute_all.sh +++ b/scripts/execute_all.sh @@ -1,4 +1,9 @@ # idk yet -dotnet ./api/test.cs +#dotnet ./api/test.cs + +set ASPNETCORE_ENVIRONMENT=Development +dotnet run + +npm run dev -- 2.49.1 From 2a066b7209f8cf0f8983ddaa45694852a2845a3c Mon Sep 17 00:00:00 2001 From: Blitblank Date: Tue, 10 Mar 2026 23:03:25 -0500 Subject: [PATCH 14/27] it was missing the prod url --- client/src/api/UsersApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/api/UsersApi.ts b/client/src/api/UsersApi.ts index b5d27d9..150a63a 100644 --- a/client/src/api/UsersApi.ts +++ b/client/src/api/UsersApi.ts @@ -9,7 +9,7 @@ import type { User } from "../models/User.ts"; const API_URL: string = "/users"; -const baseUrl: string = import.meta.env.DEV ? import.meta.env.VITE_DEV_API_URL : import.meta.env.VITE_PROD_API_URL; // TODO: overarching api service +const baseUrl: string = import.meta.env.DEV ? import.meta.env.VITE_DEV_API_URL : "https://app.vxbard.net/api" // TODO: overarching api service const api = axios.create({ baseURL: baseUrl }); -- 2.49.1 From 3c65a825db417512739b5ae47ef950e59bd2a29c Mon Sep 17 00:00:00 2001 From: Blitblank Date: Tue, 10 Mar 2026 23:04:30 -0500 Subject: [PATCH 15/27] crud checkpoint -- 2.49.1 From 58ff76fdc6ecbbb1c179daaea7630784167f6bc8 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Wed, 11 Mar 2026 20:56:10 -0500 Subject: [PATCH 16/27] change client port --- client/docker-compose.prod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/docker-compose.prod.yaml b/client/docker-compose.prod.yaml index 7cf6298..58be736 100644 --- a/client/docker-compose.prod.yaml +++ b/client/docker-compose.prod.yaml @@ -5,5 +5,5 @@ services: container_name: agologum-client restart: always ports: - - "8080:80" + - "7000:80" \ No newline at end of file -- 2.49.1 From 0da09d7594a62e29de9209ff77ca4bc0b63ea9f9 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 10:37:30 -0500 Subject: [PATCH 17/27] dev postgresql database integration --- api/.gitignore | 1 + api/Program.cs | 8 +++-- api/agologum-api.csproj | 10 ++++++ api/appsettings.json | 3 ++ api/src/Controllers/UsersController.cs | 37 ++++++++++----------- api/src/Stores/UserStore.cs | 46 -------------------------- client/src/App.vue | 2 +- 7 files changed, 38 insertions(+), 69 deletions(-) delete mode 100644 api/src/Stores/UserStore.cs diff --git a/api/.gitignore b/api/.gitignore index 01e74fd..1d9f974 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -25,6 +25,7 @@ bld/ project.lock.json project.fragment.lock.json artifacts/ +[Mm]igrations/ # NuGet Packages *.nupkg diff --git a/api/Program.cs b/api/Program.cs index d0e4ce9..302b215 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,12 +1,16 @@ using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.EntityFrameworkCore; -using agologumApi.Stores; +using agologumApi.Services; var builder = WebApplication.CreateBuilder(args); +builder.Services.AddDbContext(options => + options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); + builder.Services.AddControllers(); -builder.Services.AddSingleton(); +builder.Services.AddScoped(); // configuration for behind my nginx proxy builder.Services.Configure(options => diff --git a/api/agologum-api.csproj b/api/agologum-api.csproj index 525cfa3..77eaeef 100644 --- a/api/agologum-api.csproj +++ b/api/agologum-api.csproj @@ -9,6 +9,16 @@ + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/api/appsettings.json b/api/appsettings.json index 822760b..1059c4a 100644 --- a/api/appsettings.json +++ b/api/appsettings.json @@ -5,6 +5,9 @@ "Microsoft.AspNetCore": "Warning" } }, + "ConnectionStrings": { + "DefaultConnection": "Host=localhost;Port=5432;Database=devTest1;Username=devuser;Password=admin5" + }, "AllowedHosts": "*", "https_port": 443 } diff --git a/api/src/Controllers/UsersController.cs b/api/src/Controllers/UsersController.cs index 38cb664..8e7ed76 100644 --- a/api/src/Controllers/UsersController.cs +++ b/api/src/Controllers/UsersController.cs @@ -1,40 +1,39 @@ using Microsoft.AspNetCore.Mvc; using agologumApi.Models; -using agologumApi.Stores; +using agologumApi.Services; [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { - private readonly UserStore store_; + private readonly UserService service_; - public UsersController(UserStore store) + public UsersController(UserService service) { - store_ = store; + service_ = service; } [HttpGet] - public ActionResult> getUsers() + public async Task>> getUsers() { - return Ok(store_.getUsers()); + return Ok(await service_.GetAll()); } [HttpGet("{id:int}")] - public ActionResult getUser(int id) + public async Task> getUser(int id) { - var user = store_.getUser(id); + var user = await service_.Get(id); - if (user == null) - return NotFound(); + if (user == null) return NotFound(); return Ok(user); } [HttpPost] - public ActionResult createUser(User user) + public async Task> createUser(User user) { - var created = store_.createUser(user); + var created = await service_.Create(user); return CreatedAtAction( nameof(getUser), @@ -44,23 +43,21 @@ public class UsersController : ControllerBase } [HttpPut("{id}")] - public ActionResult updateUser(int id, User user) + public async Task> updateUser(int id, User user) { - var updated = store_.updateUser(id, user); + var updated = await service_.Update(user); - if (updated == null) - return NotFound(); + if (updated == null) return NotFound(); return Ok(updated); } [HttpDelete("{id}")] - public ActionResult deleteUser(int id) + public async Task deleteUser(int id) { - var success = store_.deleteUser(id); + var success = await service_.Delete(id); - if (!success) - return NotFound(); + if (success) return NotFound(); return NoContent(); } diff --git a/api/src/Stores/UserStore.cs b/api/src/Stores/UserStore.cs deleted file mode 100644 index 456bf33..0000000 --- a/api/src/Stores/UserStore.cs +++ /dev/null @@ -1,46 +0,0 @@ - -// temporary state management -// this will eventually change into a service that uses EnitityFramework for database interactions - -using agologumApi.Models; - -namespace agologumApi.Stores; - -public class UserStore { - - private readonly List users_ = new(); - private int nextId_ = 1; - - public List getUsers() { - return users_; - } - - public User? getUser(int id) { - return users_.FirstOrDefault(x => x.Id == id); - } - - public User createUser(User user) { - user.Id = nextId_++; - users_.Add(user); - return user; - } - - public User? updateUser(int id, User updated) { - var existing = users_.FirstOrDefault(x => x.Id == id); - if(existing == null) return null; - - existing.Name = updated.Name; - existing.Email = updated.Email; - - return existing; - } - - public bool deleteUser(int id) { - var existing = users_.FirstOrDefault(x => x.Id == id); - if(existing == null) return false; - - users_.Remove(existing); - return true; - } - -} \ No newline at end of file diff --git a/client/src/App.vue b/client/src/App.vue index efc0210..cd279a6 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -5,4 +5,4 @@ import index from './pages/index.vue' \ No newline at end of file + -- 2.49.1 From 509b8b003c932770cdfcf7b0864db65f65fc87d5 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 11:36:22 -0500 Subject: [PATCH 18/27] add the new files dummyhead --- api/src/Data/AppDbContext.cs | 13 +++++++++ api/src/Services/UserService.cs | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 api/src/Data/AppDbContext.cs create mode 100644 api/src/Services/UserService.cs diff --git a/api/src/Data/AppDbContext.cs b/api/src/Data/AppDbContext.cs new file mode 100644 index 0000000..49df799 --- /dev/null +++ b/api/src/Data/AppDbContext.cs @@ -0,0 +1,13 @@ + +using agologumApi.Models; + +using Microsoft.EntityFrameworkCore; + +public class AppDbContext : DbContext { + + public AppDbContext(DbContextOptions options) : base(options) { + + } + + public DbSet Users { get; set; } +} \ No newline at end of file diff --git a/api/src/Services/UserService.cs b/api/src/Services/UserService.cs new file mode 100644 index 0000000..0b085ec --- /dev/null +++ b/api/src/Services/UserService.cs @@ -0,0 +1,47 @@ + +using Microsoft.EntityFrameworkCore; + +using agologumApi.Models; + +namespace agologumApi.Services; + +public class UserService { + + private readonly AppDbContext db_; + + public UserService(AppDbContext db) { + db_ = db; + } + + public async Task> GetAll() { + return await db_.Users.ToListAsync(); + } + + public async Task Get(int id) { + return await db_.Users.FindAsync(id); + } + + public async Task Create(User user) { + db_.Users.Add(user); + await db_.SaveChangesAsync(); + return user; + } + + public async Task Update(User user) { + db_.Users.Update(user); + await db_.SaveChangesAsync(); + return user; + } + + public async Task Delete(int id) { + User? user = await db_.Users.FindAsync(id); + if(user != null) { + db_.Users.Remove(user); + await db_.SaveChangesAsync(); + return true; + } else { + return false; + } + } + +} \ No newline at end of file -- 2.49.1 From dd8864c56cdc41c78647631b75c2a997b1ab0f2e Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:26:35 -0500 Subject: [PATCH 19/27] test postgres integration --- api/appsettings.json | 2 +- api/docker-compose.prod.yaml | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/api/appsettings.json b/api/appsettings.json index 1059c4a..3bbbad3 100644 --- a/api/appsettings.json +++ b/api/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Port=5432;Database=devTest1;Username=devuser;Password=admin5" + "DefaultConnection": "Host=agologum-net;Port=5432;Database=agologum;Username=agologum;Password=${POSTGRES_PASSWORD}" }, "AllowedHosts": "*", "https_port": 443 diff --git a/api/docker-compose.prod.yaml b/api/docker-compose.prod.yaml index 17d2751..0a86a5f 100644 --- a/api/docker-compose.prod.yaml +++ b/api/docker-compose.prod.yaml @@ -1,8 +1,18 @@ +version: "3.9" + services: agologum-api: image: git.vxbard.net/homeburger/agologum-api:latest container_name: agologum-api restart: always + environment: + ConnectionStrings__DefaultConnection: Host=agologum-db;Port=5432;Database=agologum;Username=agologum;Password=${POSTGRES_PASSWORD} ports: - "5000:5000" + networks: + - agologum-net + +networks: + agologum-net: + external: true \ No newline at end of file -- 2.49.1 From c8c0a46bb684b0006cf8ca42cf32610b1aba72bb Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:46:00 -0500 Subject: [PATCH 20/27] pass secret to docker container --- .gitea/workflows/deploy-api.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/deploy-api.yaml b/.gitea/workflows/deploy-api.yaml index b86417e..96613b7 100644 --- a/.gitea/workflows/deploy-api.yaml +++ b/.gitea/workflows/deploy-api.yaml @@ -38,5 +38,7 @@ jobs: - name: Deploy container run: | + | + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} docker compose -f ./api/docker-compose.prod.yaml pull agologum-api docker compose -f ./api/docker-compose.prod.yaml up -d --force-recreate agologum-api -- 2.49.1 From 28f222ee28e37777172aea7466d32a16df05aff5 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:46:15 -0500 Subject: [PATCH 21/27] syntax error i love pipelines --- .gitea/workflows/deploy-api.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitea/workflows/deploy-api.yaml b/.gitea/workflows/deploy-api.yaml index 96613b7..6dc4943 100644 --- a/.gitea/workflows/deploy-api.yaml +++ b/.gitea/workflows/deploy-api.yaml @@ -38,7 +38,6 @@ jobs: - name: Deploy container run: | - | export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} docker compose -f ./api/docker-compose.prod.yaml pull agologum-api docker compose -f ./api/docker-compose.prod.yaml up -d --force-recreate agologum-api -- 2.49.1 From 2011d1fb3695f4debd85c09011d8973f60a858e0 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:52:43 -0500 Subject: [PATCH 22/27] attempt migrations at api startup --- api/Program.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/api/Program.cs b/api/Program.cs index 302b215..efa938c 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -57,4 +57,19 @@ if (app.Environment.IsEnvironment("Development")) { app.MapControllers(); +// attempt enitity-framework migrations at startup. love you stack overflow +using (var scope = app.Services.CreateScope()) { + var db = scope.ServiceProvider.GetRequiredService(); + + var retries = 10; + while (retries-- > 0) { + try { + db.Database.Migrate(); + break; + } catch { + Thread.Sleep(5000); + } + } +} + app.Run(); -- 2.49.1 From ea0afc4e628e32dc62be9f097e83ed3bf75d141b Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:54:59 -0500 Subject: [PATCH 23/27] trying something silly --- api/.gitignore | 2 +- .../20260314152859_InitialCreate.Designer.cs | 49 +++++++++++++++++++ .../20260314152859_InitialCreate.cs | 36 ++++++++++++++ api/Migrations/AppDbContextModelSnapshot.cs | 46 +++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 api/Migrations/20260314152859_InitialCreate.Designer.cs create mode 100644 api/Migrations/20260314152859_InitialCreate.cs create mode 100644 api/Migrations/AppDbContextModelSnapshot.cs diff --git a/api/.gitignore b/api/.gitignore index 1d9f974..f7b1493 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -25,7 +25,7 @@ bld/ project.lock.json project.fragment.lock.json artifacts/ -[Mm]igrations/ +#[Mm]igrations/ # NuGet Packages *.nupkg diff --git a/api/Migrations/20260314152859_InitialCreate.Designer.cs b/api/Migrations/20260314152859_InitialCreate.Designer.cs new file mode 100644 index 0000000..7d957ce --- /dev/null +++ b/api/Migrations/20260314152859_InitialCreate.Designer.cs @@ -0,0 +1,49 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace agologum_api.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20260314152859_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("agologumApi.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/Migrations/20260314152859_InitialCreate.cs b/api/Migrations/20260314152859_InitialCreate.cs new file mode 100644 index 0000000..2e0df2d --- /dev/null +++ b/api/Migrations/20260314152859_InitialCreate.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace agologum_api.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Email = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/api/Migrations/AppDbContextModelSnapshot.cs b/api/Migrations/AppDbContextModelSnapshot.cs new file mode 100644 index 0000000..112584c --- /dev/null +++ b/api/Migrations/AppDbContextModelSnapshot.cs @@ -0,0 +1,46 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace agologum_api.Migrations +{ + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("agologumApi.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); +#pragma warning restore 612, 618 + } + } +} -- 2.49.1 From 60215782c093ee09e46ffa21e7c1582610b7e5aa Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 15:59:08 -0500 Subject: [PATCH 24/27] fix delete return codes --- api/src/Controllers/UsersController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/Controllers/UsersController.cs b/api/src/Controllers/UsersController.cs index 8e7ed76..4178d19 100644 --- a/api/src/Controllers/UsersController.cs +++ b/api/src/Controllers/UsersController.cs @@ -57,7 +57,7 @@ public class UsersController : ControllerBase { var success = await service_.Delete(id); - if (success) return NotFound(); + if (!success) return NotFound(); return NoContent(); } -- 2.49.1 From fef9af6e910b3e59ecd850fe086489fb152601bb Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 16:06:05 -0500 Subject: [PATCH 25/27] add users link on homepage --- client/src/pages/UsersList.vue | 2 +- client/src/pages/index.vue | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/pages/UsersList.vue b/client/src/pages/UsersList.vue index 627cc90..8f9f7c5 100644 --- a/client/src/pages/UsersList.vue +++ b/client/src/pages/UsersList.vue @@ -22,7 +22,7 @@ onMounted(() => { diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue index 5f714a6..9795ec4 100644 --- a/client/src/pages/index.vue +++ b/client/src/pages/index.vue @@ -9,4 +9,5 @@

straight up gargoyling it !

yeah im so cool rn

imagining what I could do with themes :o

+ >Users -- 2.49.1 From 4b38a5e5978c9b84cb1673191435b70642007fd0 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 16:09:32 -0500 Subject: [PATCH 26/27] make links look like buttons --- client/src/pages/UsersList.vue | 6 +++++- client/src/pages/index.vue | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/client/src/pages/UsersList.vue b/client/src/pages/UsersList.vue index 8f9f7c5..c2f6bd8 100644 --- a/client/src/pages/UsersList.vue +++ b/client/src/pages/UsersList.vue @@ -22,7 +22,11 @@ onMounted(() => { diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue index 9795ec4..4e9fc51 100644 --- a/client/src/pages/index.vue +++ b/client/src/pages/index.vue @@ -9,5 +9,8 @@

straight up gargoyling it !

yeah im so cool rn

imagining what I could do with themes :o

- >Users + + + + -- 2.49.1 From d5aa15cccaef22d648a0f3b23f4fc816f62392f3 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Sat, 14 Mar 2026 16:11:56 -0500 Subject: [PATCH 27/27] I should really locally test my code --- client/src/pages/UsersList.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/pages/UsersList.vue b/client/src/pages/UsersList.vue index c2f6bd8..0fb4214 100644 --- a/client/src/pages/UsersList.vue +++ b/client/src/pages/UsersList.vue @@ -22,8 +22,8 @@ onMounted(() => {
{{ user.name }} - Edit + Edit
{{ user.name }} - Edit + Edit
{{ user.name }} - Edit + + + + +
{{ user.name }} - - + + -- 2.49.1