Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
yarn app:prettify
yarn server:prettify
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

yarn lint-staged
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ all: clean install
cp -r ./app/dist ./server/build/public

install:
${YARN}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
${YARN}
$(YARN)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's also add rm -rf ./node_modules to clean

cd ./app && $(YARN)
cd ./server && $(YARN)

Expand Down
37 changes: 17 additions & 20 deletions app/src/components/app/item-list.vue
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
<section class="position-relative d-flex">
<div
class="ms-3"
ref="twocolumns"
ref="twoColumns"
>
<table class="mb-0 position-relative table table-hover table-bordered">
<thead>
Expand Down Expand Up @@ -141,7 +141,7 @@
</tr>
</thead>

<tbody ref="metatbody">
<tbody ref="metaTableBody">
<tr
:class="{ 'table-primary': find(item) > -1 }"
v-for="item in items"
Expand Down Expand Up @@ -236,7 +236,7 @@
@click="(e) => handleItemSelect(e, item)"
>
<td
v-for="(key, index) in headers.slice(1)"
v-for="key in headers.slice(1)"
:key="key"
>
<div>{{ item[key] }}</div>
Expand All @@ -250,7 +250,7 @@
<div
class="scrollbar-container overflow-x-scroll sticky-bottom me-3"
@scroll="handleScroll"
ref="scrollcontainer"
ref="scrollContainer"
>
<hr
ref="scrollbar"
Expand Down Expand Up @@ -351,7 +351,7 @@
});

const router = useRouter();
const store: any = inject("store");
const store = inject("store") as any;
const emit = defineEmits(["reset", "unselect"]);

const sort = reactive({
Expand Down Expand Up @@ -403,7 +403,7 @@
});
};

const setSort = (key: any) => {
const setSort = (key: string) => {
const index = SORTS.findIndex((order) => order === sort.order);

if (sort.key === key) {
Expand All @@ -416,16 +416,15 @@
/* SORT */

/* SCROLL */
const row = ref(null);
const table = ref(null);
const tbody = ref(null);
const scrollbar = ref(null);
const twocolumns = ref(null);
const twoColumns = ref(null);
const tableContainer = ref(null);
const scrollcontainer = ref(null);
const scrollContainer = ref(null);
const tableHeaderContainer = ref(null);

const metatbody = ref(null);
const metaTableBody = ref(null);

watchEffect(() => {
if (props.isSelected) {
Expand All @@ -441,7 +440,7 @@
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
scrollbar.value.style.width = `${+table.value.scrollWidth}px`;
scrollcontainer.value.style.marginLeft = `${+twocolumns.value.scrollWidth + 14}px`;
scrollContainer.value.style.marginLeft = `${+twoColumns.value.scrollWidth + 14}px`;
});
},
);
Expand All @@ -461,22 +460,22 @@
() => items.value,
async () => {
await nextTick(() => {
const metarows = metatbody.value?.getElementsByTagName("tr")?.[0];
const metacells = metarows?.getElementsByTagName("td");
const metaRows = metaTableBody.value?.getElementsByTagName("tr")?.[0];
const metaCells = metaRows?.getElementsByTagName("td");

const rows = tbody.value?.getElementsByTagName("tr")?.[0];
const cells = rows?.getElementsByTagName("td");

if (cells && metacells) {
widths.value = [...metacells, ...cells].map((td) => td.getBoundingClientRect()?.width);
if (cells && metaCells) {
widths.value = [...metaCells, ...cells].map((td) => td.getBoundingClientRect()?.width);
}
});
},
);
/* RESIZE */

const handleScrollbarPosition = throttle((event) => {
scrollcontainer.value?.scroll({ left: event.target.scrollLeft });
scrollContainer.value?.scroll({ left: event.target.scrollLeft });
tableHeaderContainer.value?.scroll({ left: event.target.scrollLeft });
}, 0.5);

Expand Down Expand Up @@ -530,7 +529,7 @@
};
};

const find = (item: any) => {
const find = (item: Record<string, any>) => {
const index = selectedItems.value.findIndex((_item) => {
const pkMatch = pk.value ? _item[pk.value.AttributeName] === item[pk.value.AttributeName] : true;

Expand All @@ -542,7 +541,7 @@
return index;
};

const select = (item: any) => {
const select = (item: Record<string, any>) => {
emit("unselect");

const index = find(item);
Expand Down Expand Up @@ -619,8 +618,6 @@
const offcanvas = (item) => {
const bsOffcanvas = new bootstrap.Offcanvas(offcanvasRef.value);

const href = handleItem(item);

codeMirrorRef.value.dispatch({
changes: {
from: 0,
Expand Down
2 changes: 0 additions & 2 deletions app/src/views/items/CreateItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,6 @@
<script lang="ts">
import * as bootstrap from "bootstrap";

import * as CodeMirror from "codemirror";

import { useRoute, useRouter } from "vue-router";
import { inject, onMounted, reactive, ref, watch } from "vue";

Expand Down
13 changes: 5 additions & 8 deletions app/src/views/items/HomeTable.vue
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,6 @@
import { scanItems, queryItems, countItems } from "@/services/item";
import { generateDynamodbParameters } from "@/utils/table";

import type table from "@/store/table";

import ItemList from "@/components/app/item-list.vue";
import TableList from "@/components/app/table-list.vue";
import TableFilter from "@/components/app/table-filter.vue";
Expand All @@ -301,7 +299,7 @@

const route = useRoute();
const router = useRouter();
const store: any = inject("store");
const store = inject("store") as any;

const toastRef = ref(null);
const toast = reactive({
Expand Down Expand Up @@ -345,9 +343,10 @@

store.dynamodb.setters.init({ ...dynamodb, ...data });
store.ui.setters.setTable(table, [...rows, ...data.Items], data.Count, data.ScannedCount);
} catch (error: any) {
} catch (error: unknown) {
const err = error as any;
toast.className = "text-bg-danger";
toast.message = error.response.data.message ?? error.message;
toast.message = err.response?.data?.message ?? err.message;
const toastEl = new bootstrap.Toast(toastRef.value, { delay: 5000 });
setTimeout(() => toastEl.show(), 0);
}
Expand Down Expand Up @@ -425,7 +424,7 @@
if (!tableName) return;

// @TABLE
const [old_tableName, old_limit, old_page, old_parameters, old_indexName, old_requestId] = oldValues ?? [];
const [old_tableName, , , old_parameters, old_indexName, old_requestId] = oldValues ?? [];

{
if (tableName !== old_tableName) {
Expand All @@ -451,8 +450,6 @@
if (old_parameters !== _parameters || old_indexName !== _indexName || old_requestId !== requestId) {
const parameters = JSON.parse(decodeURIComponent(_parameters?.toString() ?? "{}"));

const dynamodb = { ...store.dynamodb.state };

const dynamodbParameters = generateDynamodbParameters({
parameters,
table: store.table.state.Table,
Expand Down
6 changes: 2 additions & 4 deletions app/src/views/table/TableTTL.vue
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,11 @@
import { TTL } from "@/constants/dynamodb";
import { useRoute, useRouter } from "vue-router";
import { getTableTTL, updateTableTTL } from "@/services/table";
import { computed, inject, onBeforeMount, reactive, ref } from "vue";
import { inject, onBeforeMount, reactive, ref } from "vue";

const route = useRoute();
const router = useRouter();
const store: any = inject("store");
const store = inject("store") as any;

const ttl = reactive({
TimeToLiveSpecification: {
Expand Down Expand Up @@ -139,8 +139,6 @@
}
};

const reset = () => {};

const toastRef = ref();
const toast = reactive({ className: "", message: "" });

Expand Down
12 changes: 11 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,20 @@
"server:lint:fix": "cd app && yarn lint:fix",
"app:lint": "cd app && yarn lint",
"app:lint:fix": "cd app && yarn lint:fix",
"prepare": "husky"
"prepare": "husky",
"lint-staged": "lint-staged"
},
"lint-staged": {
"app/**/*.{js,jsx,ts,tsx}": [
"yarn app:prettify"
],
"server/**/*.{js,jsx,ts,tsx}": [
"yarn server:prettify"
]
},
"devDependencies": {
"husky": "^9.1.7",
"lint-staged": "^16.1.0",
"prettier": "^3.0.3"
}
}
4 changes: 3 additions & 1 deletion server/src/constants/event.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export const EVENTS = {
const EVENTS = {
BEGIN: "BEGIN",
SUCCESS: "SUCCESS",
FAILURE: "FAILURE",
Expand All @@ -7,3 +7,5 @@ export const EVENTS = {
ACK: "ACK",
PROGRESS: "PROGRESS",
};

export default EVENTS;
2 changes: 1 addition & 1 deletion server/src/controllers/database.controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import EventEmitter from "events";
import AWS from "../config/aws";
import DatabaseServiceProvider from "../services/database.service";
import { EVENTS } from "../constants/event";
import EVENTS from "../constants/event";

const eventEmitter = new EventEmitter();

Expand Down
2 changes: 1 addition & 1 deletion server/src/controllers/item.controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { OPERATIONS } from "../constants/dynamodb";
import { isPartialMatchWith } from "../utils/object";
import isPartialMatchWith from "../utils/object";
import ItemServiceProvider from "../services/item.service";

const ItemService = new ItemServiceProvider();
Expand Down
2 changes: 1 addition & 1 deletion server/src/errors/handler.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export default function (error, _req, res, _next) {
export default function errorHandler(error, _req, res, _next) {
console.error(error);

if (error.isJoi) {
Expand Down
60 changes: 31 additions & 29 deletions server/src/services/database.service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AWS } from "../config/aws";
import { EVENTS } from "../constants/event";
import EVENTS from "../constants/event";

import ItemServiceProvider from "./item.service";
import TableServiceProvider from "./table.service";
Expand Down Expand Up @@ -29,14 +29,14 @@ export default class DatabaseServiceProvider {
/**
* @param {object} credentials
*/
async update(credentials) {
const { default: AWS } = await import("../config/aws");
AWS.initialize(credentials);
static async update(credentials) {
const { default: AWSConfig } = await import("../config/aws");
AWSConfig.initialize(credentials);
}

async reset() {
const { default: AWS } = await import("../config/aws");
AWS.initialize();
static async reset() {
const { default: AWSConfig } = await import("../config/aws");
AWSConfig.initialize();
}

/**
Expand All @@ -55,44 +55,46 @@ export default class DatabaseServiceProvider {
*
* @returns {Array<string>}
*/
restore(tables = [], uid, eventEmitter) {
restore(uid, eventEmitter, tables = []) {
const queue = [...tables];
const jobs = queue.splice(0, POOL_SIZE);
let counter = jobs.length;

eventEmitter.on(EVENTS.END, () => {
if (queue.length) {
const job = queue.shift();
run(job);
return;
}

if (--counter === 0) {
eventEmitter.emit(EVENTS.CLOSE, uid);
}
});

const run = async ({ source, target }) => {
const tableName = source;

try {
eventEmitter.emit(EVENTS.BEGIN, uid, { tableName });
eventEmitter.emit(EVENTS.BEGIN, uid, tableName);

const restore = TableServiceProvider.restore(source, target, this);
const restore = TableServiceProvider.restore(tableName, target, this);

// eslint-disable-next-line no-restricted-syntax
for await (const [ItemCount, TotalItemCount] of restore) {
eventEmitter.emit(EVENTS.PROGRESS, uid, { tableName, data: [ItemCount, TotalItemCount] });
}

eventEmitter.emit(EVENTS.SUCCESS, uid, { tableName });
eventEmitter.emit(EVENTS.SUCCESS, uid, tableName);
} catch (error) {
eventEmitter.emit(EVENTS.FAILURE, uid, { tableName, error });
// eslint-disable-next-line no-console
console.error(error);
} finally {
eventEmitter.emit(EVENTS.END, uid, { tableName });
eventEmitter.emit(EVENTS.FAILURE, uid, tableName);
}

eventEmitter.emit(EVENTS.END, uid, tableName);
};

eventEmitter.on(EVENTS.END, () => {
if (queue.length) {
const job = queue.shift();
run(job);
return;
}

counter -= 1;
if (counter === 0) {
eventEmitter.emit(EVENTS.CLOSE, uid);
}
});

jobs.map(run);

return tables;
Expand All @@ -109,8 +111,8 @@ export default class DatabaseServiceProvider {
this.SOURCE.TableService.describe(sourceTableName),
]);

const ItemCount = TargetTable.ItemCount;
const TotalItemCount = SourceTable.ItemCount;
const { ItemCount } = TargetTable;
const { ItemCount: TotalItemCount } = SourceTable;

return [ItemCount, TotalItemCount];
}
Expand Down
Loading