예제 #1
0
파일: board.go 프로젝트: nerdzeu/nerdz-api
// projectPostlistConditions returns the same pointer passed as first argumet with the project conditions setted
func projectPostlistConditions(query *igor.Database, user *User) *igor.Database {
	var projectPost ProjectPost
	projectPosts := projectPost.TableName()
	users := new(User).TableName()
	projects := new(Project).TableName()
	members := new(ProjectMember).TableName()
	owners := new(ProjectOwner).TableName()

	query = query.Joins("JOIN " + users + " ON " + users + ".counter = " + projectPosts + ".from " +
		"JOIN " + projects + " ON " + projects + ".counter = " + projectPosts + ".to " +
		"JOIN " + owners + " ON " + owners + ".to = " + projectPosts + ".to")

	query = query.Where(`(`+projectPosts+`."from" NOT IN (SELECT "to" FROM blacklist WHERE "from" = ?))`, user.Counter)
	return query.Where("( visible IS TRUE OR "+owners+`.from = ? OR ( ? IN (SELECT "from" FROM `+members+` WHERE "to" = `+projectPosts+`.to) ) )`, user.Counter, user.Counter)
}
예제 #2
0
파일: pm.go 프로젝트: nerdzeu/nerdz-api
// pmsQueryBuilder returns the same pointer passed as first argument, with new specified options setted
func pmsQueryBuilder(query *igor.Database, options PmsOptions) *igor.Database {
	query = query.Limit(int(AtMostPms(uint64(options.N)))).Order("pmid DESC")
	if options.Older != 0 && options.Newer != 0 {
		query = query.Where("pmid BETWEEN ? AND ?", options.Newer, options.Older)
	} else if options.Older != 0 {
		query = query.Where("pmid < ?", options.Older)
	} else if options.Newer != 0 {
		query = query.Where("pmid > ?", options.Newer)
	}
	return query
}
예제 #3
0
파일: board.go 프로젝트: nerdzeu/nerdz-api
// postlistQueryBuilder returns the same pointer passed as first argument, with new specified options setted
func commentlistQueryBuilder(query *igor.Database, options CommentlistOptions) *igor.Database {
	query = query.Limit(int(AtMostComments(uint64(options.N)))).Order("hcid DESC")

	if options.Older != 0 && options.Newer != 0 {
		query = query.Where("hcid BETWEEN ? AND ?", options.Newer, options.Older)
	} else if options.Older != 0 {
		query = query.Where("hcid < ?", options.Older)
	} else if options.Newer != 0 {
		query = query.Where("hcid > ?", options.Newer)
	}

	return query

}
예제 #4
0
파일: board.go 프로젝트: nerdzeu/nerdz-api
// postlistQueryBuilder returns the same pointer passed as first argument, with new specified options setted
// If the user parameter is present, it's intentend to be the user browsing the website.
// So it will be used to fetch the following list -> so we can easily find the posts on a bord/project/home/ecc made by the users that "user" is following
func postlistQueryBuilder(query *igor.Database, options PostlistOptions, user ...*User) *igor.Database {
	query = query.Limit(int(AtMostPosts(uint64(options.N))))

	userOK := len(user) == 1 && user[0] != nil
	followersTable := UserFollower{}.TableName()

	if !options.Followers && options.Following && userOK { // from following + me
		query = query.Where(`"from" IN (SELECT "to" FROM `+followersTable+` WHERE "from" = ? UNION ALL SELECT ?)`, user[0].Counter, user[0].Counter)
	} else if !options.Following && options.Followers && userOK { //from followers + me
		query = query.Where(`"from" IN (SELECT "from" FROM `+followersTable+` WHERE "to" = ? UNION ALL SELECT ?)`, user[0].Counter, user[0].Counter)
	} else if options.Following && options.Followers && userOK { //from friends + me
		query = query.Where(`"from" IN (SELECT ? UNION ALL (SELECT "to" FROM (SELECT "to" FROM `+
			followersTable+
			` WHERE "from" = ?) AS f INNER JOIN (SELECT "from" FROM `+
			followersTable+
			` WHERE "to" = ?) AS e on f.to = e.from))`, user[0].Counter, user[0].Counter, user[0].Counter)
	}

	if options.Language != "" {
		query = query.Where(options.Model.TableName()+".lang = ?", options.Language)
	}

	messageTpl := Message{}.TableName()

	if options.Older != 0 && options.Newer != 0 {
		if options.Model.TableName() == messageTpl {
			query = query.Where(
				`"time" BETWEEN
				(SELECT "time" FROM `+options.NewerModel.TableName()+` WHERE hpid = ?)
				AND
				(SELECT "time" FROM `+options.OlderModel.TableName()+` WHERE hpid = ?)
				AND hpid NOT IN (?)`, options.Newer, options.Older, []uint64{options.Newer, options.Older})
		} else {
			query = query.Where("hpid BETWEEN ? AND ?", options.Newer, options.Older)
		}
	} else if options.Older != 0 {
		if options.Model.TableName() == messageTpl {
			query = query.Where(
				`"time" <= (
					SELECT "time" FROM `+options.OlderModel.TableName()+` WHERE hpid = ?
				) AND hpid <> ?`, options.Older, options.Older)
		} else {
			query = query.Where("hpid < ?", options.Older)
		}
	} else if options.Newer != 0 {
		if options.Model.TableName() == messageTpl {
			query = query.Where(
				`"time" >= (
					SELECT "time" FROM `+options.NewerModel.TableName()+` WHERE hpid = ?
				) AND hpid <> ?`, options.Newer, options.Newer)
		} else {
			query = query.Where("hpid > ?", options.Newer)
		}
	}

	return query
}