public function addRoster(Roster $model) { $model->status = Roster::STATUS_REQUEST; if ($resp = $this->checkRoster($model)) { return $resp; } // check is record exists $dbModel = clone $model; $resp = $this->getRoster($dbModel); if (!$resp || $resp->code != Code::FAIL_ROSTER_NOT_EXISTS) { return new ApiResponse(Code::FAIL_PERMISSION_DENY, 'repeat add'); } $model->create_time = time(); $model->update_time = 0; $model->rank = intval($model->rank); $model->group_id = intval($model->group_id); $dbManager = Db::getInstance(); // get target's status $statement = $dbManager->prepare(self::GET_ROSTER_BY_FRIEND); if (!$statement->execute([$model->target_id, $model->uid])) { return new ApiResponse(Code::FAIL_ROSTER_NOT_EXISTS, 'get target roster failed when add roster'); } $targetResult = $statement->fetch(PDO::FETCH_ASSOC); if ($targetResult) { $target = ConvertUtil::arrayToObject($targetResult, new Roster(), ['id', 'uid', 'target_id', 'status', 'remark', 'group_id', 'rank']); if ($target->status == Roster::STATUS_UNSUBSCRIBE) { return new ApiResponse(Code::FAIL_ROSTER_UNSUBSCRIBE, 'you is in her ignore list'); } if ($target->status == Roster::STATUS_BLACK) { return new ApiResponse(Code::FAIL_ROSTER_BLACK, 'you is in her black list'); } } else { $dbManager->beginTransaction(); $statement = $dbManager->prepare(self::ADD_ROSTER); if (!$statement->execute([$model->target_id, $model->uid, Roster::STATUS_RECEIVE, $model->create_time, $model->update_time, null, 0, 0])) { $dbManager->rollBack(); return new ApiResponse(Code::FAIL_DATABASE_ERROR, 'create target roster failed'); } } $statement = $dbManager->prepare(self::ADD_ROSTER); if (!$statement->execute([$model->uid, $model->target_id, $model->status, $model->create_time, $model->update_time, $model->remark, $model->group_id, $model->rank])) { if (!$targetResult) { $dbManager->rollBack(); } return new ApiResponse(Code::FAIL_DATABASE_ERROR, 'create roster failed'); } $model->id = $dbManager->lastInsertId(); if (!$targetResult) { $dbManager->commit(); } JegarnUtil::sendFriendRequestNotification($model->uid, $model->target_id); return null; }