pterotype/includes/schema.php

295 lines
9.8 KiB
PHP
Raw Normal View History

2018-09-19 15:47:51 +00:00
<?php
2018-10-21 02:34:20 +00:00
namespace pterotype\schema;
2018-09-19 15:47:51 +00:00
function get_previous_version() {
$previous_version = get_option( 'pterotype_previously_migrated_version' );
if ( !$previous_version ) {
$previous_version = '0.0.0';
}
return $previous_version;
}
2018-09-19 15:47:51 +00:00
function run_migrations() {
$previous_version = get_previous_version();
2018-09-19 17:46:40 +00:00
if ( version_compare( $previous_version, PTEROTYPE_VERSION, '>=' ) ) {
return;
}
apply_migration( '0.0.1', 'migration_0_0_1' );
2018-10-23 11:02:49 +00:00
apply_migration( '1.1.0', 'migration_1_1_0' );
apply_migration( '1.1.1', 'migration_1_1_1' );
apply_migration( '1.2.0', 'migration_1_2_0' );
2018-09-19 15:47:51 +00:00
update_option( 'pterotype_previously_migrated_version', PTEROTYPE_VERSION );
}
function apply_migration( $version, $migration_func ) {
$previous_version = get_previous_version();
if ( version_compare( $previous_version, $version, '<' ) ) {
call_user_func( __NAMESPACE__ . '\\' . $migration_func );
}
}
2018-09-19 15:47:51 +00:00
function migration_0_0_1() {
global $wpdb;
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_objects (
2018-09-24 12:06:20 +00:00
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
activitypub_id VARCHAR(255) UNIQUE NOT NULL,
type VARCHAR(50) NOT NULL,
object TEXT NOT NULL
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE UNIQUE INDEX OBJECTS_ACTIVITYPUB_ID_INDEX
ON {$wpdb->prefix}pterotype_objects (activitypub_id);
2018-09-24 12:06:20 +00:00
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_actors (
2018-09-24 12:06:20 +00:00
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
slug VARCHAR(64) UNIQUE NOT NULL,
type VARCHAR(64) NOT NULL
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_outbox (
2018-09-24 12:06:20 +00:00
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
actor_id INT UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
FOREIGN KEY outbox_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id),
FOREIGN KEY outbox_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_inbox (
2018-09-24 12:06:20 +00:00
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
actor_id INT UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
FOREIGN KEY inbox_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id),
FOREIGN KEY inbox_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_actor_likes (
2018-09-24 12:06:20 +00:00
actor_id INT UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
PRIMARY KEY (actor_id, object_id),
FOREIGN KEY a_likes_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id),
FOREIGN KEY a_likes_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_object_likes (
object_id INT UNSIGNED NOT NULL,
like_id INT UNSIGNED NOT NULL,
PRIMARY KEY (object_id, like_id),
FOREIGN KEY o_likes_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id),
FOREIGN KEY o_likes_like_fk(like_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 15:47:51 +00:00
);
2018-09-19 21:43:59 +00:00
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_following (
2018-09-24 12:06:20 +00:00
actor_id INT UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
state VARCHAR(64) NOT NULL,
PRIMARY KEY (actor_id, object_id),
FOREIGN KEY following_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id),
FOREIGN KEY following_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-09-19 21:43:59 +00:00
);
2018-09-23 23:29:20 +00:00
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_followers (
2018-09-24 12:06:20 +00:00
actor_id INT UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
PRIMARY KEY (actor_id, object_id),
2018-09-26 04:07:41 +00:00
FOREIGN KEY followers_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id),
2018-09-26 04:07:41 +00:00
FOREIGN KEY followers_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
2018-09-24 12:06:20 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
2018-09-23 23:29:20 +00:00
"
);
2018-09-24 02:22:30 +00:00
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_blocks (
actor_id INT UNSIGNED NOT NULL,
blocked_actor_url TEXT NOT NULL,
FOREIGN KEY blocks_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_shares (
object_id INT UNSIGNED NOT NULL,
announce_id INT UNSIGNED NOT NULL,
PRIMARY KEY (object_id, announce_id),
FOREIGN KEY shares_object_fk(object_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id),
FOREIGN KEY shares_announce_fk(announce_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
2018-09-24 02:22:30 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
2018-10-04 10:44:32 +00:00
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_keys (
2018-10-04 10:44:32 +00:00
actor_id INT UNSIGNED PRIMARY KEY,
public_key TEXT NOT NULL,
private_key TEXT NOT NULL,
FOREIGN KEY keys_actor_fk(actor_id)
REFERENCES {$wpdb->prefix}pterotype_actors(id)
2018-10-04 10:44:32 +00:00
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
2018-10-04 10:44:32 +00:00
);
}
2018-10-23 11:02:49 +00:00
function migration_1_1_0() {
global $wpdb;
2018-10-23 11:02:49 +00:00
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_comments (
comment_id BIGINT(20) UNSIGNED NOT NULL,
object_id INT UNSIGNED NOT NULL,
PRIMARY KEY (comment_id, object_id),
FOREIGN KEY pt_comments_comment_fk(comment_id)
REFERENCES {$wpdb->comments}(comment_ID),
FOREIGN KEY pt_comments_object_fk(object_id)
references {$wpdb->prefix}pterotype_objects(id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
}
function migration_1_1_1() {
global $wpdb;
$wpdb->query(
"
ALTER TABLE {$wpdb->prefix}pterotype_actors
ADD email VARCHAR(255),
ADD url VARCHAR(255),
ADD name VARCHAR(255),
ADD icon VARCHAR(255);
"
);
}
function migration_1_2_0() {
global $wpdb;
$wpdb->query(
"
ALTER TABLE {$wpdb->prefix}pterotype_objects
MODIFY object TEXT NOT NULL,
ADD url VARCHAR(255);
"
);
$wpdb->query(
"
CREATE TABLE {$wpdb->prefix}pterotype_object_links (
parent_id INT UNSIGNED NOT NULL,
child_id INT UNSIGNED NOT NULL,
PRIMARY KEY(parent_id, child_id),
FOREIGN KEY pt_object_links_parent_fk(parent_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id),
FOREIGN KEY pt_object_links_child_fk(child_id)
REFERENCES {$wpdb->prefix}pterotype_objects(id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
// Migrate existing objects to use the new url field
$objects = $wpdb->get_results(
"SELECT activitypub_id, object FROM {$wpdb->prefix}pterotype_objects",
OBJECT_K
);
$ids_to_urls = array_map(
function( $row ) {
$json = \json_decode( $row->object, true );
if ( array_key_exists( 'url', $json ) ) {
return $json['url'];
}
},
$objects
);
$ids_to_urls = array_filter( $ids_to_urls );
$query = "INSERT INTO {$wpdb->prefix}pterotype_objects (activitypub_id, url) VALUES";
// build values
foreach( $ids_to_urls as $activitypub_id => $url ) {
$query = $query . $wpdb->prepare( " (%s, %s) ", $activitypub_id, $url );
}
$query = $query . "ON DUPLICATE KEY UPDATE url=VALUES(url);";
$wpdb->query( $query );
// Compact existing objects so we only store 1 copy of each object
foreach( $objects as $row ) {
$object = \json_decode( $row->object, true );
$updated = $object;
foreach ( $object as $field => $value ) {
if ( is_array( $value ) && array_key_exists( 'id', $value ) ) {
// Insert the child, ignoring if it exists
$child_url = '';
if ( array_key_exists( 'url', $value ) ) {
$child_url = $value['url'];
}
$child_type = '';
if ( array_key_exists( 'type', $value ) ) {
$child_type = $value['type'];
}
$wpdb->query( $wpdb->prepare(
"
INSERT INTO {$wpdb->prefix}pterotype_objects
(activitypub_id, type, object, url )
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE activitypub_id = activitypub_id;
",
$value['id'], $child_type, wp_json_encode( $value ), $child_url
) );
$updated[$field] = $value['id'];
}
}
$wpdb->update(
"{$wpdb->prefix}pterotype_objects",
array( 'object' => wp_json_encode( $updated ) ),
array( 'activitypub_id', $row->activitypub_id )
);
}
}
2018-09-19 15:47:51 +00:00
?>