diff --git a/manyfold/README.md b/manyfold/README.md index efb6664..5bc85b9 100644 --- a/manyfold/README.md +++ b/manyfold/README.md @@ -16,6 +16,7 @@ $ docker load < $(nix-build nix/docker.nix) | environment variable | default | info | |-----------------------|--------------|------------------------| | `APPNAME` | `manyfold` | manyfold instance name | +| `HOMEPAGE` | `/models` | show '/models' URL as homepage (use `/` for manyfold default) | | `THEME` | `default` | bootstrap theme | | `RUNTESTS` | `0` | set to `1` to run XRForge related [/test](test) scripts | | `NO_OVERLAYFS` | `` | disable the filesystem overlay mechanism | diff --git a/manyfold/cli/manyfold.sh b/manyfold/cli/manyfold.sh index 4ce5da7..6689159 100755 --- a/manyfold/cli/manyfold.sh +++ b/manyfold/cli/manyfold.sh @@ -2,6 +2,8 @@ oci=$(which podman || which docker) test -n "$APPNAME" || APPNAME=xrforge test -n "$UPLOAD_PATH" || UPLOAD_PATH=/mnt/experiences +test -n "$THEME" || THEME=vapor # xrforge (public/assets/themes/xrforge.css gives err) +test -n "$HOMEPAGE" || HOMEPAGE=/models db=/config/manyfold.sqlite3 # utility funcs @@ -28,7 +30,8 @@ run(){ -e SUDO_RUN_UNSAFELY=enabled \ -e MULTIUSER=enabled \ -e FEDERATION=enabled \ - -e THEME=vapor \ + -e THEME=$THEME \ + -e HOMEPAGE=$HOMEPAGE \ -e FEDERATE_DRIVE_CACHE=5s \ --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \ xrforge @@ -146,6 +149,12 @@ set_modelpath(){ debug sqlite3 /config/manyfold.sqlite3 "UPDATE settings SET value = replace('--- \"{creator}/{modelId}\"\n','\n',char(10)) WHERE var == 'model_path_template';" } +set_homepage(){ + test "$HOMEPAGE" = "/" && return 0 # nothing to do + echocolor "[$APPNAME]" "enforcing homepage path" + debug sed -i 's|root to:.*|root to: redirect("'$HOMEPAGE'")|g' /usr/src/app/config/routes.rb +} + rename_app(){ echocolor "[$APPNAME]" "renaming manyfold to $APPNAME" sed -i 's/title: Manyfold/title: '$APPNAME'/g' /usr/src/app/config/locales/*.yml @@ -169,6 +178,7 @@ boot(){ test -z "$NO_DEFAULTDB" && db default start_syslog rename_app + set_homepage set_theme set_modelpath rclone_mount diff --git a/manyfold/manyfold.sql b/manyfold/manyfold.sql index 08deadd..e7f14fb 100644 --- a/manyfold/manyfold.sql +++ b/manyfold/manyfold.sql @@ -143,16 +143,19 @@ INSERT INTO ar_internal_metadata VALUES('environment','production','2025-07-25 1 CREATE TABLE IF NOT EXISTS "libraries" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "path" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" varchar, "caption" varchar, "name" varchar, "tag_regex" text, "icon" text, "storage_service" varchar DEFAULT 'filesystem' NOT NULL, "s3_endpoint" varchar DEFAULT NULL, "s3_region" varchar DEFAULT NULL, "s3_bucket" varchar DEFAULT NULL, "s3_access_key_id" varchar DEFAULT NULL, "s3_secret_access_key" varchar DEFAULT NULL, "public_id" varchar, "s3_path_style" boolean DEFAULT 1 NOT NULL); INSERT INTO libraries VALUES(6,'/mnt/experiences','2025-08-07','2025-08-07','','','experiences',NULL,'','filesystem','','','','','','experiences',1); CREATE TABLE IF NOT EXISTS "tags" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime, "updated_at" datetime, "taggings_count" integer DEFAULT 0); +INSERT INTO tags VALUES(1,'fontmap','2025-08-11 07:14:34.877804','2025-08-11 07:14:34.877804',1); CREATE TABLE IF NOT EXISTS "taggings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "tag_id" integer, "taggable_type" varchar, "taggable_id" integer, "tagger_type" varchar, "tagger_id" integer, "context" varchar(128), "created_at" datetime, CONSTRAINT "fk_rails_9fcd2e236b" FOREIGN KEY ("tag_id") REFERENCES "tags" ("id") ); +INSERT INTO taggings VALUES(1,1,'Model',1,NULL,NULL,'tags','2025-08-11 07:14:34.907021'); CREATE TABLE IF NOT EXISTS "links" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar, "linkable_type" varchar, "linkable_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "synced_at" datetime(6)); +INSERT INTO links VALUES(1,'https://xrfragment.org','Creator',1,'2025-08-11 07:07:58.791010','2025-08-11 07:07:58.791010',NULL); CREATE TABLE IF NOT EXISTS "settings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "var" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); INSERT INTO settings VALUES(1,'default_library','6','2025-07-25 10:58:00.004576','2025-07-28 13:30:03.381376'); INSERT INTO settings VALUES(2,'site_name',replace('--- XRForge\n','\n',char(10)),'2025-07-25 10:59:04.496016','2025-07-25 10:59:04.496016'); INSERT INTO settings VALUES(3,'site_tagline',replace('--- Self-sovereign XR Experiences. Connect 3D files via URLs\n','\n',char(10)),'2025-07-25 10:59:04.519264','2025-08-07 10:49:23.348065'); -INSERT INTO settings VALUES(4,'theme',replace('--- vapor\n','\n',char(10)),'2025-07-25 10:59:04.522670','2025-08-07 10:47:16.469331'); +INSERT INTO settings VALUES(4,'theme','vapor','2025-07-25 10:59:04.522670','2025-08-07 10:47:16.469331'); INSERT INTO settings VALUES(5,'about',replace('--- |-\n XRForge is a preconfigured Manyfold, tailored to an XR Audience.\n\n # Features\n\n * linked VR-experiences (via XR Fragments spec)\n * federated libraries / network drives\n * automatic packaging for game-engines\n','\n',char(10)),'2025-07-25 10:59:04.527612','2025-08-07 10:51:18.592181'); INSERT INTO settings VALUES(6,'rules',replace('--- ''''\n','\n',char(10)),'2025-07-25 10:59:04.531378','2025-07-25 10:59:04.531378'); INSERT INTO settings VALUES(7,'support_link',replace('--- https://forgejo.isvery.ninja/coderofsalvation/xrforge\n','\n',char(10)),'2025-07-25 10:59:04.533678','2025-07-25 10:59:04.533678'); @@ -174,6 +177,7 @@ INSERT INTO settings VALUES(22,'default_viewer_role',replace('--- member\n','\n' INSERT INTO settings VALUES(23,'enable_user_quota',replace('--- false\n','\n',char(10)),'2025-08-07 10:46:21.944399','2025-08-07 10:46:21.944399'); INSERT INTO settings VALUES(24,'default_user_quota',replace('--- 0\n','\n',char(10)),'2025-08-07 10:46:21.950723','2025-08-07 10:46:21.950723'); CREATE TABLE IF NOT EXISTS "problems" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "problematic_type" varchar, "problematic_id" integer, "category" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "note" varchar DEFAULT NULL, "ignored" boolean DEFAULT 0 NOT NULL, "public_id" varchar, "in_progress" boolean DEFAULT 0 NOT NULL); +INSERT INTO problems VALUES(2,'Model',1,11,'2025-08-11 07:14:44.067192','2025-08-11 07:14:44.067192',NULL,0,'hwlxhqvk7w7r',0); CREATE TABLE IF NOT EXISTS "favorites" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "favoritable_type" varchar NOT NULL, "favoritable_id" integer NOT NULL, "favoritor_type" varchar NOT NULL, "favoritor_id" integer NOT NULL, "scope" varchar DEFAULT 'printed' NOT NULL, "blocked" boolean DEFAULT 0 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "flipper_features" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "key" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "flipper_gates" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "feature_key" varchar NOT NULL, "key" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); @@ -186,7 +190,7 @@ CREATE TABLE IF NOT EXISTS "users_roles" ("user_id" integer, "role_id" integer); INSERT INTO users_roles VALUES(1,4); INSERT INTO users_roles VALUES(1,1); CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar DEFAULT '' NOT NULL, "encrypted_password" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "username" varchar NOT NULL, "pagination_settings" json DEFAULT '{"models":true,"creators":true,"collections":true,"per_page":12}', "renderer_settings" json DEFAULT '{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}', "tag_cloud_settings" json DEFAULT '{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}', "problem_settings" json DEFAULT '{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}', "file_list_settings" json DEFAULT '{"hide_presupported_versions":true}', "reset_password_token" varchar, "remember_created_at" datetime(6), "reset_password_sent_at" datetime(6), "interface_language" varchar, "failed_attempts" integer DEFAULT 0 NOT NULL, "locked_at" datetime(6), "auth_provider" varchar, "auth_uid" varchar, "sensitive_content_handling" varchar DEFAULT NULL, "public_id" varchar, "approved" boolean DEFAULT 1 NOT NULL, "quota" integer DEFAULT 1 NOT NULL, "quota_use_site_default" boolean DEFAULT 1 NOT NULL); -INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-07-25 12:46:27.338917','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-07-25 12:46:27.325287',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1); +INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-08-11 07:05:45.209885','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-08-11 07:05:45.208500',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1); CREATE TABLE IF NOT EXISTS "federails_followings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "actor_id" integer NOT NULL, "target_actor_id" integer NOT NULL, "status" integer DEFAULT 0, "federated_url" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "uuid" varchar DEFAULT NULL, CONSTRAINT "fk_rails_2e62338faa" FOREIGN KEY ("actor_id") REFERENCES "federails_actors" ("id") @@ -198,7 +202,22 @@ CREATE TABLE IF NOT EXISTS "federails_activities" ("id" integer PRIMARY KEY AUTO FOREIGN KEY ("actor_id") REFERENCES "federails_actors" ("id") ); +INSERT INTO federails_activities VALUES(1,'Federails::Actor',2,'Create',1,'2025-08-11 07:07:58.701474','2025-08-11 07:07:58.876261','533e3d24-4f3b-41ce-aea4-2b44c51f3d04'); +INSERT INTO federails_activities VALUES(2,'Federails::Actor',3,'Create',1,'2025-08-11 07:08:57.465310','2025-08-11 07:08:57.525980','de39545b-7f21-47f2-b283-3f48150dc1de'); +INSERT INTO federails_activities VALUES(3,'Federails::Actor',4,'Create',1,'2025-08-11 07:14:35.073201','2025-08-11 07:14:35.102927','3c137d07-e8ae-47af-9c47-ba97f25c1746'); +INSERT INTO federails_activities VALUES(4,'Comment',1,'Create',2,'2025-08-11 07:15:26.394452','2025-08-11 07:15:26.394452','91b2b8d4-5d56-4b17-9ba6-7db5ac0fd3a5'); +INSERT INTO federails_activities VALUES(5,'Comment',2,'Create',2,'2025-08-11 07:24:45.549316','2025-08-11 07:24:45.549316','25aee6f6-d57c-4fc7-b9a9-8546ef058749'); +INSERT INTO federails_activities VALUES(6,'Federails::Actor',4,'Update',1,'2025-08-11 07:29:38.394492','2025-08-11 07:29:38.489061','91c075fa-ac0b-467e-b2f6-6f82cbc40f69'); +INSERT INTO federails_activities VALUES(7,'Federails::Actor',4,'Update',1,'2025-08-11 13:42:47.136658','2025-08-11 13:42:47.275209','d587a29e-e2b6-4892-ad24-44bcd748186b'); CREATE TABLE IF NOT EXISTS "caber_relations" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "subject_type" varchar, "subject_id" integer, "permission" varchar, "object_type" varchar NOT NULL, "object_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); +INSERT INTO caber_relations VALUES(1,'User',1,'own','Creator',1,'2025-08-11 07:07:58.784365','2025-08-11 07:07:58.784365'); +INSERT INTO caber_relations VALUES(2,'Role',4,'view','Creator',1,'2025-08-11 07:07:58.903544','2025-08-11 07:07:58.903544'); +INSERT INTO caber_relations VALUES(3,'User',1,'own','Collection',1,'2025-08-11 07:08:57.495084','2025-08-11 07:08:57.495084'); +INSERT INTO caber_relations VALUES(4,'Role',4,'view','Collection',1,'2025-08-11 07:08:57.537413','2025-08-11 07:08:57.537413'); +INSERT INTO caber_relations VALUES(5,'User',1,'own','Model',1,'2025-08-11 07:14:34.852077','2025-08-11 07:14:34.852077'); +INSERT INTO caber_relations VALUES(6,'Role',4,'view','Model',1,'2025-08-11 07:14:35.135758','2025-08-11 07:14:35.135758'); +INSERT INTO caber_relations VALUES(7,NULL,NULL,'view','Creator',1,'2025-08-11 07:15:19.800404','2025-08-11 07:15:19.800404'); +INSERT INTO caber_relations VALUES(8,NULL,NULL,'view','Model',1,'2025-08-11 07:15:19.851560','2025-08-11 07:15:19.851560'); CREATE TABLE IF NOT EXISTS "federails_moderation_reports" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "federated_url" varchar, "federails_actor_id" integer, "content" varchar, "object_type" varchar, "object_id" integer, "resolved_at" datetime(6), "resolution" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_a5cda24d4c" FOREIGN KEY ("federails_actor_id") REFERENCES "federails_actors" ("id") @@ -208,6 +227,8 @@ CREATE TABLE IF NOT EXISTS "comments" ("id" integer PRIMARY KEY AUTOINCREMENT NO FOREIGN KEY ("federails_actor_id") REFERENCES "federails_actors" ("id") ); +INSERT INTO comments VALUES(1,'q6hxq3r8jwnv','Creator',1,'Model',1,'A new 3D model, ["Fontmap"](http://localhost:3214/models/vrpw4zlgzzm8), was just published!','2025-08-11 07:15:26.378633','2025-08-11 07:15:26.378633',1,0,NULL,2); +INSERT INTO comments VALUES(2,'s6w0nbxv8wmt','Creator',1,'Model',1,'The 3D model ["XR Fragments assets"](http://localhost:3214/models/vrpw4zlgzzm8), was just updated!','2025-08-11 07:24:45.534105','2025-08-11 07:24:45.534105',1,0,NULL,2); CREATE TABLE IF NOT EXISTS "oauth_applications" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "uid" varchar NOT NULL, "secret" varchar NOT NULL, "redirect_uri" text, "scopes" varchar DEFAULT '' NOT NULL, "confidential" boolean DEFAULT 1 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "owner_id" bigint, "owner_type" varchar); CREATE TABLE IF NOT EXISTS "oauth_access_grants" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "resource_owner_id" integer NOT NULL, "application_id" integer NOT NULL, "token" varchar NOT NULL, "expires_in" integer NOT NULL, "redirect_uri" text NOT NULL, "scopes" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "revoked_at" datetime(6), CONSTRAINT "fk_rails_b4b53e07b8" FOREIGN KEY ("application_id") @@ -225,6 +246,9 @@ FOREIGN KEY ("resource_owner_id") ); CREATE TABLE IF NOT EXISTS "federails_actors" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "federated_url" varchar, "username" varchar, "server" varchar, "inbox_url" varchar, "outbox_url" varchar, "followers_url" varchar, "followings_url" varchar, "profile_url" varchar, "entity_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "entity_type" varchar DEFAULT NULL, "public_key" text, "private_key" text, "uuid" varchar, "extensions" json, "local" boolean DEFAULT 0 NOT NULL, "actor_type" varchar, "tombstoned_at" datetime(6)); INSERT INTO federails_actors VALUES(1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-07-25 10:52:57.029315','2025-07-25 10:52:57.029315','User',NULL,NULL,'eb64d114-1bc7-4cb3-8be6-350d23ccfb3e',NULL,1,NULL,NULL); +INSERT INTO federails_actors VALUES(2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:07:58.778020','2025-08-11 07:07:58.778020','Creator',NULL,NULL,'bdff9ca9-88da-4b14-a7cb-01887e5d3c8e',NULL,1,NULL,NULL); +INSERT INTO federails_actors VALUES(3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:08:57.485286','2025-08-11 07:08:57.485286','Collection',NULL,NULL,'8478020b-6b34-4e86-8511-4a1bb738a331',NULL,1,NULL,NULL); +INSERT INTO federails_actors VALUES(4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:14:34.840250','2025-08-11 07:14:34.840250','Model',NULL,NULL,'18ccb599-8b40-4778-91f7-6b7970f0b256',NULL,1,NULL,NULL); CREATE TABLE IF NOT EXISTS "model_files" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "filename" varchar, "model_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "presupported" boolean DEFAULT 0 NOT NULL, "y_up" boolean DEFAULT 0 NOT NULL, "digest" varchar, "notes" text, "caption" text, "size" bigint, "presupported_version_id" integer, "attachment_data" json, "public_id" varchar, "filename_lower" varchar GENERATED ALWAYS AS (LOWER(filename)) STORED, "previewable" boolean DEFAULT 0 NOT NULL, CONSTRAINT "fk_rails_b5ac05b6e3" FOREIGN KEY ("presupported_version_id") REFERENCES "model_files" ("id") @@ -232,6 +256,10 @@ FOREIGN KEY ("presupported_version_id") FOREIGN KEY ("model_id") REFERENCES "models" ("id") ); +INSERT INTO model_files VALUES(1,'fontmap.glb',1,'2025-08-11 07:14:35.064935','2025-08-11 07:14:44.111333',0,0,'35e8f851a1e012681f160d62c5acdb7f670b0f9a0060debe43858d70d804660485280a5ba110ff7a778aab603caeea786bb479d595a82d7ec0acff36a7e35eca',NULL,NULL,8600,NULL,'{"id":"xrfragments/#1/fontmap.glb","storage":"library_6","metadata":{"filename":"fontmap.glb","size":8600,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:14:35.337+00:00","mtime":"2025-08-11T07:14:35.338+00:00","remote_etag":null,"remote_last_modified":null}}','mlv2qfcv99s1',0); +INSERT INTO model_files VALUES(2,'datapackage.json',1,'2025-08-11 07:14:39.060349','2025-08-11 13:42:56.905818',0,0,NULL,NULL,NULL,1967,NULL,'{"id":"xrfragments/#1/datapackage.json","storage":"library_6","metadata":{"filename":null,"size":1967,"mime_type":"application/json","ctime":"2025-08-11T13:42:56.859+00:00","mtime":"2025-08-11T13:42:56.867+00:00","remote_etag":null,"remote_last_modified":null}}','d44635nm6z3k',0); +INSERT INTO model_files VALUES(7,'tree.glb',1,'2025-08-11 07:29:50.850906','2025-08-11 07:29:57.592832',0,0,'79f2f9dc9c771bcbed1fc18285eeebd420b7f33446b7b7cb7453d34a5566318db0920e97835e385f270321b901b76dc3eab12eb8b895eabc321326738ba2a249',NULL,NULL,6764,NULL,'{"id":"xrfragments/#1/tree.glb","storage":"library_6","metadata":{"filename":"tree.glb","size":6764,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:29:50.913+00:00","mtime":"2025-08-11T07:29:50.914+00:00","remote_etag":null,"remote_last_modified":null}}','1hmcw2bnbh7x',0); +INSERT INTO model_files VALUES(8,'assets.webp',1,'2025-08-11 13:42:47.085596','2025-08-11 13:42:57.003069',0,0,'1090220f0d208cc142a1025818cb11e8692a58b21aff9d7156eaa40ecd2566389f8a434bc15c9d192574d847ff14efd7b35edc9c3655ea90b0c8a4bb4072b0c4',NULL,NULL,90642,NULL,'{"id":"xrfragments/#1/assets.webp","storage":"library_6","metadata":{"filename":"assets.webp","size":90642,"mime_type":"image/webp","ctime":"2025-08-11T13:42:47.402+00:00","mtime":"2025-08-11T13:42:47.402+00:00","remote_etag":null,"remote_last_modified":null}}','4sjr984nmhtr',1); CREATE TABLE IF NOT EXISTS "altcha_solutions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "algorithm" varchar, "challenge" varchar, "salt" varchar, "signature" varchar, "number" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "models" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "path" varchar NOT NULL, "library_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "preview_file_id" integer, "creator_id" integer, "notes" text, "caption" text, "collection_id" integer, "slug" varchar, "license" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "sensitive" boolean DEFAULT 0 NOT NULL, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_cdf016e15c" FOREIGN KEY ("collection_id") @@ -243,7 +271,9 @@ FOREIGN KEY ("library_id") FOREIGN KEY ("creator_id") REFERENCES "creators" ("id") ); +INSERT INTO models VALUES(1,'XR Fragments assets','xrfragments/#1',6,'2025-08-11 07:14:34.789236','2025-08-11 13:42:57.006778',8,1,'','',1,'fontmap','CC-BY-SA-4.0','vrpw4zlgzzm8',0,NULL,NULL); CREATE TABLE IF NOT EXISTS "creators" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" text, "caption" text, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "indexable" varchar, "ai_indexable" varchar); +INSERT INTO creators VALUES(1,'xrfragments','2025-08-11 07:07:58.701474','2025-08-11 07:09:11.600140',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'','xrfragments','fjb71m9sbcl0','yes',NULL); CREATE TABLE IF NOT EXISTS "collections" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "notes" text, "caption" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "collection_id" integer, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "creator_id" integer, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_63724415e9" FOREIGN KEY ("collection_id") REFERENCES "collections" ("id") @@ -251,19 +281,46 @@ FOREIGN KEY ("collection_id") FOREIGN KEY ("creator_id") REFERENCES "creators" ("id") ); -INSERT INTO sqlite_sequence VALUES('taggings',0); +INSERT INTO collections VALUES(1,'XR Fragments',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'3D assets which are XR Fragment-compatible.','2025-08-11 07:08:57.465310','2025-08-11 07:09:26.849151',NULL,'xr-fragments','z924drvlr4k1',1,NULL,NULL); +INSERT INTO sqlite_sequence VALUES('libraries',6); +INSERT INTO sqlite_sequence VALUES('tags',1); +INSERT INTO sqlite_sequence VALUES('taggings',1); +INSERT INTO sqlite_sequence VALUES('links',1); +INSERT INTO sqlite_sequence VALUES('settings',24); +INSERT INTO sqlite_sequence VALUES('problems',2); +INSERT INTO sqlite_sequence VALUES('roles',4); INSERT INTO sqlite_sequence VALUES('users',1); -INSERT INTO sqlite_sequence VALUES('comments',0); +INSERT INTO sqlite_sequence VALUES('federails_activities',7); +INSERT INTO sqlite_sequence VALUES('caber_relations',8); +INSERT INTO sqlite_sequence VALUES('comments',2); +INSERT INTO sqlite_sequence VALUES('federails_actors',4); +INSERT INTO sqlite_sequence VALUES('model_files',8); +INSERT INTO sqlite_sequence VALUES('models',1); +INSERT INTO sqlite_sequence VALUES('creators',1); +INSERT INTO sqlite_sequence VALUES('collections',1); +INSERT INTO sqlite_sequence VALUES('libraries',6); +INSERT INTO sqlite_sequence VALUES('settings',24); +INSERT INTO sqlite_sequence VALUES('roles',4); +INSERT INTO sqlite_sequence VALUES('users',1); +INSERT INTO sqlite_sequence VALUES('federails_actors',4); +INSERT INTO sqlite_sequence VALUES('taggings',1); +INSERT INTO sqlite_sequence VALUES('users',1); +INSERT INTO sqlite_sequence VALUES('comments',2); INSERT INTO sqlite_sequence VALUES('oauth_access_grants',0); INSERT INTO sqlite_sequence VALUES('oauth_access_tokens',0); INSERT INTO sqlite_sequence VALUES('federails_actors',1); -INSERT INTO sqlite_sequence VALUES('model_files',0); -INSERT INTO sqlite_sequence VALUES('models',0); -INSERT INTO sqlite_sequence VALUES('creators',0); -INSERT INTO sqlite_sequence VALUES('collections',0); +INSERT INTO sqlite_sequence VALUES('model_files',7); +INSERT INTO sqlite_sequence VALUES('models',1); +INSERT INTO sqlite_sequence VALUES('creators',1); +INSERT INTO sqlite_sequence VALUES('collections',1); INSERT INTO sqlite_sequence VALUES('roles',4); INSERT INTO sqlite_sequence VALUES('libraries',6); INSERT INTO sqlite_sequence VALUES('settings',24); +INSERT INTO sqlite_sequence VALUES('caber_relations',8); +INSERT INTO sqlite_sequence VALUES('links',1); +INSERT INTO sqlite_sequence VALUES('federails_activities',6); +INSERT INTO sqlite_sequence VALUES('tags',1); +INSERT INTO sqlite_sequence VALUES('problems',2); CREATE UNIQUE INDEX "index_tags_on_name" ON "tags" ("name"); CREATE UNIQUE INDEX "taggings_idx" ON "taggings" ("tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"); CREATE INDEX "taggings_taggable_context_idx" ON "taggings" ("taggable_id", "taggable_type", "context"); diff --git a/manyfold/mnt/experiences/xrfragments/#1.zip b/manyfold/mnt/experiences/xrfragments/#1.zip new file mode 100644 index 0000000..0f43ce6 Binary files /dev/null and b/manyfold/mnt/experiences/xrfragments/#1.zip differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/assets.webp b/manyfold/mnt/experiences/xrfragments/#1/assets.webp new file mode 100644 index 0000000..bb8c28a Binary files /dev/null and b/manyfold/mnt/experiences/xrfragments/#1/assets.webp differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/datapackage.json b/manyfold/mnt/experiences/xrfragments/#1/datapackage.json new file mode 100644 index 0000000..8b7f2bf --- /dev/null +++ b/manyfold/mnt/experiences/xrfragments/#1/datapackage.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://manyfold.app/profiles/0.0/datapackage.json", + "name": "xr-fragments-assets", + "title": "XR Fragments assets", + "caption": "", + "description": "", + "homepage": "http://localhost:3214/models/vrpw4zlgzzm8", + "image": "assets.webp", + "keywords": [ + "fontmap" + ], + "licenses": [ + { + "name": "CC-BY-SA-4.0", + "path": "https://spdx.org/licenses/CC-BY-SA-4.0.html" + } + ], + "resources": [ + { + "name": "fontmap", + "path": "fontmap.glb", + "mediatype": "model/gltf", + "up": "+z", + "presupported": false + }, + { + "name": "tree", + "path": "tree.glb", + "mediatype": "model/gltf", + "up": "+z", + "presupported": false + }, + { + "name": "assets", + "path": "assets.webp", + "mediatype": "image/webp", + "up": "+z", + "presupported": false + } + ], + "sensitive": false, + "contributors": [ + { + "title": "xrfragments", + "path": "http://localhost:3214/creators/xrfragments", + "roles": [ + "creator" + ], + "caption": "", + "description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .", + "links": [ + { + "path": "https://xrfragment.org" + } + ] + } + ], + "collections": [ + { + "title": "XR Fragments", + "path": "http://localhost:3214/collections/z924drvlr4k1", + "caption": "3D assets which are XR Fragment-compatible.", + "description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .", + "links": [] + } + ], + "links": [] +} \ No newline at end of file diff --git a/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb b/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb new file mode 100644 index 0000000..aee2090 Binary files /dev/null and b/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/tree.glb b/manyfold/mnt/experiences/xrfragments/#1/tree.glb new file mode 100644 index 0000000..b605f56 Binary files /dev/null and b/manyfold/mnt/experiences/xrfragments/#1/tree.glb differ diff --git a/manyfold/root/hook.d/boot/runtests.sh b/manyfold/root/hook.d/boot/runtests.sh new file mode 100755 index 0000000..e6de882 --- /dev/null +++ b/manyfold/root/hook.d/boot/runtests.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +test -z "$RUNTESTS" && exit 0 # nothing to do + +echo "" +echo "[!] RUNTESTS=1 was set " +echo "[.] running tests in /test/*" +echo "" + +find -L /test/* -type f -executable -maxdepth 1 | while read testscript; do + echo "[.] test: "$testscript + $testscript "$@" 2>&1 | awk '{ print " | "$0 }' +done diff --git a/manyfold/usr/src/app/app/views/models/_file.html.erb b/manyfold/usr/src/app/app/views/models/_file.html.erb index b5d64d9..37f9ed8 100644 --- a/manyfold/usr/src/app/app/views/models/_file.html.erb +++ b/manyfold/usr/src/app/app/views/models/_file.html.erb @@ -1,6 +1,5 @@
"> -

FOO

<% if file.is_image? %> <%= content_tag :div, nil, class: "card-img-top card-img-top-background", style: "background-image: url(#{model_model_file_path(@model, file, format: file.extension)})" %> <%= image_tag model_model_file_path(@model, file, format: file.extension), class: "card-img-top image-preview", alt: file.name %>