add grid api endpoints and services
This commit is contained in:
parent
4030b19e9e
commit
da4c3d09f9
9 changed files with 402 additions and 19 deletions
|
|
@ -243,7 +243,11 @@ export class APIClient {
|
|||
throw new Error(error.error || `Failed to update party: ${response.statusText}`)
|
||||
}
|
||||
|
||||
return response.json()
|
||||
const data = await response.json()
|
||||
// The API returns { party: { ... } }, extract the party object
|
||||
const party = data.party || data
|
||||
// Transform the response to match our clean types
|
||||
return transformResponse(party)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -298,12 +302,46 @@ export class APIClient {
|
|||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a weapon in a party
|
||||
*/
|
||||
async updateWeapon(
|
||||
partyId: string,
|
||||
gridWeaponId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
element?: number
|
||||
}
|
||||
): Promise<any> {
|
||||
const editKey = this.getEditKey(partyId)
|
||||
|
||||
const response = await fetch(`/api/parties/${partyId}/weapons/${gridWeaponId}`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(updates)
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
throw new Error(error.error || `Failed to update weapon: ${response.statusText}`)
|
||||
}
|
||||
|
||||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a weapon from a party
|
||||
*/
|
||||
async removeWeapon(partyId: string, gridWeaponId: string): Promise<void> {
|
||||
const editKey = this.getEditKey(partyId)
|
||||
|
||||
console.log('Removing weapon:', { partyId, gridWeaponId, editKey })
|
||||
|
||||
const response = await fetch(`/api/parties/${partyId}/weapons`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
|
|
@ -314,7 +352,16 @@ export class APIClient {
|
|||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
console.error('Remove weapon failed:', response.status, response.statusText)
|
||||
// Try to get the response text to see what the server is returning
|
||||
const text = await response.text()
|
||||
console.error('Response body:', text)
|
||||
let error = { error: 'Failed to remove weapon' }
|
||||
try {
|
||||
error = JSON.parse(text)
|
||||
} catch (e) {
|
||||
// Not JSON, use the text as is
|
||||
}
|
||||
throw new Error(error.error || `Failed to remove weapon: ${response.statusText}`)
|
||||
}
|
||||
}
|
||||
|
|
@ -351,6 +398,38 @@ export class APIClient {
|
|||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a summon in a party
|
||||
*/
|
||||
async updateSummon(
|
||||
partyId: string,
|
||||
gridSummonId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
quickSummon?: boolean
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
}
|
||||
): Promise<any> {
|
||||
const editKey = this.getEditKey(partyId)
|
||||
|
||||
const response = await fetch(`/api/parties/${partyId}/summons/${gridSummonId}`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(updates)
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
throw new Error(error.error || `Failed to update summon: ${response.statusText}`)
|
||||
}
|
||||
|
||||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a summon from a party
|
||||
*/
|
||||
|
|
@ -367,7 +446,7 @@ export class APIClient {
|
|||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
const error = await response.json().catch(() => ({ error: 'Failed to remove summon' }))
|
||||
throw new Error(error.error || `Failed to remove summon: ${response.statusText}`)
|
||||
}
|
||||
}
|
||||
|
|
@ -404,6 +483,38 @@ export class APIClient {
|
|||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a character in a party
|
||||
*/
|
||||
async updateCharacter(
|
||||
partyId: string,
|
||||
gridCharacterId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
perpetuity?: boolean
|
||||
}
|
||||
): Promise<any> {
|
||||
const editKey = this.getEditKey(partyId)
|
||||
|
||||
const response = await fetch(`/api/parties/${partyId}/characters/${gridCharacterId}`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(updates)
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
throw new Error(error.error || `Failed to update character: ${response.statusText}`)
|
||||
}
|
||||
|
||||
return response.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a character from a party
|
||||
*/
|
||||
|
|
@ -420,7 +531,7 @@ export class APIClient {
|
|||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json()
|
||||
const error = await response.json().catch(() => ({ error: 'Failed to remove character' }))
|
||||
throw new Error(error.error || `Failed to remove character: ${response.statusText}`)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,35 @@ export async function addWeapon(
|
|||
return res.json()
|
||||
}
|
||||
|
||||
export async function updateWeapon(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
gridWeaponId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
element?: number
|
||||
},
|
||||
headers?: Record<string, string>
|
||||
): Promise<any> {
|
||||
const res = await fetch(buildUrl(`/grid_weapons/${gridWeaponId}`), {
|
||||
method: 'PUT',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...headers
|
||||
},
|
||||
body: JSON.stringify({ weapon: updates })
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to update weapon: ${res.statusText}`)
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
|
||||
export async function removeWeapon(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
|
|
@ -113,6 +142,35 @@ export async function addSummon(
|
|||
return res.json()
|
||||
}
|
||||
|
||||
export async function updateSummon(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
gridSummonId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
quickSummon?: boolean
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
},
|
||||
headers?: Record<string, string>
|
||||
): Promise<any> {
|
||||
const res = await fetch(buildUrl(`/grid_summons/${gridSummonId}`), {
|
||||
method: 'PUT',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...headers
|
||||
},
|
||||
body: JSON.stringify({ summon: updates })
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to update summon: ${res.statusText}`)
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
|
||||
export async function removeSummon(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
|
|
@ -175,6 +233,35 @@ export async function addCharacter(
|
|||
return res.json()
|
||||
}
|
||||
|
||||
export async function updateCharacter(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
gridCharacterId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
perpetuity?: boolean
|
||||
},
|
||||
headers?: Record<string, string>
|
||||
): Promise<any> {
|
||||
const res = await fetch(buildUrl(`/grid_characters/${gridCharacterId}`), {
|
||||
method: 'PUT',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...headers
|
||||
},
|
||||
body: JSON.stringify({ character: updates })
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to update character: ${res.statusText}`)
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
|
||||
export async function removeCharacter(
|
||||
fetch: FetchLike,
|
||||
partyId: string,
|
||||
|
|
|
|||
|
|
@ -109,6 +109,30 @@ export class GridService {
|
|||
)
|
||||
}
|
||||
|
||||
async updateWeapon(
|
||||
partyId: string,
|
||||
gridWeaponId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
element?: number
|
||||
},
|
||||
editKey?: string
|
||||
): Promise<Party> {
|
||||
const payload = {
|
||||
id: gridWeaponId,
|
||||
...updates
|
||||
}
|
||||
|
||||
return partiesApi.updateWeaponGrid(
|
||||
this.fetch,
|
||||
partyId,
|
||||
payload,
|
||||
this.buildHeaders(editKey)
|
||||
)
|
||||
}
|
||||
|
||||
async moveWeapon(
|
||||
partyId: string,
|
||||
gridWeaponId: string,
|
||||
|
|
@ -232,6 +256,30 @@ export class GridService {
|
|||
)
|
||||
}
|
||||
|
||||
async updateSummon(
|
||||
partyId: string,
|
||||
gridSummonId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
quickSummon?: boolean
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
},
|
||||
editKey?: string
|
||||
): Promise<Party> {
|
||||
const payload = {
|
||||
id: gridSummonId,
|
||||
...updates
|
||||
}
|
||||
|
||||
return partiesApi.updateSummonGrid(
|
||||
this.fetch,
|
||||
partyId,
|
||||
payload,
|
||||
this.buildHeaders(editKey)
|
||||
)
|
||||
}
|
||||
|
||||
async updateSummonUncap(
|
||||
partyId: string,
|
||||
gridSummonId: string,
|
||||
|
|
@ -340,6 +388,30 @@ export class GridService {
|
|||
)
|
||||
}
|
||||
|
||||
async updateCharacter(
|
||||
partyId: string,
|
||||
gridCharacterId: string,
|
||||
updates: {
|
||||
position?: number
|
||||
uncapLevel?: number
|
||||
transcendenceStep?: number
|
||||
perpetuity?: boolean
|
||||
},
|
||||
editKey?: string
|
||||
): Promise<Party> {
|
||||
const payload = {
|
||||
id: gridCharacterId,
|
||||
...updates
|
||||
}
|
||||
|
||||
return partiesApi.updateCharacterGrid(
|
||||
this.fetch,
|
||||
partyId,
|
||||
payload,
|
||||
this.buildHeaders(editKey)
|
||||
)
|
||||
}
|
||||
|
||||
async updateCharacterUncap(
|
||||
partyId: string,
|
||||
gridCharacterId: string,
|
||||
|
|
|
|||
|
|
@ -50,14 +50,13 @@ export const DELETE: RequestHandler = async ({ request, params, fetch }) => {
|
|||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl('/characters'), {
|
||||
// Forward to Rails API - use grid_characters endpoint with the ID
|
||||
const response = await fetch(buildUrl(`/grid_characters/${body.gridCharacterId}`), {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify({ grid_character_id: body.gridCharacterId })
|
||||
}
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
import { json, type RequestHandler } from '@sveltejs/kit'
|
||||
import { buildUrl } from '$lib/api/core'
|
||||
|
||||
/**
|
||||
* PUT /api/parties/[id]/characters/[characterId] - Update character in party
|
||||
* Proxies to Rails API with proper authentication
|
||||
*/
|
||||
|
||||
export const PUT: RequestHandler = async ({ request, params, fetch }) => {
|
||||
try {
|
||||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Transform to Rails API format
|
||||
const railsBody = {
|
||||
character: body
|
||||
}
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl(`/grid_characters/${params.characterId}`), {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(railsBody)
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
return json(data, { status: response.status })
|
||||
} catch (error) {
|
||||
console.error('Error updating character:', error)
|
||||
return json(
|
||||
{ error: 'Failed to update character' },
|
||||
{ status: 500 }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -52,14 +52,13 @@ export const DELETE: RequestHandler = async ({ request, params, fetch }) => {
|
|||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl('/summons'), {
|
||||
// Forward to Rails API - use grid_summons endpoint with the ID
|
||||
const response = await fetch(buildUrl(`/grid_summons/${body.gridSummonId}`), {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify({ grid_summon_id: body.gridSummonId })
|
||||
}
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
|
|
|
|||
38
src/routes/api/parties/[id]/summons/[summonId]/+server.ts
Normal file
38
src/routes/api/parties/[id]/summons/[summonId]/+server.ts
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import { json, type RequestHandler } from '@sveltejs/kit'
|
||||
import { buildUrl } from '$lib/api/core'
|
||||
|
||||
/**
|
||||
* PUT /api/parties/[id]/summons/[summonId] - Update summon in party
|
||||
* Proxies to Rails API with proper authentication
|
||||
*/
|
||||
|
||||
export const PUT: RequestHandler = async ({ request, params, fetch }) => {
|
||||
try {
|
||||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Transform to Rails API format
|
||||
const railsBody = {
|
||||
summon: body
|
||||
}
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl(`/grid_summons/${params.summonId}`), {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(railsBody)
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
return json(data, { status: response.status })
|
||||
} catch (error) {
|
||||
console.error('Error updating summon:', error)
|
||||
return json(
|
||||
{ error: 'Failed to update summon' },
|
||||
{ status: 500 }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -51,14 +51,15 @@ export const DELETE: RequestHandler = async ({ request, params, fetch }) => {
|
|||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl('/weapons'), {
|
||||
console.log('DELETE weapon request:', { body, params })
|
||||
|
||||
// Forward to Rails API - use grid_weapons endpoint with the ID
|
||||
const response = await fetch(buildUrl(`/grid_weapons/${body.gridWeaponId}`), {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify({ grid_weapon_id: body.gridWeaponId })
|
||||
}
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
|
|
|
|||
38
src/routes/api/parties/[id]/weapons/[weaponId]/+server.ts
Normal file
38
src/routes/api/parties/[id]/weapons/[weaponId]/+server.ts
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import { json, type RequestHandler } from '@sveltejs/kit'
|
||||
import { buildUrl } from '$lib/api/core'
|
||||
|
||||
/**
|
||||
* PUT /api/parties/[id]/weapons/[weaponId] - Update weapon in party
|
||||
* Proxies to Rails API with proper authentication
|
||||
*/
|
||||
|
||||
export const PUT: RequestHandler = async ({ request, params, fetch }) => {
|
||||
try {
|
||||
const body = await request.json()
|
||||
const editKey = request.headers.get('X-Edit-Key')
|
||||
|
||||
// Transform to Rails API format
|
||||
const railsBody = {
|
||||
weapon: body
|
||||
}
|
||||
|
||||
// Forward to Rails API
|
||||
const response = await fetch(buildUrl(`/grid_weapons/${params.weaponId}`), {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(editKey ? { 'X-Edit-Key': editKey } : {})
|
||||
},
|
||||
body: JSON.stringify(railsBody)
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
return json(data, { status: response.status })
|
||||
} catch (error) {
|
||||
console.error('Error updating weapon:', error)
|
||||
return json(
|
||||
{ error: 'Failed to update weapon' },
|
||||
{ status: 500 }
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue