Challenges operations

Get the configuration for all platform interactions

Challenges operations are responsible for communicating with Private Leagues API.

The namespace is of course called challenges. All methods return promises. The general design of the namespace follows this pattern unless stated otherwise:

πŸ“˜

General call:

sdk.challenges
  .someMethod()
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Handle error
  });

The responses are comprised of different objects you can find here.

Challenges manage operations

Issue a challenge

Method: issue(body, userId)

Method creates a challenge and invites a user to it. User can configure the following options:

  • name: string. The name of the challenge. (required)
  • description: string. The description of the challenge. (required)
  • invitationCode: string. Invitation code where can be use from other users to join the challenge. (required)
  • templateId: string. The template which will be used for scoring stats in the challenge. For example if the template is set for Premier League (England) only successful predictions for Premier League matches will be counted in the challenge(required)
  • usersCanInviteUsers: boolean. Users can invite other users or only the administrator (the creator of the challenge) can do that. (required)
  • administrators: string[]. Will be there other administrators aswell with the creator of the challenge. (optional)
  • scoringStartsAt: string. The date from when the challenge will be scoring points. If not provided it will be set the current date. The format is (YYYY-MM-DD). Example value: 2023-12-12 (optional)

πŸ“˜

Example call:

const body = {
  name: "TEST",
  description: "TEST",
  invitationCode: "c1l3tqf",
  templateId: "7W8JCLPCg8f0nm9YfwZShf",
  usersCanInviteUsers: false,
};

sdk.challenges
  .issue(body, "PGdBkHS4cXeiFWhDBTnbx885gZ32")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Handle error
  });

Example result

{
   id: "4GJmMesXndaf3o5ijcpHIY",
   name: "TEST",
   description: "TEST",
   type: "ONE_VS_ONE",
   members: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
      "PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   banned: [],
   invites: [],
   administrators: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2"
   ],
   invitationCode: "c1l3tqf",
   templateId: "7W8JCLPCg8f0nm9YfwZShf",
   templateModel: TemplateModel,
   pastTemplates: null, // PastTemplateModel[]
   usersCanInviteUsers: false,
   scoringStartsAt: "2023-11-29",
   pinnedPosts: null
}

Update challenge

Method: update(challengeId, body)

Method updated the specified challenge. The following options are available for update:

  • name: string. The name of the challenge. (required)
  • description: string. The description of the challenge. (required)
  • invitationCode: string. Invitation code where can be use from other users to join the challenge. (required)
  • templateId: string. The template which will be used for scoring stats in the challenge. For example if the template is set for Premier League (England) only successful predictions for Premier League matches will be counted in the challenge(required)
  • usersCanInviteUsers: boolean. Users can invite other users or only the administrator (the creator of the challenge) can do that. (required)
  • administrators: string[]. Will be there other administrators aswell with the creator of the challenge. (required)
  • pinnedPosts: string[] . Post ids who are pinned for the challenge. Pinned posts can be maximum 3. (required)
  • scoringStartsAt: string. The date from when the challenge will be scoring points. If not provided it will be set the current date. The format is (YYYY-MM-DD). Example value: 2023-12-12 (required)

πŸ“˜

Example call:

const body = {
  name: "UPDATE",
  description: "UPDATE",
  invitationCode: "c1l3tqf",
  templateId: "1zUfS8hzE75MYaR29HRKyr",
  usersCanInviteUsers: false,
  administrators: ["Y44CxUzkpHdypYxcVVlwIQiLNtD2", "PGdBkHS4cXeiFWhDBTnbx885gZ32"],
  pinnedPosts: [],
  scoringStartsAt: "2023-11-29",
};

sdk.challenges
  .update("4GJmMesXndaf3o5ijcpHIY", body)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Handle error
  });

Example result

{
   id: "4GJmMesXndaf3o5ijcpHIY",
   name: "UPDATE",
   description: "UPDATE",
   type: "ONE_VS_ONE",
   members: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
     	"PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   banned: [],
   invites: [],
   administrators: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
     	"PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   invitationCode: "c1l3tqf",
   templateId: "1zUfS8hzE75MYaR29HRKyr",
   templateModel: TemplateModel,
   pastTemplates: [
     {
       id: "1zUfS8hzE75MYaR29HRKyr",
       name: "old template name",
       model: TemplateModel
     }
   ],
   usersCanInviteUsers: true,
   scoringStartsAt: "2023-11-29",
   pinnedPosts: []
}

Delete challenge

Method: delete(challengeId)

Method deletes the specified challenge.

πŸ“˜

Example call:

sdk.challenges
  .delete("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

true

Update challenge's template

Method: updateTemplate(challengeId, newTemplateId, oldTemplateName)

Method updates the specified challenge's template.

N.B. If new template ID exisits in past templates it will be removed from past templates.

N.B.2 Challenge admin can't set same past template names for different past templates.

πŸ“˜

Example call:

const newTemplateId = "7W8JCLPCg8f0nm9YfwZShf";
const oldTemplateName = "old template name";
sdk.challenges
  .updateTemplate("4GJmMesXndaf3o5ijcpHIY", newTemplateId, oldTemplateName)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Handle error
  });

Example result

{
   id: "4GJmMesXndaf3o5ijcpHIY",
   name: "UPDATE",
   description: "UPDATE",
   type: "ONE_VS_ONE",
   members: [
     "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
     "PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   banned: [],
   invites: [],
   administrators: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
      "PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   invitationCode: "c1l3tqf",
   templateId: "7W8JCLPCg8f0nm9YfwZShf",
   templateModel: TemplateModel,
   pastTemplates: [
     {
       id: "1zUfS8hzE75MYaR29HRKyr",
       name: "old template name",
       model: TemplateModel
     }
   ],
   usersCanInviteUsers: true,
   scoringStartsAt: "2023-11-29",
   pinnedPosts: []
}

Moderate post in a challenge

Method: moderatePost(postId, moderationReason)

Method moderates the post from Challenge's discussion with the specified moderation reason.

πŸ“˜

Example call:

sdk.challenges
  .moderatePost("postId", "SPAM")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  id: "postId",
  userId: "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
  discussionId: "discussionId",
  content: "Content is updated!",
  repliesCount: 0,
  replyId: "postId",
  reactions: [],
  reactionsCount: 0,
  reports: [],
  reportsCount: 0,
  versions: [
    {
      content: "New awesome post!",
      updateAt: "2023-12-11T11:58:47Z"
    }
  ],
  privatePost: false,
  deleted: false,
  deletedAt: null,
  deletedBy: null,
  moderated: true,
  moderatedAt: "2023-12-11T11:58:47Z",
  moderatedBy: "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
  moderatedReason: "SPAM",
  createdAt: "2023-12-11T11:58:47Z",
  updatedAt: "2023-12-11T12:58:47Z"
}

Challenges related operations

Get challenge by ID

Method: getById(challengeId, disableCache?)

Method returns challenge details info.

The response from API is cached for 1 hour. With disableCache argument you can avoid cached response.

πŸ“˜

Example call:

sdk.challenges
  .getById("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Handle error
  });

Example result

{
   id: "4GJmMesXndaf3o5ijcpHIY",
   name: "UPDATE",
   description: "UPDATE",
   type: "ONE_VS_ONE",
   members: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
    	"PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   banned: [],
   invites: [],
   administrators: [
      "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
    	"PGdBkHS4cXeiFWhDBTnbx885gZ32"
   ],
   invitationCode: "c1l3tqf",
   templateId: "1zUfS8hzE75MYaR29HRKyr",
   templateModel: TemplateModel,
   pastTemplates: [
     {
       id: "1zUfS8hzE75MYaR29HRKyr",
       name: "old template name",
       model: TemplateModel
     }
   ],
   usersCanInviteUsers: true,
   scoringStartsAt: "2023-11-29",
   pinnedPosts: null
}

Get user's challenges rankings

Method: getMyChallenges(filters?)

Method returns all challenges that user is member of and his results (points and position for each challenge) .

The following options are available for filters:

  • limit: number. Determines how many items per page there will be.
  • page: number. The number of the page.
  • challengeId: string. Filter the response to see only the specified challenge.
  • templateId: string. Filter the response to see only the specified template.
  • sortOrder: string. Determines the sort order - asc or desc

πŸ“˜

Example call:

sdk.challenges
  .getMyChallenges()
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

const filters = {
  limit: 1,
  page: 2,
  challengeId: "4GJmMesXndaf3o5ijcpHIY",
  templateId: "1zUfS8hzE75MYaR29HRKyr",
  sortOrder: "desc"
};

sdk.challenges
  .getMyChallenges(filters)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  meta: {
    pagination: {
      currentPage: 2,
      itemsPerPage: 1,
      numberOfPages: 3,
      totalItems: 3
    }
  },
  data: [
    {
      challengeId: "4GJmMesXndaf3o5ijcpHIY",
      challengeModel: PrivateLeagueModel,
      templateId: "1zUfS8hzE75MYaR29HRKyr",
      templateModel: TemplateModel,
      position: 1,
      points: 100,
      type: "challenge"
    }
  ]
}

Get reported posts in a challenge

Method: getReportedPosts(challengeId, filters?)

Method returns all reported posts in the specified challenge.

The following options are available for filters:

  • limit: number. Determines how many items per page there will be.
  • startAfter: string. The ID after which the posts should be listed. To be used in the context of infinite scroll/pagination.
  • reportsCount: number. Will return all posts who are reported with count greater of reportsCount filter param.

πŸ“˜

Example call:

sdk.challenges
  .getReportedPosts("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

const filters = {
  limit: 1,
  startAfter: "postId",
  reportsCount: 1,
};

sdk.challenges
  .getReportedPosts("4GJmMesXndaf3o5ijcpHIY", 4GJmMesXndaf3o5ijcpHIY)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  meta: {
    pagination: {
      totalItems: 1,
      nextPageStartsAfter: "postId",
      lastCommentCreateTimestamp: "2023-12-11T11:58:47Z"
    }
  },
  data: [
    {
      id: "postId",
      userId: "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
      discussionId: "4GJmMesXndaf3o5ijcpHIY",
      content: "Content is updated!",
      repliesCount: 0,
      replyId: "postId",
      reactions: [],
      reactionsCount: 0,
      reports: [
        {
          userId: "1",
          reason: "SPAM",
          reasonDetails: null
        },
        {
          userId: "2",
          reason: "AD",
          reasonDetails: null
        },
      ],
      reportsCount: 2,
      versions: [
        {
          content: "New awesome post!",
          updateAt: "2023-12-11T11:58:47Z"
        }
      ],
      privatePost: false,
      deleted: false,
      deletedAt: null,
      deletedBy: null,
      moderated: true,
      moderatedAt: "2023-12-11T11:58:47Z",
      moderatedBy: "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
      moderatedReason: "SPAM",
      createdAt: "2023-12-11T11:58:47Z",
      updatedAt: "2023-12-11T12:58:47Z"
    }
  ]
}

Get predictions for a challenge

Method: getPredictions(challengeId, filters?)

Method returns all user's own predictions for the specified challenge.

The following options are available for filters:

  • limit: number. Determines how many items per page there will be.
    N.B. The maximum limit is 20.
  • page: number. The number of the page.
  • profileIds: string[]. Will return all predictions for the specified profile ids.

πŸ“˜

Example call:

sdk.challenges
  .getPredictions("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

const filters = {
  limit: 1,
  page: 2,
  profileIds: ["Y44CxUzkpHdypYxcVVlwIQiLNtD2"],
};

sdk.challenges
  .getPredictions("4GJmMesXndaf3o5ijcpHIY", filters)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  meta: {
    pagination: {
      currentPage: 2,
      itemsPerPage: 1,
      numberOfPages: 3,
      totalItems: 3
    }
  },
  data: [
    {
      predictionId: "GSGUDDW5xVNSo7I0ujVbsNBoeMz2_p_OVER_GOALS_fb:m:806686519",
      predictionModel: PredictionResponseModel,
      profileId: "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
      profileModel: ProfileModel,
    }
  ]
}

Challenges membership operations

Accept an invitation to challenge

Method: accept(challengeId)

Method accepts the invitation to challenge.

πŸ“˜

Example call:

sdk.challenges
  .accept("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  profileId: "PGdBkHS4cXeiFWhDBTnbx885gZ32",
  profileModel: ProfileModel,
  leagueId: "4GJmMesXndaf3o5ijcpHIY",
  leagueModel: PrivateLeagueModel,
  message: "User joined challenge",
}

Reject an invitation to challenge

Method: reject(challengeId)

Method rejects an invitation to challenge.

πŸ“˜

Example call:

sdk.challenges
  .reject("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  profileId: "PGdBkHS4cXeiFWhDBTnbx885gZ32",
  profileModel: ProfileModel,
  leagueId: "4GJmMesXndaf3o5ijcpHIY",
  leagueModel: null,
  message: "User rejected to join challenge",
}

Leave challenge

Method: leave(challengeId)

Method leaves the challenge.

πŸ“˜

Example call:

sdk.challenges
  .leave("4GJmMesXndaf3o5ijcpHIY")
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

["PGdBkHS4cXeiFWhDBTnbx885gZ32"]

Get challenge invitations

Method: getInvitations(filters?)

Method returns all challenges that the user has been invited.

The following options are available for filters:

  • limit: number. Determines how many items per page there will be.
  • startAfter: string. The ID after which the challenges should be listed. To be used in the context of infinite scroll/pagination

πŸ“˜

Example call:

sdk.challenges
  .getInvitations()
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

const filters = {
  limit: 1,
  startAfter: "4GJmMesXndaf3o5ijcpHIY"
};

sdk.challenges
  .getInvitations(filters)
  .then((response) => {
    // Handle response
  })
  .catch((error) => {
    // Throws error message
  });

Example result

{
  meta: {
    pagination: {
      itemsPerPage: 1,
      nextPageStartsAfter: "4GJmMesXndaf3o5ijcpHIY",
    }
  },
  data: [
    {
       id: "4GJmMesXndaf3o5ijcpHIY",
       name: "UPDATE",
       description: "UPDATE",
       type: "ONE_VS_ONE",
       members: [
          "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
          "PGdBkHS4cXeiFWhDBTnbx885gZ32"
       ],
       banned: [],
       invites: [],
       administrators: [
          "Y44CxUzkpHdypYxcVVlwIQiLNtD2",
          "PGdBkHS4cXeiFWhDBTnbx885gZ32"
       ],
       invitationCode: "c1l3tqf",
       templateId: "1zUfS8hzE75MYaR29HRKyr",
       templateModel: TemplateModel,
       pastTemplates: [
         {
           id: "1zUfS8hzE75MYaR29HRKyr",
           name: "old template name",
           model: TemplateModel
         }
       ],
       usersCanInviteUsers: true,
       scoringStartsAt: "2023-11-29",
       pinnedPosts: null
    }
  ]
}