@fleetbase/solid-engine 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ACL_SOLUTION.md +72 -0
- package/CSS_SCOPE_ISSUE.md +140 -0
- package/HOTFIX_SYNTAX_ERROR.md +100 -0
- package/LICENSE.md +651 -21
- package/MANUAL_ACL_SETUP.md +135 -0
- package/README.md +74 -27
- package/REFACTORING_SUMMARY.md +330 -0
- package/VERIFICATION_CHECKLIST.md +82 -0
- package/addon/components/modals/create-solid-folder.hbs +29 -0
- package/addon/components/modals/import-solid-resources.hbs +85 -0
- package/addon/controllers/data/content.js +17 -0
- package/addon/controllers/data/index.js +219 -0
- package/addon/controllers/home.js +84 -0
- package/addon/engine.js +1 -24
- package/addon/extension.js +26 -0
- package/addon/routes/data/content.js +11 -0
- package/addon/routes/data/index.js +17 -0
- package/addon/routes.js +2 -7
- package/addon/styles/solid-engine.css +1 -2
- package/addon/templates/account.hbs +3 -3
- package/addon/templates/application.hbs +2 -12
- package/addon/templates/data/content.hbs +48 -0
- package/addon/templates/{pods/explorer.hbs → data/index.hbs} +6 -5
- package/addon/templates/home.hbs +168 -10
- package/app/components/modals/{backup-pod.js → create-solid-folder.js} +1 -1
- package/app/components/modals/{resync-pod.js → import-solid-resources.js} +1 -1
- package/app/components/modals/{create-pod.js → setup-css-credentials.js} +1 -1
- package/composer.json +5 -11
- package/extension.json +2 -2
- package/index.js +0 -11
- package/package.json +9 -9
- package/server/migrations/2024_12_21_add_css_credentials_to_solid_identities_table.php +32 -0
- package/server/src/Client/OpenIDConnectClient.php +686 -15
- package/server/src/Client/SolidClient.php +104 -8
- package/server/src/Http/Controllers/DataController.php +261 -0
- package/server/src/Http/Controllers/OIDCController.php +42 -8
- package/server/src/Http/Controllers/SolidController.php +179 -85
- package/server/src/Models/SolidIdentity.php +13 -3
- package/server/src/Services/AclService.php +146 -0
- package/server/src/Services/PodService.php +863 -0
- package/server/src/Services/ResourceSyncService.php +336 -0
- package/server/src/Services/VehicleSyncService.php +289 -0
- package/server/src/Support/Utils.php +10 -0
- package/server/src/routes.php +25 -1
- package/addon/components/modals/backup-pod.hbs +0 -3
- package/addon/components/modals/create-pod.hbs +0 -5
- package/addon/components/modals/resync-pod.hbs +0 -3
- package/addon/controllers/pods/explorer/content.js +0 -12
- package/addon/controllers/pods/explorer.js +0 -149
- package/addon/controllers/pods/index/pod.js +0 -12
- package/addon/controllers/pods/index.js +0 -137
- package/addon/routes/pods/explorer/content.js +0 -10
- package/addon/routes/pods/explorer.js +0 -44
- package/addon/routes/pods/index/pod.js +0 -3
- package/addon/routes/pods/index.js +0 -21
- package/addon/templates/pods/explorer/content.hbs +0 -19
- package/addon/templates/pods/index/pod.hbs +0 -11
- package/addon/templates/pods/index.hbs +0 -19
- package/server/src/LegacyClient/Identity/IdentityProvider.php +0 -174
- package/server/src/LegacyClient/Identity/Profile.php +0 -18
- package/server/src/LegacyClient/OIDCClient.php +0 -350
- package/server/src/LegacyClient/Profile/WebID.php +0 -26
- package/server/src/LegacyClient/SolidClient.php +0 -271
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Manual ACL Setup Guide
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
CSS is not granting the `webid` scope even when requested during client registration and authentication. This means:
|
|
6
|
+
- Access tokens have `"scope": ""` (empty)
|
|
7
|
+
- Cannot programmatically update ACLs (requires `webid` scope)
|
|
8
|
+
- Must manually set up root ACL with proper permissions
|
|
9
|
+
|
|
10
|
+
## The Solution
|
|
11
|
+
|
|
12
|
+
Manually create the root ACL file for each pod using one of these methods:
|
|
13
|
+
|
|
14
|
+
### Method 1: Using curl (Recommended)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 1. Create ACL file
|
|
18
|
+
cat > /tmp/root.acl << 'EOF'
|
|
19
|
+
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
|
|
20
|
+
|
|
21
|
+
<#owner>
|
|
22
|
+
a acl:Authorization;
|
|
23
|
+
acl:agent <http://solid:3000/test/profile/card#me>;
|
|
24
|
+
acl:accessTo <http://solid:3000/test/>;
|
|
25
|
+
acl:default <http://solid:3000/test/>;
|
|
26
|
+
acl:mode acl:Read, acl:Write, acl:Control.
|
|
27
|
+
EOF
|
|
28
|
+
|
|
29
|
+
# 2. Upload to CSS (requires admin access or direct file system access)
|
|
30
|
+
curl -X PUT \
|
|
31
|
+
-H "Content-Type: text/turtle" \
|
|
32
|
+
--data-binary @/tmp/root.acl \
|
|
33
|
+
http://solid:3000/test/.acl
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Method 2: Direct File System Access
|
|
37
|
+
|
|
38
|
+
If you have access to the CSS server file system:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Navigate to the pod directory
|
|
42
|
+
cd /path/to/css/data/test/
|
|
43
|
+
|
|
44
|
+
# Create .acl file
|
|
45
|
+
cat > .acl << 'EOF'
|
|
46
|
+
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
|
|
47
|
+
|
|
48
|
+
<#owner>
|
|
49
|
+
a acl:Authorization;
|
|
50
|
+
acl:agent <http://solid:3000/test/profile/card#me>;
|
|
51
|
+
acl:accessTo <http://solid:3000/test/>;
|
|
52
|
+
acl:default <http://solid:3000/test/>;
|
|
53
|
+
acl:mode acl:Read, acl:Write, acl:Control.
|
|
54
|
+
EOF
|
|
55
|
+
|
|
56
|
+
# Set proper permissions
|
|
57
|
+
chmod 644 .acl
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Method 3: CSS Admin API (if available)
|
|
61
|
+
|
|
62
|
+
If your CSS instance has an admin API:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Use admin credentials to create ACL
|
|
66
|
+
curl -X PUT \
|
|
67
|
+
-H "Authorization: Bearer <admin_token>" \
|
|
68
|
+
-H "Content-Type: text/turtle" \
|
|
69
|
+
--data-binary @root.acl \
|
|
70
|
+
http://solid:3000/admin/pods/test/.acl
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## ACL Template
|
|
74
|
+
|
|
75
|
+
Replace `<WEBID>` and `<POD_URL>` with actual values:
|
|
76
|
+
|
|
77
|
+
```turtle
|
|
78
|
+
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
|
|
79
|
+
|
|
80
|
+
# Full control for the pod owner
|
|
81
|
+
<#owner>
|
|
82
|
+
a acl:Authorization;
|
|
83
|
+
acl:agent <WEBID>;
|
|
84
|
+
acl:accessTo <POD_URL>;
|
|
85
|
+
acl:default <POD_URL>;
|
|
86
|
+
acl:mode acl:Read, acl:Write, acl:Control.
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Example for test pod:**
|
|
90
|
+
- WebID: `http://solid:3000/test/profile/card#me`
|
|
91
|
+
- Pod URL: `http://solid:3000/test/`
|
|
92
|
+
|
|
93
|
+
## Verification
|
|
94
|
+
|
|
95
|
+
After setting up the ACL, verify it works:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Check WAC-Allow header (should now include "write")
|
|
99
|
+
curl -I http://solid:3000/test/
|
|
100
|
+
|
|
101
|
+
# Expected response:
|
|
102
|
+
# WAC-Allow: user="read write append control",public="read"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## For Fleetbase Integration
|
|
106
|
+
|
|
107
|
+
Once the root ACL is set up:
|
|
108
|
+
|
|
109
|
+
1. ✅ User can create folders
|
|
110
|
+
2. ✅ User can import resources
|
|
111
|
+
3. ✅ All descendants inherit permissions (via `acl:default`)
|
|
112
|
+
4. ✅ No need for programmatic ACL updates
|
|
113
|
+
|
|
114
|
+
## Why This Is Necessary
|
|
115
|
+
|
|
116
|
+
CSS does not grant `webid` scope by default, which means:
|
|
117
|
+
- Cannot use OIDC tokens to update ACLs programmatically
|
|
118
|
+
- Root ACL must be created manually during pod provisioning
|
|
119
|
+
- This is expected behavior for CSS security model
|
|
120
|
+
|
|
121
|
+
## Long-Term Solution
|
|
122
|
+
|
|
123
|
+
For production:
|
|
124
|
+
1. Configure CSS to grant `webid` scope (server configuration)
|
|
125
|
+
2. Or create root ACL during pod creation (provisioning hook)
|
|
126
|
+
3. Or use CSS admin API to set up ACLs automatically
|
|
127
|
+
|
|
128
|
+
## Current Status
|
|
129
|
+
|
|
130
|
+
- ✅ Authentication works (DPoP + OIDC)
|
|
131
|
+
- ✅ Read operations work
|
|
132
|
+
- ❌ Write operations fail (no ACL permissions)
|
|
133
|
+
- ❌ Cannot update ACL (no `webid` scope)
|
|
134
|
+
|
|
135
|
+
**Action Required:** Manually create root ACL for each pod using one of the methods above.
|
package/README.md
CHANGED
|
@@ -72,48 +72,95 @@ Solid, an innovative technology developed by Sir Tim Berners-Lee, offers a groun
|
|
|
72
72
|
|
|
73
73
|
### Fleetbase UI Updates
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Developer/User Guide:
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Fleetbase Solid ExtensionThis guide provides detailed instructions for integrating the Solid extension with your Fleetbase account. Solid is an innovative technology that lets users store their own data in personal online data stores, called "Pods," that they control. By using the Solid extension on Fleetbase, users can manage their data directly through the Fleetbase interface.
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
1. Create a New Fleetbase Account
|
|
80
|
+
- If you don't already have a Fleetbase account, you'll need to create one:
|
|
80
81
|
|
|
81
|
-
|
|
82
|
+
- Go to the Fleetbase website
|
|
83
|
+
- Click on "Sign Up" and follow the registration process.
|
|
84
|
+
- Verify your account as required.
|
|
82
85
|
|
|
83
|
-
-
|
|
86
|
+

|
|
84
87
|
|
|
85
|
-
|
|
88
|
+
2. Install the Solid Extension
|
|
89
|
+
- Once your Fleetbase account is active, follow these steps to install the Solid extension:
|
|
86
90
|
|
|
91
|
+
- Log in to your Fleetbase dashboard.Navigate to the Extensions section.
|
|
92
|
+
- Find the Solid extension and click "Install."Fleetbase Extensions Registry will be launching Q3 2024
|
|
87
93
|
|
|
88
|
-
|
|
94
|
+
3. Admin Configuration
|
|
95
|
+
- As an admin, you need to set up the Solid server for your organization:
|
|
89
96
|
|
|
90
|
-
|
|
97
|
+
- After installation, navigate to Admin so you can configure the Solid extension settings.
|
|
98
|
+
- Input the Solid server ID where your organization's data will be stored. This might be a private server or a service like solidcommunity.net
|
|
91
99
|
|
|
92
|
-
|
|
100
|
+

|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
4. Get Started with Solid
|
|
104
|
+
- Users must individually sign up for a Solid account:
|
|
105
|
+
|
|
106
|
+
- Click ‘Sign up for an account’ or Visit https://solidcommunity.net/register or your organization's own Solid server.
|
|
107
|
+
- Complete the registration process to create a new Solid account.
|
|
108
|
+
|
|
109
|
+

|
|
110
|
+
|
|
111
|
+
5. Retrieve Your Web ID
|
|
112
|
+
- Your Web ID is your unique identifier in the Solid ecosystem:
|
|
113
|
+
|
|
114
|
+
- After registering, your Web ID will typically be displayed on your Solid dashboard.Note this Web ID as it will be used to link your Solid account with Fleetbase.
|
|
115
|
+
|
|
116
|
+

|
|
117
|
+
|
|
118
|
+
6. Navigate to ‘Account’ in Fleetbase
|
|
119
|
+
- Once your Web ID is set up:Go back to Fleetbase and navigate to the ‘Account’ section. Your User details should be pulled in automatically if properly configured.
|
|
120
|
+
|
|
121
|
+

|
|
122
|
+
|
|
123
|
+
7. Navigate to PodsTo manage your Pods:
|
|
124
|
+
- In Fleetbase, find and navigate to the ‘Pods’ section after linking your Solid account.
|
|
125
|
+
|
|
126
|
+

|
|
127
|
+
|
|
128
|
+
8. Create a New POD
|
|
129
|
+
- Here’s how to create a new POD:
|
|
130
|
+
|
|
131
|
+
- Click “Create New POD.”Enter a name for your POD and submit.
|
|
132
|
+
|
|
133
|
+

|
|
134
|
+
|
|
135
|
+
9. Manage Files/Folders in PODs
|
|
136
|
+
- To access and manage data within a POD:
|
|
137
|
+
|
|
138
|
+
- Click into the POD you wish to view.
|
|
139
|
+
- You’ll see files and folders stored in this POD
|
|
140
|
+
|
|
141
|
+

|
|
142
|
+
|
|
143
|
+
10. Operations on PODsSelect
|
|
144
|
+
|
|
145
|
+
- Box Delete: To delete files or folders, select them and use the delete option.
|
|
146
|
+
- Re-sync / Back Up the PODs: To ensure your data is up-to-date, use the re-sync option to resynchronize the data in the POD.
|
|
147
|
+
|
|
148
|
+

|
|
149
|
+
|
|
150
|
+
11. View Data in Pods
|
|
151
|
+
- To view specific data within a POD:
|
|
152
|
+
|
|
153
|
+
- Simply click on the file or folder you are interested in within the POD interface in Fleetbase.
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
Next: We will continue work on completing the Sold <> Fleetbase integration with the following Further User Interface (UI) Enhancement for renaming Pods. Extensive User testing / bug fixes and production release.
|
|
93
158
|
|
|
94
159
|
### Features:
|
|
95
160
|
|
|
96
161
|
Fleetbase has implemented a Solid Client which implements the Standard Solid authentication methods to communicate with the server. The Fleetbase SolidClient is able to communicate securely with the Solid protocol using the Standard DPoP encryption method for authentication provided by the Solid specification (https://solidproject.org/TR/oidc#tokens-id)
|
|
97
162
|
|
|
98
163
|
- Ability to link Fleetbase account with Solid Web ID later via user settings.
|
|
99
|
-
- View and manage data stored on Solid Pod:
|
|
100
|
-
- Orders
|
|
101
|
-
- Payload
|
|
102
|
-
- Entity
|
|
103
|
-
- Service Quote
|
|
104
|
-
- Purchase Rate
|
|
105
|
-
- Retrieve list of Solid Pods approved to receive data.
|
|
106
|
-
- Ability to add approved pods to send order data too (Verification Process)
|
|
107
|
-
- View order details
|
|
108
|
-
- Send order details
|
|
109
|
-
- Select Pod to send order details too
|
|
110
|
-
- Send order details to Solid partners:
|
|
111
|
-
- View Order
|
|
112
|
-
- Send Order
|
|
113
|
-
- Select from Dropdown of Solid Partners
|
|
114
|
-
- Confirmation popup for sending data
|
|
115
|
-
- Review and confirm data to be sent
|
|
116
|
-
- Access a separate table to view all data shared with you or shared with other Solid users.
|
|
117
164
|
|
|
118
165
|
# Funding
|
|
119
166
|
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
# Solid Extension Refactoring Summary
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Refactored the Fleetbase Solid Protocol extension from a multi-pod architecture to a single-pod architecture with user-friendly terminology.
|
|
5
|
+
|
|
6
|
+
## Key Changes
|
|
7
|
+
|
|
8
|
+
### Terminology Updates
|
|
9
|
+
- **"Pods" → "Data"**: More intuitive for users to understand they're managing their data
|
|
10
|
+
- **"Container" → "Folder"**: Familiar file system metaphor instead of technical Solid terminology
|
|
11
|
+
|
|
12
|
+
### Architecture Shift
|
|
13
|
+
**Before (Multi-Pod):**
|
|
14
|
+
- Users could create multiple pods
|
|
15
|
+
- Complex pod listing and management UI
|
|
16
|
+
- Cross-pod authentication issues
|
|
17
|
+
- Routes: `pods`, `pods.index`, `pods.explorer`, `pods.index.pod`
|
|
18
|
+
|
|
19
|
+
**After (Single-Pod):**
|
|
20
|
+
- Users have ONE primary pod from OIDC authentication
|
|
21
|
+
- Data organized in folders within the pod (vehicles/, drivers/, contacts/, orders/)
|
|
22
|
+
- Simplified permissions model
|
|
23
|
+
- Routes: `data`, `data.content`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Frontend Changes
|
|
28
|
+
|
|
29
|
+
### Routes Refactored
|
|
30
|
+
**File:** `addon/routes.js`
|
|
31
|
+
|
|
32
|
+
**Old Structure:**
|
|
33
|
+
```javascript
|
|
34
|
+
this.route('pods', function () {
|
|
35
|
+
this.route('explorer', { path: '/explorer/:id' }, function () {
|
|
36
|
+
this.route('content', { path: '/~/:slug' });
|
|
37
|
+
});
|
|
38
|
+
this.route('index', { path: '/' }, function () {
|
|
39
|
+
this.route('pod', { path: '/pod/:slug' });
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**New Structure:**
|
|
45
|
+
```javascript
|
|
46
|
+
this.route('data', { path: '/data' }, function () {
|
|
47
|
+
this.route('content', { path: '/:slug' });
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Files Created
|
|
52
|
+
1. **`addon/routes/data/index.js`** - Main data browser route
|
|
53
|
+
2. **`addon/routes/data/content.js`** - Folder navigation route
|
|
54
|
+
3. **`addon/controllers/data/index.js`** - Data browser controller with folder operations
|
|
55
|
+
4. **`addon/controllers/data/content.js`** - Folder content controller
|
|
56
|
+
5. **`addon/templates/data/index.hbs`** - Data browser template
|
|
57
|
+
6. **`addon/templates/data/content.hbs`** - Folder content viewer template
|
|
58
|
+
|
|
59
|
+
### Files Removed
|
|
60
|
+
- `addon/routes/pods/` (entire directory)
|
|
61
|
+
- `addon/controllers/pods/` (entire directory)
|
|
62
|
+
- `addon/templates/pods/` (entire directory)
|
|
63
|
+
|
|
64
|
+
### Files Updated
|
|
65
|
+
1. **`addon/templates/application.hbs`**
|
|
66
|
+
- Updated sidebar navigation: `console.solid-protocol.pods` → `console.solid-protocol.data`
|
|
67
|
+
|
|
68
|
+
2. **`addon/templates/home.hbs`**
|
|
69
|
+
- "Browse Pods" → "Browse Data"
|
|
70
|
+
- "Explore and manage your Solid pods" → "Explore and manage your Fleetops data in Solid"
|
|
71
|
+
- Updated all pod references to use "storage" terminology
|
|
72
|
+
|
|
73
|
+
3. **`addon/controllers/home.js`**
|
|
74
|
+
- `navigateToPods()` now routes to `console.solid-protocol.data`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Backend Changes
|
|
79
|
+
|
|
80
|
+
### New Controller
|
|
81
|
+
**File:** `server/src/Http/Controllers/DataController.php`
|
|
82
|
+
|
|
83
|
+
**Methods:**
|
|
84
|
+
- `index()` - Get root level contents of user's pod
|
|
85
|
+
- `showFolder($slug)` - Get contents of a specific folder
|
|
86
|
+
- `createFolder()` - Create a new folder in the pod
|
|
87
|
+
- `deleteItem($type, $slug)` - Delete a file or folder
|
|
88
|
+
- `importResources()` - Import Fleetops resources into folders
|
|
89
|
+
|
|
90
|
+
### Routes Updated
|
|
91
|
+
**File:** `server/src/routes.php`
|
|
92
|
+
|
|
93
|
+
**Old Routes:**
|
|
94
|
+
```php
|
|
95
|
+
$router->get('pods', 'PodController@index');
|
|
96
|
+
$router->post('pods', 'PodController@create');
|
|
97
|
+
$router->get('pods/{podId}', 'PodController@show');
|
|
98
|
+
$router->delete('pods/{podId}', 'PodController@destroy');
|
|
99
|
+
$router->post('import-resources', 'PodController@importResources');
|
|
100
|
+
|
|
101
|
+
$router->get('containers', 'ContainerController@index');
|
|
102
|
+
$router->post('containers', 'ContainerController@create');
|
|
103
|
+
$router->delete('containers/{containerName}', 'ContainerController@destroy');
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**New Routes:**
|
|
107
|
+
```php
|
|
108
|
+
$router->get('data', 'DataController@index');
|
|
109
|
+
$router->get('data/folder/{slug}', 'DataController@showFolder');
|
|
110
|
+
$router->post('data/folder', 'DataController@createFolder');
|
|
111
|
+
$router->delete('data/{type}/{slug}', 'DataController@deleteItem');
|
|
112
|
+
$router->post('data/import', 'DataController@importResources');
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Service Methods Added
|
|
116
|
+
**File:** `server/src/Services/PodService.php`
|
|
117
|
+
|
|
118
|
+
**New Methods:**
|
|
119
|
+
- `createFolder(SolidIdentity $identity, string $folderUrl): bool`
|
|
120
|
+
- Creates a folder (LDP BasicContainer) in the pod
|
|
121
|
+
- Uses PUT request with proper Content-Type and Link headers
|
|
122
|
+
|
|
123
|
+
- `deleteResource(SolidIdentity $identity, string $resourceUrl): bool`
|
|
124
|
+
- Deletes a file or folder from the pod
|
|
125
|
+
- Uses DELETE request
|
|
126
|
+
|
|
127
|
+
**Existing Method Used:**
|
|
128
|
+
- `getPodUrlFromWebId(string $webId): string`
|
|
129
|
+
- Extracts the pod URL from the user's WebID
|
|
130
|
+
- Example: `http://solid:3000/test/profile/card#me` → `http://solid:3000/test/`
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## API Endpoint Mapping
|
|
135
|
+
|
|
136
|
+
### Frontend → Backend
|
|
137
|
+
| Frontend Route | API Endpoint | Controller Method |
|
|
138
|
+
|----------------|--------------|-------------------|
|
|
139
|
+
| `data.index` | `GET /data` | `DataController@index` |
|
|
140
|
+
| `data.content/:slug` | `GET /data/folder/:slug` | `DataController@showFolder` |
|
|
141
|
+
| Create folder action | `POST /data/folder` | `DataController@createFolder` |
|
|
142
|
+
| Delete item action | `DELETE /data/:type/:slug` | `DataController@deleteItem` |
|
|
143
|
+
| Import resources | `POST /data/import` | `DataController@importResources` |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## User Experience Improvements
|
|
148
|
+
|
|
149
|
+
### Navigation
|
|
150
|
+
- **Sidebar:** "Data" instead of "Pods"
|
|
151
|
+
- **Home Page:** "Browse Data" quick action
|
|
152
|
+
- **Breadcrumbs:** Will show folder hierarchy instead of pod names
|
|
153
|
+
|
|
154
|
+
### Data Browser Features
|
|
155
|
+
1. **Folder Management**
|
|
156
|
+
- Create new folders with "New Folder" button
|
|
157
|
+
- Browse folders like a file explorer
|
|
158
|
+
- Delete folders and files
|
|
159
|
+
|
|
160
|
+
2. **Resource Import**
|
|
161
|
+
- "Import Resources" button in data browser
|
|
162
|
+
- Select resource types: Vehicles, Drivers, Contacts, Orders
|
|
163
|
+
- Resources imported into respective folders in the pod
|
|
164
|
+
|
|
165
|
+
3. **File Operations**
|
|
166
|
+
- View file information in overlay
|
|
167
|
+
- Open files in new tab
|
|
168
|
+
- Delete files with confirmation
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Technical Benefits
|
|
173
|
+
|
|
174
|
+
### Simplified Architecture
|
|
175
|
+
1. **No Multi-Pod Management**
|
|
176
|
+
- Removed pod listing complexity
|
|
177
|
+
- Removed pod creation/deletion UI
|
|
178
|
+
- Removed pod selection logic
|
|
179
|
+
|
|
180
|
+
2. **Single Authentication Flow**
|
|
181
|
+
- One DPoP-bound access token for the user's pod
|
|
182
|
+
- No cross-pod permission issues
|
|
183
|
+
- Cleaner token management
|
|
184
|
+
|
|
185
|
+
3. **Standard Solid Patterns**
|
|
186
|
+
- Follows Solid specification for single-pod-per-user
|
|
187
|
+
- Uses LDP containers (folders) for organization
|
|
188
|
+
- Proper RDF/Turtle format for resources
|
|
189
|
+
|
|
190
|
+
### Code Cleanliness
|
|
191
|
+
1. **Removed Unused Code**
|
|
192
|
+
- Deleted 12 files related to multi-pod management
|
|
193
|
+
- Removed unused routes and controllers
|
|
194
|
+
- Cleaner route structure (2 routes vs 4)
|
|
195
|
+
|
|
196
|
+
2. **Clear Naming**
|
|
197
|
+
- `DataController` vs `PodController` - clearer intent
|
|
198
|
+
- `data/folder` routes - self-documenting
|
|
199
|
+
- User-facing terms match technical implementation
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Data Organization
|
|
204
|
+
|
|
205
|
+
### Pod Structure
|
|
206
|
+
```
|
|
207
|
+
http://solid:3000/user/
|
|
208
|
+
├── vehicles/
|
|
209
|
+
│ ├── vehicle-uuid-1.ttl
|
|
210
|
+
│ ├── vehicle-uuid-2.ttl
|
|
211
|
+
│ └── ...
|
|
212
|
+
├── drivers/
|
|
213
|
+
│ ├── driver-uuid-1.ttl
|
|
214
|
+
│ └── ...
|
|
215
|
+
├── contacts/
|
|
216
|
+
│ ├── contact-uuid-1.ttl
|
|
217
|
+
│ └── ...
|
|
218
|
+
└── orders/
|
|
219
|
+
├── order-uuid-1.ttl
|
|
220
|
+
└── ...
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Resource Format
|
|
224
|
+
Each resource is stored as an RDF/Turtle file with semantic metadata following Solid conventions.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Next Steps
|
|
229
|
+
|
|
230
|
+
### Testing Required
|
|
231
|
+
1. **Authentication Flow**
|
|
232
|
+
- Verify OIDC authentication still works
|
|
233
|
+
- Check DPoP token binding
|
|
234
|
+
- Confirm pod URL extraction from WebID
|
|
235
|
+
|
|
236
|
+
2. **Data Browser**
|
|
237
|
+
- Test folder creation
|
|
238
|
+
- Test folder navigation
|
|
239
|
+
- Test file deletion
|
|
240
|
+
- Test search functionality
|
|
241
|
+
|
|
242
|
+
3. **Resource Import**
|
|
243
|
+
- Test importing vehicles
|
|
244
|
+
- Test importing drivers
|
|
245
|
+
- Test importing contacts
|
|
246
|
+
- Test importing orders
|
|
247
|
+
- Verify RDF/Turtle format
|
|
248
|
+
- Check folder creation for each resource type
|
|
249
|
+
|
|
250
|
+
4. **Error Handling**
|
|
251
|
+
- Test 401 unauthorized scenarios
|
|
252
|
+
- Test invalid folder names
|
|
253
|
+
- Test deleting non-existent resources
|
|
254
|
+
|
|
255
|
+
### Future Enhancements
|
|
256
|
+
1. **Incremental Sync**
|
|
257
|
+
- Only sync changed resources
|
|
258
|
+
- Track last sync timestamp
|
|
259
|
+
- Show sync status per resource type
|
|
260
|
+
|
|
261
|
+
2. **Resource Filtering**
|
|
262
|
+
- Filter by date range
|
|
263
|
+
- Filter by status
|
|
264
|
+
- Search within resources
|
|
265
|
+
|
|
266
|
+
3. **Sync History**
|
|
267
|
+
- Track sync operations
|
|
268
|
+
- Show sync logs
|
|
269
|
+
- Rollback capability
|
|
270
|
+
|
|
271
|
+
4. **Real-time Sync**
|
|
272
|
+
- Webhook integration with Fleetops
|
|
273
|
+
- Automatic sync on data changes
|
|
274
|
+
- Conflict resolution
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Migration Notes
|
|
279
|
+
|
|
280
|
+
### For Developers
|
|
281
|
+
- Update any references to `pods` routes to use `data` routes
|
|
282
|
+
- Replace `PodController` usage with `DataController`
|
|
283
|
+
- Update API calls from `import-resources` to `data/import`
|
|
284
|
+
- Remove any pod selection logic from components
|
|
285
|
+
|
|
286
|
+
### For Users
|
|
287
|
+
- Existing data: Users will need to re-import resources into their primary pod
|
|
288
|
+
- No action required for authentication - existing OIDC flow remains the same
|
|
289
|
+
- UI will automatically reflect new "Data" terminology
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Files Modified Summary
|
|
294
|
+
|
|
295
|
+
### Created (7 files)
|
|
296
|
+
- `addon/routes/data/index.js`
|
|
297
|
+
- `addon/routes/data/content.js`
|
|
298
|
+
- `addon/controllers/data/index.js`
|
|
299
|
+
- `addon/controllers/data/content.js`
|
|
300
|
+
- `addon/templates/data/index.hbs`
|
|
301
|
+
- `addon/templates/data/content.hbs`
|
|
302
|
+
- `server/src/Http/Controllers/DataController.php`
|
|
303
|
+
|
|
304
|
+
### Modified (6 files)
|
|
305
|
+
- `addon/routes.js`
|
|
306
|
+
- `addon/templates/application.hbs`
|
|
307
|
+
- `addon/templates/home.hbs`
|
|
308
|
+
- `addon/controllers/home.js`
|
|
309
|
+
- `server/src/routes.php`
|
|
310
|
+
- `server/src/Services/PodService.php`
|
|
311
|
+
|
|
312
|
+
### Deleted (12 files)
|
|
313
|
+
- `addon/routes/pods/explorer.js`
|
|
314
|
+
- `addon/routes/pods/explorer/content.js`
|
|
315
|
+
- `addon/routes/pods/index.js`
|
|
316
|
+
- `addon/routes/pods/index/pod.js`
|
|
317
|
+
- `addon/controllers/pods/explorer.js`
|
|
318
|
+
- `addon/controllers/pods/explorer/content.js`
|
|
319
|
+
- `addon/controllers/pods/index.js`
|
|
320
|
+
- `addon/controllers/pods/index/pod.js`
|
|
321
|
+
- `addon/templates/pods/explorer.hbs`
|
|
322
|
+
- `addon/templates/pods/explorer/content.hbs`
|
|
323
|
+
- `addon/templates/pods/index.hbs`
|
|
324
|
+
- `addon/templates/pods/index/pod.hbs`
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Conclusion
|
|
329
|
+
|
|
330
|
+
This refactoring significantly simplifies the Solid extension architecture while improving user experience through familiar terminology. The single-pod approach aligns with Solid best practices and eliminates cross-pod authentication complexity. The codebase is now cleaner, more maintainable, and easier for developers to understand.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Refactoring Verification Checklist
|
|
2
|
+
|
|
3
|
+
## Code Cleanup ✓
|
|
4
|
+
- [x] Removed old `addon/routes/pods/` directory
|
|
5
|
+
- [x] Removed old `addon/controllers/pods/` directory
|
|
6
|
+
- [x] Removed old `addon/templates/pods/` directory
|
|
7
|
+
- [x] Removed `server/src/Http/Controllers/PodController.php`
|
|
8
|
+
- [x] Removed `server/src/Http/Controllers/ContainerController.php`
|
|
9
|
+
- [x] Removed commented code from `addon/templates/application.hbs`
|
|
10
|
+
- [x] Removed commented routes from `server/src/routes.php`
|
|
11
|
+
|
|
12
|
+
## New Files Created ✓
|
|
13
|
+
- [x] `addon/routes/data/index.js`
|
|
14
|
+
- [x] `addon/routes/data/content.js`
|
|
15
|
+
- [x] `addon/controllers/data/index.js`
|
|
16
|
+
- [x] `addon/controllers/data/content.js`
|
|
17
|
+
- [x] `addon/templates/data/index.hbs`
|
|
18
|
+
- [x] `addon/templates/data/content.hbs`
|
|
19
|
+
- [x] `server/src/Http/Controllers/DataController.php`
|
|
20
|
+
|
|
21
|
+
## Routes Updated ✓
|
|
22
|
+
- [x] `addon/routes.js` - Simplified to data routes
|
|
23
|
+
- [x] `server/src/routes.php` - Updated API endpoints
|
|
24
|
+
|
|
25
|
+
## Templates Updated ✓
|
|
26
|
+
- [x] `addon/templates/application.hbs` - Sidebar navigation
|
|
27
|
+
- [x] `addon/templates/home.hbs` - Quick actions and terminology
|
|
28
|
+
|
|
29
|
+
## Controllers Updated ✓
|
|
30
|
+
- [x] `addon/controllers/home.js` - Navigation method
|
|
31
|
+
|
|
32
|
+
## Services Updated ✓
|
|
33
|
+
- [x] `server/src/Services/PodService.php` - Added createFolder() and deleteResource()
|
|
34
|
+
|
|
35
|
+
## Terminology Changes ✓
|
|
36
|
+
- [x] "Pods" → "Data" throughout UI
|
|
37
|
+
- [x] "Container" → "Folder" in code comments and user-facing text
|
|
38
|
+
- [x] Updated all user-facing messages
|
|
39
|
+
|
|
40
|
+
## Testing Required
|
|
41
|
+
- [ ] OIDC authentication flow
|
|
42
|
+
- [ ] Pod URL extraction from WebID
|
|
43
|
+
- [ ] Data browser loads correctly
|
|
44
|
+
- [ ] Folder creation works
|
|
45
|
+
- [ ] Folder navigation works
|
|
46
|
+
- [ ] File/folder deletion works
|
|
47
|
+
- [ ] Resource import (vehicles, drivers, contacts, orders)
|
|
48
|
+
- [ ] Search functionality
|
|
49
|
+
- [ ] Error handling (401, invalid inputs)
|
|
50
|
+
|
|
51
|
+
## API Endpoints to Test
|
|
52
|
+
|
|
53
|
+
### GET /solid/int/v1/data
|
|
54
|
+
Expected: Returns root contents of user's pod
|
|
55
|
+
|
|
56
|
+
### GET /solid/int/v1/data/folder/{slug}
|
|
57
|
+
Expected: Returns contents of specified folder
|
|
58
|
+
|
|
59
|
+
### POST /solid/int/v1/data/folder
|
|
60
|
+
Payload: `{ "name": "test-folder", "path": "" }`
|
|
61
|
+
Expected: Creates new folder
|
|
62
|
+
|
|
63
|
+
### DELETE /solid/int/v1/data/{type}/{slug}
|
|
64
|
+
Example: `DELETE /solid/int/v1/data/folder/vehicles`
|
|
65
|
+
Expected: Deletes specified folder or file
|
|
66
|
+
|
|
67
|
+
### POST /solid/int/v1/data/import
|
|
68
|
+
Payload: `{ "resource_types": ["vehicles", "drivers"] }`
|
|
69
|
+
Expected: Imports selected resources into folders
|
|
70
|
+
|
|
71
|
+
## Files Count Summary
|
|
72
|
+
- **Created:** 7 files
|
|
73
|
+
- **Modified:** 6 files
|
|
74
|
+
- **Deleted:** 14 files (12 frontend + 2 backend)
|
|
75
|
+
- **Net change:** -1 files (cleaner codebase!)
|
|
76
|
+
|
|
77
|
+
## Code Quality Checks
|
|
78
|
+
- [x] No references to old `pods.explorer` or `pods.index` routes
|
|
79
|
+
- [x] No references to `PodController` or `ContainerController`
|
|
80
|
+
- [x] All imports and dependencies updated
|
|
81
|
+
- [x] Consistent naming conventions (data/folder)
|
|
82
|
+
- [x] Clean, readable code structure
|