Skip to content

Commit

Permalink
Update service arch
Browse files Browse the repository at this point in the history
  • Loading branch information
HugoRCD committed Nov 1, 2024
1 parent 555143c commit a98c515
Show file tree
Hide file tree
Showing 40 changed files with 197 additions and 200 deletions.
4 changes: 2 additions & 2 deletions apps/shelve/server/api/admin/users/[userId].delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteUser } from '~~/server/app/userService'
import type { H3Event } from 'h3'
import { deleteUser } from '~~/server/services/user.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
2 changes: 1 addition & 1 deletion apps/shelve/server/api/admin/users/[userId].put.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { H3Event } from 'h3'
import type { H3Event } from 'h3'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/auth/currentUser.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getUserByAuthToken } from '~~/server/app/tokenService'
import type { H3Event } from 'h3'
import { getUserByAuthToken } from '~~/server/services/token.service'

export default eventHandler(async (event: H3Event) => {
const authToken = getCookie(event, 'authToken') || ''
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/github/repos.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getUserRepos } from '~~/server/app/githubService'
import type { H3Event } from 'h3'
import { getUserRepos } from '~~/server/services/github.service'

export default defineEventHandler(async (event: H3Event) => {
return await getUserRepos(event)
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/github/upload.post.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { uploadFile } from '~~/server/app/githubService'
import type { H3Event } from 'h3'
import { uploadFile } from '~~/server/services/github.service'

export default defineEventHandler(async (event: H3Event) => {
const formData = await readMultipartFormData(event)
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/[id]/index.delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteProject } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { deleteProject } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/[id]/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getProjectById } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { getProjectById } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'id') as string
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/[id]/index.put.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { updateProject } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { updateProject } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/[id]/team/[teamId].delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { removeTeamFromProject } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { removeTeamFromProject } from '~~/server/services/project.service'

export default defineEventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'id') as string
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/[id]/team/[teamId].post.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { addTeamToProject } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { addTeamToProject } from '~~/server/services/project.service'

export default defineEventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'id') as string
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getProjectsByUserId } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { getProjectsByUserId } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/project/index.post.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { createProject } from '~~/server/app/projectService'
import type { H3Event } from 'h3'
import { createProject } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
3 changes: 1 addition & 2 deletions apps/shelve/server/api/project/name/[name].get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { H3Event } from 'h3'

import type { H3Event } from 'h3'

export default eventHandler(async (event: H3Event) => {
const paramName = getRouterParam(event, 'name')
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/teams/[teamId]/index.delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteTeam } from '~~/server/app/teamsService'
import type { H3Event } from 'h3'
import { deleteTeam } from '~~/server/services/teams.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/teams/[teamId]/members/[id].delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { removeMember } from '~~/server/app/teamsService'
import type { H3Event } from 'h3'
import { removeMember } from '~~/server/services/teams.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/teams/[teamId]/members/index.post.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { upsertMember } from '~~/server/app/teamsService'
import type { H3Event } from 'h3'
import { upsertMember } from '~~/server/services/teams.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/teams/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getTeamByUserId } from '~~/server/app/teamsService'
import type { H3Event } from 'h3'
import { getTeamByUserId } from '~~/server/services/teams.service'

export default eventHandler((event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/teams/index.post.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { H3Event } from 'h3'
import type { H3Event } from 'h3'
import type { CreateTeamInput } from '@shelve/types'
import { createTeam } from '~~/server/app/teamsService'
import { createTeam } from '~~/server/services/teams.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
3 changes: 1 addition & 2 deletions apps/shelve/server/api/tokens/[id].delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { H3Event } from 'h3'

import type { H3Event } from 'h3'

export default defineEventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/tokens/[token].get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getUserByAuthToken } from '~~/server/app/tokenService'
import type { H3Event } from 'h3'
import { getUserByAuthToken } from '~~/server/services/token.service'

export default defineEventHandler((event: H3Event) => {
const token = getRouterParam(event, 'token') as string
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/tokens/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getTokensByUserId } from '~~/server/app/tokenService'
import type { H3Event } from 'h3'
import { getTokensByUserId } from '~~/server/services/token.service'

export default defineEventHandler((event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/tokens/index.post.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { createToken } from '~~/server/app/tokenService'
import type { H3Event } from 'h3'
import { createToken } from '~~/server/services/token.service'

export default defineEventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/user/index.delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteUser } from '~~/server/app/userService'
import type { H3Event } from 'h3'
import { deleteUser } from '~~/server/services/user.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/user/index.put.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { H3Event } from 'h3'
import type { H3Event } from 'h3'
import type { UpdateUserInput } from '@shelve/types'
import { updateUser } from '~~/server/app/userService'
import { updateUser } from '~~/server/services/user.service'

export default eventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/user/teammate/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getTeammatesByUserId } from '~~/server/app/teammateService'
import type { H3Event } from 'h3'
import { getTeammatesByUserId } from '~~/server/services/teammate.service'

export default eventHandler((event: H3Event) => {
const { user } = event.context
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/variable/[id]/[env].delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteVariable } from '~~/server/app/variableService'
import type { H3Event } from 'h3'
import { deleteVariable } from '~~/server/services/variable.service'

export default eventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'id') as string
Expand Down
6 changes: 3 additions & 3 deletions apps/shelve/server/api/variable/[id]/[env].get.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Environment } from '@shelve/types'
import { H3Event } from 'h3'
import { getVariablesByProjectId } from '~~/server/app/variableService'
import type { Environment } from '@shelve/types'
import type { H3Event } from 'h3'
import { getVariablesByProjectId } from '~~/server/services/variable.service'

export default eventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'id') as string
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/variable/index.delete.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { deleteVariables } from '~~/server/app/variableService'
import type { H3Event } from 'h3'
import { deleteVariables } from '~~/server/services/variable.service'

export default defineEventHandler(async (event: H3Event) => {
const { user } = event.context
Expand Down
8 changes: 4 additions & 4 deletions apps/shelve/server/api/variable/index.post.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { type VariablesCreateInput } from '@shelve/types'
import { H3Event } from 'h3'
import { upsertVariable } from '~~/server/app/variableService'
import { getProjectById } from '~~/server/app/projectService'
import type { VariablesCreateInput } from '@shelve/types'
import type { H3Event } from 'h3'
import { upsertVariable } from '~~/server/services/variable.service'
import { getProjectById } from '~~/server/services/project.service'

export default eventHandler(async (event: H3Event) => {
const variablesCreateInput = await readBody(event) as VariablesCreateInput
Expand Down
4 changes: 2 additions & 2 deletions apps/shelve/server/api/variable/project/[projectId].get.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { H3Event } from 'h3'
import { getVariablesByProjectId } from '~~/server/app/variableService'
import type { H3Event } from 'h3'
import { getVariablesByProjectId } from '~~/server/services/variable.service'

export default eventHandler(async (event: H3Event) => {
const id = getRouterParam(event, 'projectId') as string
Expand Down
140 changes: 2 additions & 138 deletions apps/shelve/server/api/vault.ts
Original file line number Diff line number Diff line change
@@ -1,147 +1,11 @@
import type { DecryptResponse, EncryptRequest, StoredData, TTLFormat } from '@shelve/types'
import type { H3Event } from 'h3'
import { seal, unseal } from '@shelve/crypto'

class VaultService {

private readonly storage: Storage
private readonly encryptionKey: string
private readonly siteUrl: string
private readonly PREFIX = 'vault:'

private readonly TTL_MAP = {
'1d': 24 * 60 * 60, // 1 day in seconds
'7d': 7 * 24 * 60 * 60, // 7 days in seconds
'30d': 30 * 24 * 60 * 60 // 30 days in seconds
}

constructor() {
const config = useRuntimeConfig()
this.encryptionKey = config.private.encryptionKey
this.siteUrl = config.public.siteUrl
this.storage = useStorage('vault')
}

private generateKey(id: string): string {
return `${this.PREFIX}${id}`
}

private generateRandomId(): string {
return Math.random().toString(36).slice(2)
}

private calculateTimeLeft(createdAt: number, ttl: TTLFormat): number {
const ttlInSeconds = this.TTL_MAP[ttl]
const now = Date.now()
const expiresAt = createdAt + (ttlInSeconds * 1000)
return Math.max(0, Math.floor((expiresAt - now) / 1000))
}

private formatTimeLeft(seconds: number): string {
if (seconds <= 0) return 'Expired'

const days = Math.floor(seconds / (24 * 60 * 60))
const hours = Math.floor((seconds % (24 * 60 * 60)) / (60 * 60))
const minutes = Math.floor((seconds % (60 * 60)) / 60)

const parts = []

if (days > 0) {
parts.push(`${days}d`)
}
if (hours > 0) {
parts.push(`${hours}h`)
}
if (minutes > 0) {
parts.push(`${minutes}m`)
}

// If less than a minute left
if (parts.length === 0) {
return 'Less than 1 minute'
}

return parts.join(' ')
}

async decrypt(id: string): Promise<DecryptResponse> {
const key = this.generateKey(id)
const storedData = await this.storage.getItem<StoredData>(key)

if (!storedData) {
throw createError({
statusCode: 400,
statusMessage: 'Invalid id or link has expired'
})
}

const { encryptedValue, reads, createdAt, ttl } = storedData
const timeLeft = this.calculateTimeLeft(createdAt, ttl)

if (timeLeft <= 0) {
await this.storage.removeItem(key)
throw createError({
statusCode: 400,
statusMessage: 'Link has expired'
})
}

if (reads <= 0) {
await this.storage.removeItem(key)
throw createError({
statusCode: 400,
statusMessage: 'Maximum number of reads reached'
})
}

const decryptedValue = await unseal(encryptedValue, this.encryptionKey)

const updatedReads = reads - 1
await this.storage.setItem(key, {
...storedData,
reads: updatedReads
})

if (updatedReads === 0) {
await this.storage.removeItem(key)
}

return {
decryptedValue,
reads: updatedReads,
ttl: this.formatTimeLeft(timeLeft)
}
}

async encrypt(data: EncryptRequest): Promise<string> {
const encryptedValue = await seal(data.value, this.encryptionKey)
const randomId = this.generateRandomId()
const key = this.generateKey(randomId)

const storedData: StoredData = {
encryptedValue,
reads: data.reads,
createdAt: Date.now(),
ttl: data.ttl
}

await this.storage.setItem(key, storedData)
return this.generateShareUrl(randomId)
}

private generateShareUrl(id: string): string {
return `${this.siteUrl}/vault?id=${id}`
}

}
import { VaultService } from '~~/server/services/vault.service'

export default defineEventHandler(async (event: H3Event) => {
const vault = new VaultService()
const { id } = await getQuery(event)

if (id) {
return vault.decrypt(id)
}
if (id) return vault.decrypt(id)

const body = await readBody(event)
return vault.encrypt(body)
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit a98c515

Please sign in to comment.