- // XXX: This only returns a 1->1 single obj mapping. Change? Or make
- // a getForeignUsers() that returns more than one? --Zach
- static function getByUserID($user_id, $service) {
- $flink = new Foreign_link();
- $flink->service = $service;
- $flink->user_id = $user_id;
- $flink->limit(1);
-
- if ($flink->find(TRUE)) {
- return $flink;
- }
-
- return NULL;
- }
-
- static function getByForeignID($foreign_id, $service) {
- $flink = new Foreign_link();
- $flink->service = $service;
- $flink->foreign_id = $foreign_id;
- $flink->limit(1);
-
- if ($flink->find(TRUE)) {
- return $flink;
- }
-
- return NULL;
- }
-
- # Convenience methods
- function getForeignUser() {
- $fuser = new Foreign_user();
- $fuser->service = $this->service;
- $fuser->id = $this->foreign_id;
-
- $fuser->limit(1);
-
- if ($fuser->find(TRUE)) {
- return $fuser;
- }
-
- return NULL;
- }
-
- function getUser() {
- return User::staticGet($this->user_id);
- }
-
+ public static function schemaDef()
+ {
+ return array(
+ 'fields' => array(
+ 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'link to user on this system, if exists'),
+ 'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'not null' => true, 'description' => 'link to user on foreign service, if exists'),
+ 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'),
+ 'credentials' => array('type' => 'varchar', 'length' => 191, 'description' => 'authc credentials, typically a password'),
+ 'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'),
+ 'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2, 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'),
+ 'profilesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'),
+ 'last_noticesync' => array('type' => 'datetime', 'description' => 'last time notices were imported'),
+ 'last_friendsync' => array('type' => 'datetime', 'description' => 'last time friends were imported'),
+ 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
+ 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
+ ),
+ 'primary key' => array('user_id', 'foreign_id', 'service'),
+ 'foreign keys' => array(
+ 'foreign_link_user_id_fkey' => array('user', array('user_id' => 'id')),
+ 'foreign_link_foreign_id_fkey' => array('foreign_user', array('foreign_id' => 'id', 'service' => 'service')),
+ 'foreign_link_service_fkey' => array('foreign_service', array('service' => 'id')),
+ ),
+ 'indexes' => array(
+ 'foreign_user_user_id_idx' => array('user_id'),
+ ),
+ );
+ }
+
+ static function getByUserID($user_id, $service)
+ {
+ if (empty($user_id) || empty($service)) {
+ throw new ServerException('Empty user_id or service for Foreign_link::getByUserID');
+ }
+
+ $flink = new Foreign_link();
+ $flink->service = $service;
+ $flink->user_id = $user_id;
+ $flink->limit(1);
+
+ if (!$flink->find(true)) {
+ throw new NoResultException($flink);
+ }
+
+ return $flink;
+ }
+
+ static function getByForeignID($foreign_id, $service)
+ {
+ if (empty($foreign_id) || empty($service)) {
+ throw new ServerException('Empty foreign_id or service for Foreign_link::getByForeignID');
+ }
+
+ $flink = new Foreign_link();
+ $flink->service = $service;
+ $flink->foreign_id = $foreign_id;
+ $flink->limit(1);
+
+ if (!$flink->find(true)) {
+ throw new NoResultException($flink);
+ }
+
+ return $flink;
+ }
+
+ function set_flags($noticesend, $noticerecv, $replysync, $repeatsync, $friendsync)
+ {
+ if ($noticesend) {
+ $this->noticesync |= FOREIGN_NOTICE_SEND;
+ } else {
+ $this->noticesync &= ~FOREIGN_NOTICE_SEND;
+ }
+
+ if ($noticerecv) {
+ $this->noticesync |= FOREIGN_NOTICE_RECV;
+ } else {
+ $this->noticesync &= ~FOREIGN_NOTICE_RECV;
+ }
+
+ if ($replysync) {
+ $this->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
+ } else {
+ $this->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
+ }
+
+ if ($repeatsync) {
+ $this->noticesync |= FOREIGN_NOTICE_SEND_REPEAT;
+ } else {
+ $this->noticesync &= ~FOREIGN_NOTICE_SEND_REPEAT;
+ }
+
+ if ($friendsync) {
+ $this->friendsync |= FOREIGN_FRIEND_RECV;
+ } else {
+ $this->friendsync &= ~FOREIGN_FRIEND_RECV;
+ }
+
+ $this->profilesync = 0;
+ }
+
+ // Convenience methods
+ function getForeignUser()
+ {
+ $fuser = new Foreign_user();
+ $fuser->service = $this->service;
+ $fuser->id = $this->foreign_id;
+
+ $fuser->limit(1);
+
+ if (!$fuser->find(true)) {
+ throw new NoResultException($fuser);
+ }
+
+ return $fuser;
+ }
+
+ function getUser()
+ {
+ return Profile::getByID($this->user_id)->getUser();
+ }
+
+ function getProfile()
+ {
+ return Profile::getByID($this->user_id);
+ }
+
+ // Make sure we only ever delete one record at a time
+ function safeDelete()
+ {
+ if (!empty($this->user_id)
+ && !empty($this->foreign_id)
+ && !empty($this->service))
+ {
+ return $this->delete();
+ } else {
+ common_debug(LOG_WARNING,
+ 'Foreign_link::safeDelete() tried to delete a '
+ . 'Foreign_link without a fully specified compound key: '
+ . var_export($this, true));
+ return false;
+ }
+ }