구매 후 페이지로 리디렉션

플러그인에서 add_model_callback(DiscourseSubscriptions::Customer, :after_save) do ...를 사용하고 있습니다. 대부분의 구매는 “서버”(커스텀 모델)가 생성되도록 합니다. 오늘, 서버가 생성되는 다른 위치에서 새 서버를 구성하기 위한 페이지로 전환되도록 하는 방법을 다음과 같은 코드를 통해 배웠습니다.

      Server.createServer(server).then((result) => {
        if (result.server) {
          this.get("servers").pushObject(EmberObject.create(result.server));
          const id = result.server.id;
          window.location = getURL(`/pfaffmanager/servers/${id}`);
        }

이제 “구매 감사” 대화상자가 닫힌 후에도 Discourse가 해당 새 페이지로 유사하게 리다이렉트되도록 하고 싶습니다.

Rails에서든 Ember에서든 일어나는 것은 상관없지만, Ember에서 처리해야 하는 것 같습니다. 구독 플러그인의 컨트롤러/모델/그냥 아무거나를 제 플러그인에서 해킹 확장하는 방법을 정확히 이해하지 못하고 있습니다(즉, 전혀 모릅니다).

아마도 closeModal이라는 액션이 있을 것입니다(경로에 있을 수도 있습니다).

그 안에서는 DiscourseURL.routeTo("/yourdiscourseroute");를 실행할 수 있습니다.

음, 정확히 그렇지는 않습니다. 하지만 기적적으로 그게 충분했네요! 이걸 찾았습니다:

그리고 이렇게 했습니다!!

      api.modifyClass("controller:subscribe-show", {
        pluginId: "pfaffmanager",
        async _advanceSuccessfulTransaction(plan) {
          window.console.log("modifying subscription!!!", plan, this);
          this.alert("plans.success");
          this.set("loading", false);
          let servers = [];
          servers = await Server.listServers().then((result) => {
            if (currentUser && currentUser.servers !== undefined) {
              servers = currentUser.servers.sort((b, a) => {
                return ("" + a.updated_at).localeCompare(b.updated_at);
              });
              window.console.log("sorted servers", servers);
              if (servers.length > 0) {
                window.console.log(`going to first! ${servers[0].id}`);
                this.transitionToRoute(
                  "pfaffmanager.servers.show",
                  servers[0].id
                );
              } else {
                window.console.log(`server not found. going to index!`);
                this.transitionToRoute("pfaffmanager.servers.index");
              }
              // window.location = getURL(`/`);
              // window.location = getURL(`/pfaffmanager/servers/${id}`);
            }
          });
        },
      });

이건 정말, 아주, 아주 근접합니다. 지금 문제는 레이스 컨디션(race condition)이 있다는 겁니다. add_model_callback(DiscourseSubscriptions::Customer, :after_save) do가 제 ajax 쿼리(서버 목록을 가져오기 위한)보다 먼저 끝나지 않을 수 있거든요.

음, 그보다 더 기묘합니다. later를 사용해 ajax 호출 전에 지연을 추가해도 여전히 새 서버가 추가된 후의 목록이 아니라 오래된 목록을 가져옵니다. 다른 탭에서 창을 새로고침하면 ajax 호출 전에 올바른 데이터를 가져오는 것을 확인할 수 있습니다.

일단 여기서 포기하겠습니다. 서버가 구매 전에 이미 존재하는 경우(더 일반적인 경우라고 생각합니다–모든 것을 설정한 뒤 "네, 하자"라고 하는 경우)는 작동합니다. 다만 "네, 설치를 위해 돈을 내겠다. 먼저 결제하고 어떻게 되는지 보자"라고 하는 경우에만 문제가 있는 겁니다.