getters.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import { formatProposalMessage } from "./announcements";
  2. import fetch from "node-fetch";
  3. //types
  4. import { Api, ProposalArray, ProposalDetail } from "../../types";
  5. import {
  6. ChannelId,
  7. PostId,
  8. ProposalDetailsOf,
  9. ThreadId,
  10. } from "@joystream/types/augment";
  11. import { Category, CategoryId } from "@joystream/types/forum";
  12. import { MemberId, Membership } from "@joystream/types/members";
  13. import { Proposal } from "@joystream/types/proposals";
  14. import { AccountId } from "@polkadot/types/interfaces";
  15. // channel
  16. export const currentChannelId = async (api: Api): Promise<number> => {
  17. const id: ChannelId = await api.query.contentWorkingGroup.nextChannelId();
  18. return Number(id) - 1;
  19. };
  20. // members
  21. export const membership = async (
  22. api: Api,
  23. id: MemberId | number
  24. ): Promise<Membership> => {
  25. return await api.query.members.membershipById(id);
  26. };
  27. export const memberHandle = async (api: Api, id: MemberId): Promise<string> => {
  28. const member: Membership = await membership(api, id);
  29. return member.handle.toJSON();
  30. };
  31. export const memberIdByAccount = async (
  32. api: Api,
  33. account: AccountId | string
  34. ): Promise<MemberId | number> => {
  35. const ids = await api.query.members.memberIdsByRootAccountId(account);
  36. return ids.length ? ids[0] : 0;
  37. };
  38. export const memberHandleByAccount = async (
  39. api: Api,
  40. account: AccountId | string
  41. ): Promise<string> => {
  42. const id: MemberId = await api.query.members.memberIdsByRootAccountId(
  43. account
  44. );
  45. const handle: string = await memberHandle(api, id);
  46. return handle === "joystream_storage_member" ? "joystream" : handle;
  47. };
  48. // forum
  49. export const categoryById = async (api: Api, id: number): Promise<Category> => {
  50. const category: Category = await api.query.forum.categoryById(id);
  51. return category;
  52. };
  53. export const currentPostId = async (api: Api): Promise<number> => {
  54. const postId: PostId = await api.query.forum.nextPostId();
  55. return Number(postId) - 1;
  56. };
  57. export const currentThreadId = async (api: Api): Promise<number> => {
  58. const threadId: ThreadId = await api.query.forum.nextThreadId();
  59. return Number(threadId) - 1;
  60. };
  61. export const currentCategoryId = async (api: Api): Promise<number> => {
  62. const categoryId: CategoryId = await api.query.forum.nextCategoryId();
  63. return Number(categoryId) - 1;
  64. };
  65. // proposals
  66. export const proposalCount = async (api: Api): Promise<number> => {
  67. const proposalCount: any = await api.query.proposalsEngine.proposalCount();
  68. return proposalCount.toJSON() || 0;
  69. };
  70. export const activeProposalCount = async (api: Api): Promise<number> => {
  71. const proposalCount: number = await api.query.proposalsEngine.activeProposalCount();
  72. return proposalCount || 0;
  73. };
  74. export const pendingProposals = async (api: Api): Promise<ProposalArray> => {
  75. const pending: ProposalArray = await api.query.proposalsEngine.pendingExecutionProposalIds(
  76. await activeProposalCount(api)
  77. );
  78. //const pending: ProposalArray = pendingProposals.toJSON();
  79. if (pending.length) console.debug("pending proposals", pending);
  80. return pending;
  81. };
  82. export const activeProposals = async (api: Api): Promise<ProposalArray> => {
  83. const active: ProposalArray = await api.query.proposalsEngine.activeProposalIds(
  84. await activeProposalCount(api)
  85. );
  86. //const active: ProposalArray = result.toJSON();
  87. if (active.length) console.debug("active proposals", active);
  88. return active;
  89. };
  90. const getProposalType = async (api: Api, id: number): Promise<string> => {
  91. const details: ProposalDetailsOf = await api.query.proposalsCodex.proposalDetailsByProposalId(
  92. id
  93. );
  94. const [type]: string[] = Object.getOwnPropertyNames(details.toJSON());
  95. return type;
  96. };
  97. export const proposalDetail = async (
  98. api: Api,
  99. id: number
  100. ): Promise<ProposalDetail> => {
  101. const proposal: Proposal = await api.query.proposalsEngine.proposals(id);
  102. const status: { [key: string]: any } = proposal.status;
  103. const stage: string = status.isActive ? "Active" : "Finalized";
  104. const { finalizedAt, proposalStatus } = status[`as${stage}`];
  105. const result: string = proposalStatus
  106. ? (proposalStatus.isApproved && "Approved") ||
  107. (proposalStatus.isCanceled && "Canceled") ||
  108. (proposalStatus.isExpired && "Expired") ||
  109. (proposalStatus.isRejected && "Rejected") ||
  110. (proposalStatus.isSlashed && "Slashed") ||
  111. (proposalStatus.isVetoed && "Vetoed")
  112. : "Pending";
  113. const exec = proposalStatus ? proposalStatus["Approved"] : null;
  114. const { description, parameters, proposerId, votingResults } = proposal;
  115. const author: string = await memberHandle(api, proposerId);
  116. const title: string = proposal.title.toString();
  117. const type: string = await getProposalType(api, id);
  118. const args: string[] = [String(id), title, type, stage, result, author];
  119. const message: string = formatProposalMessage(args);
  120. const createdAt: number = Number(proposal.createdAt)
  121. return {
  122. id,
  123. title,
  124. createdAt,
  125. finalizedAt,
  126. parameters,
  127. message,
  128. stage,
  129. result,
  130. exec,
  131. description,
  132. votes: votingResults,
  133. type,
  134. author,
  135. authorId: Number(proposerId)
  136. };
  137. };
  138. // storage providers
  139. export const providerStatus = async (domain: string): Promise<boolean> => {
  140. try {
  141. const res = await fetch(`https://${domain}:5001/api/v0/version`);
  142. return res.status >= 400 ? false : true;
  143. } catch (e) {
  144. return false;
  145. }
  146. };
  147. export const nextOpeningId = async (api: Api): Promise<number> => {
  148. const id = await api.query.storageWorkingGroup.nextOpeningId();
  149. return id.toJSON();
  150. };
  151. export const nextWorkerId = async (api: Api): Promise<number> => {
  152. const id = await api.query.storageWorkingGroup.nextWorkerId();
  153. return id.toJSON();
  154. };