Skip to content
Draft
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
7 changes: 7 additions & 0 deletions src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import { createThirdPartyItemChecker } from './ports/ownership-checker/third-par
import { createParcelRightsComponent } from './adapters/parcel-rights-fetcher'
import { fetchNameOwner } from './logic/fetch-elements/fetch-name-owner'
import { fetchAllPermissions } from './logic/fetch-elements/fetch-permissions'
import { fetchUserLandsPermissions } from './logic/fetch-elements/fetch-users-permissions'

// Initialize all the components of the app
export async function initComponents(
Expand Down Expand Up @@ -112,6 +113,11 @@ export async function initComponents(
return { elements, totalAmount: elements.length }
})

const userPermissionsFetcher = createElementsFetcherComponent({ logs, theGraph }, async (_deps, address) => {
const elements = await fetchUserLandsPermissions({ theGraph, logs }, address)
return { elements, totalAmount: elements.length }
})

const resourcesStatusCheck = createResourcesStatusComponent({ logs })
const status = await createStatusComponent({ logs, fetch })

Expand Down Expand Up @@ -214,6 +220,7 @@ export async function initComponents(
namesFetcher,
landsFetcher,
landsPermissionsFetcher,
userPermissionsFetcher,
parcelRightsFetcher,
thirdPartyProvidersGraphFetcher,
thirdPartyProvidersStorage,
Expand Down
18 changes: 17 additions & 1 deletion src/controllers/handlers/user-lands-permissions-handler.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import { fetchAndPaginate, paginationObject } from '../../logic/pagination'
import { HandlerContextWithPath, LandPermission } from '../../types'

// TODO: support approvedForAll, operator and updateManagers
/**
* LEGACY Handler for fetching user land permissions
*
* @deprecated This endpoint is deprecated. Use `/users/:address/permissions` instead for comprehensive permissions.
*
* Returns only UpdateOperator permissions in the legacy format.
* For comprehensive permissions including ownership, use /users/:address/permissions instead.
*
* Query parameters:
* - pageSize: number - Number of results per page
* - pageNum: number - Page number
*/
export async function userLandsPermissionsHandler(
context: HandlerContextWithPath<'landsPermissionsFetcher', '/users/:address/lands-permissions'>
): Promise<{
status: 200
body: { elements: LandPermission[]; totalAmount: number; pageNum: number; pageSize: number }
headers?: Record<string, string>
}> {
const { address } = context.params
const { landsPermissionsFetcher } = context.components
Expand All @@ -16,10 +28,14 @@ export async function userLandsPermissionsHandler(
const { elements } = await landsPermissionsFetcher.fetchOwnedElements(address)
return elements
}, pagination)

return {
status: 200,
body: {
...page
},
headers: {
Deprecation: '1761578786'
}
}
}
39 changes: 39 additions & 0 deletions src/controllers/handlers/user-permissions-handler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { fetchAndPaginate, paginationObject } from '../../logic/pagination'
import { HandlerContextWithPath, WalletLandPermission } from '../../types'

/**
* Handler for fetching comprehensive user land permissions
*
* Returns all permission types:
* - owner: Direct parcel ownership
* - estateOwner: Ownership via estate
* - updateOperator: Parcel-level update operator
* - estateUpdateOperator: Estate-level update operator
* - updateManager: Address-level update manager
*
* Query parameters:
* - pageSize: number - Number of results per page
* - pageNum: number - Page number
*/
export async function userPermissionsHandler(
context: HandlerContextWithPath<'userPermissionsFetcher', '/users/:address/permissions'>
): Promise<{
status: 200
body: { elements: WalletLandPermission[]; totalAmount: number; pageNum: number; pageSize: number }
}> {
const { address } = context.params
const { userPermissionsFetcher } = context.components
const pagination = paginationObject(context.url, Number.MAX_VALUE)

const page = await fetchAndPaginate<WalletLandPermission>(async () => {
const { elements } = await userPermissionsFetcher.fetchOwnedElements(address)
return elements
}, pagination)

return {
status: 200,
body: {
...page
}
}
}
2 changes: 2 additions & 0 deletions src/controllers/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { parcelPermissionsHandler } from './handlers/parcel-permissions-handler'
import { parcelOperatorsHandler } from './handlers/parcel-operators-handler'
import { nameOwnerHandler } from './handlers/name-owner-handler'
import { userLandsPermissionsHandler } from './handlers/user-lands-permissions-handler'
import { userPermissionsHandler } from './handlers/user-permissions-handler'

// We return the entire router because it will be easier to test than a whole server
export async function setupRouter(_: GlobalContext): Promise<Router<GlobalContext>> {
Expand All @@ -41,6 +42,7 @@ export async function setupRouter(_: GlobalContext): Promise<Router<GlobalContex
router.get('/users/:address/parcels/:x/:y/permissions', parcelPermissionsHandler)
router.get('/users/:address/lands', landsHandler)
router.get('/users/:address/lands-permissions', userLandsPermissionsHandler)
router.get('/users/:address/permissions', userPermissionsHandler)
router.post('/profiles', profilesHandler)
router.get('/profiles/:id', profileHandler)
router.get('/nfts/collections', allCollectionsHandler)
Expand Down
Loading
Loading